Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 索引设计|多个索引与具有多个数据源的1个索引的性能_C#_Saas_Azure Cognitive Search - Fatal编程技术网

C# 索引设计|多个索引与具有多个数据源的1个索引的性能

C# 索引设计|多个索引与具有多个数据源的1个索引的性能,c#,saas,azure-cognitive-search,C#,Saas,Azure Cognitive Search,实现Azure搜索。目前,我们有两个相互关联的表(关系数据库),我们希望将它们用作索引 实现这一点的最佳方式是什么 点击两个索引(每个表一个),在 结果生成代码 两个数据源(每个表一个),两个索引器指向同一个索引 使用SQL视图,在其中执行联接 我使用第一个选项作为示例,但是我只得到了3条记录的200到400 ms之间的结果-使用Postman。业务限额约为20个结果。我关心的是,当我开始添加更多索引,然后在代码中执行它们之间的连接时,可能无法执行 比如说主表,有4个或5个与之相关的表(PK-F

实现Azure搜索。目前,我们有两个相互关联的表(关系数据库),我们希望将它们用作索引

实现这一点的最佳方式是什么

  • 点击两个索引(每个表一个),在 结果生成代码
  • 两个数据源(每个表一个),两个索引器指向同一个索引
  • 使用SQL视图,在其中执行联接
  • 我使用第一个选项作为示例,但是我只得到了3条记录的200到400 ms之间的结果-使用Postman。业务限额约为20个结果。我关心的是,当我开始添加更多索引,然后在代码中执行它们之间的连接时,可能无法执行

    比如说主表,有4个或5个与之相关的表(PK-FK关系),我必须为每个表创建一个索引。可以吗?这会导致性能问题吗?我应该试试第二种还是第三种选择

    请你扩大你的答案好吗。
    谢谢

    我建议您看看Azure Search新的复杂类型功能。对于1:N关系,可以将相关记录放在索引的集合(Edm.ComplexType)字段中。有关复杂类型的更多信息:

    就索引器而言,我建议您在SQL中创建一个视图,将当前行的相关记录拉入JSON格式的文本字段中。然后将数据源/索引器指向该视图,并将JSON字段中的字段映射到索引中的复杂集合字段中

    SQL实际上使定义视图变得非常简单。例如,对于Azure Search Hotels示例架构,它将是:

    SELECT *, (SELECT *
        FROM dbo.Rooms$
        WHERE dbo.Rooms$.HotelID = dbo.Hotels$.HotelID FOR JSON AUTO) AS Rooms
    FROM dbo.Hotels$
    
    希望这有帮助

    迈克·卡特

    Azure搜索产品团队

    嗨,Guiseppe,你能澄清一下你到底想优化什么吗?它是指在索引中获取数据实际需要多长时间的延迟,还是指查询所需记录并跨传递给结果的记录执行所需连接的延迟?另外,您将在这些表之间进行的连接是否都在同一字段上,或者一些表在字段A上进行连接,而其他表在字段B上进行连接?您好,我正在寻找使用这两个表的信息设计/创建1或2个索引的最佳方法。(它们之间的关系是1对多)。但我更关心的是查询记录,而不是更新索引。关于加入的最后一个问题,我不确定我是否理解正确,但我认为他们总是在同一个领域加入。例如,PK为ID的表A将FK列为FK_表A的表B连接起来。谢谢另外,对于第二个选项,当两个数据源是SQL Azure DB表时,我找不到任何有关如何执行此操作的示例。您应该能够创建指向同一索引的两个索引器,只要将表的联接字段映射到索引的id字段,然后,连接将导致具有该id的所有文档都可以一次检索,这将避免您需要执行多个查询,从而有望减少总体查询延迟。然而,我不确定这在一对多的场景中如何工作。您希望映射与第一个表相关的数组中第二个表的每个结果吗?我最终设法让两个索引器朝着一个索引工作。但是是的,正如你所说,1对多的关系似乎不起作用。我尝试将索引字段创建为字符串集合,但在a运行索引时失败。您好,感谢您的回复。为了创建SQL视图,我必须实现水印策略,以便它能够跟踪最新的更改,对吗?另外,如果Hotel和Room是SQL表(1:N),我应该在哪里创建水印列?在这两个表中,该列是否也应该是SQL视图中select语句的一部分?还有一件事,我正在使用.NET SDK创建索引,在这种情况下,Collection(Edm.ComplexType)意味着Collection?如果您想在父表或子表中获取更改,那么“是”字段应该在这两个表中都有一个rowversion字段。您将在视图中显示较高的值,以确保索引器拾取更改。在.Net SDK中,您可以像处理.Net中的对象一样处理复杂类型。更多信息请查看示例:谢谢回复。我使用SQL视图根据HighWaterMark策略获取父表或子表中的更改。现在,使用相同的Hotel和Rooms示例(1:N关系),当删除一个房间时。处理子表中的行删除的最佳方法是什么?我是否应该强制父表的rowVersion列增加,以便它可以检测到更改?。要检测父表中的删除,我使用软删除策略,但我不确定如何处理子表中的删除,因为父表有一个子表行数组,就像当前在Hotel and Rooms示例中一样。