Azure搜索返回父母和子女记录



我们的应用程序管理由用户拥有的书籍,其中包含多个文档(PDF,Word Docs等(。主页列出了用用户的所有书籍,其中包含一个按钮,该按钮加载了接下来的10本书。然后,当用户单击一本书时,它将在新屏幕中打开并列出该书的所有文档。

到目前为止,我们一直在使用WCF/Entity框架检索主页上显示的所有书籍,然后在打开时获得Azure Search(连接到SQL视图(以获取一本书的文档,该文档在打开时可以很好地搭配使用。和排序。

现在,尽管我们也想从Azure搜索中获取用户的所有书籍列表,因此我们创建了一个新表来保存书籍和文档数据,但每个文档的一行表示父母的书名和书名ID,重复每行。

azuresearchtable

现在,我们的Azure搜索索引指向此表,我必须弄清楚如何为使用分页且可能对用户进行分类的用户检索书籍。问题是我需要对书籍进行独特的选择,但是Azure搜索并没有独特,我不知道书本可能拥有多少个文档,所以我不能将最高参数设置为10。30或40个文档,这意味着前40行可能只是一本书。

我试图在书ID上使用一个方面的作品,并给我每本书的文档ID和数量,但我似乎无法指定该方面的排序订单 - 订单不同于我为查询设置的订单(BookId(。我也不知道如何使用一个方面获取所有书籍 - 我可以在刻面上设置一个计数属性,但我不知道用户将拥有多少本书。

我们的建筑师说,我应该得到所有行(可能是数千个(,并在C#代码中过滤它们以获取10本书。

对我来说似乎很效率。

所以我不确定这是正确的方法。

  • 我应该有单独的书本和文档数据的Azure搜索指数(使用单独的表?
  • 我如何在不知道每本书有多少个文档的情况下从这张桌子上返回顶级书籍?
  • 我可以使用C#SDK指定构面的排序订单吗?(我认为可以通过REST API(
  • 如何获得一个方面来返回用户的所有书籍?

这里有一些想法:

子弹#1答案:

如果您的目的是能够根据搜索DocumbName返回书籍列表,那么您可能希望将它们保持在相同的索引中。您的建筑师对在C#中处理结果的想法可能并不像您想象的那么糟糕。您可以在LINQ中进行集体比。Azure搜索查询很快,LINQ查询也很快。特别是如果发行Azure搜索查询的机器是Azure Web/App Server,并且位于同一区域(Intra Intra IntraCenter通信(。即使使用建议API的自动完成功能,我也使用了这种方法,该功能需要在用户键入时快速返回结果(在几百毫秒内(。我会说,至少值得一试,以查看最大和典型的数据集的表现。

但是,如果那对您不起作用,请考虑重新结构您的索引模式,以便DocumbName是类型集合(EDM.String(。您看起来像这样:

{
    id: 20663,
    userId: 1,
    bookId: 2144,
    bookName: "ber",
    documentName: ["asdasd", "_318-1991.jpg", "wallhaven-13081.png", etc...],
    documentCount: 7
}

现在,如果您需要允许用户获得有关他们选择的特定书籍文档的详细信息,则可以使用数据库调用来获取书籍详细信息。另外,这就是您可以为文档创建另一个Azure搜索索引的地方,该文档具有更详细的文档信息。但是,在用户工作流程中的这一点上,除非您要在该特定书的文档中提供另一个全文搜索,否则您可能只想坚持使用一种逐个ID的DB调用。<<<<<<<<<</p>

子弹#2答案:

对于文档计数,您只需创建另一个字段(如上所示(,然后在其上进行排序/滤镜/facet。

子弹#3答案:

SDK和Azure搜索REST API均未提供订购各个方面的方法,但请记住,您最终可以完全控制您如何在UI中显示Facet信息。如果SDK不提供所需的内容,则可以在应用程序中创建一个简单的查找类,以根据需要订购您的饰面。这样的东西:

public class FacetDefinition
{
    public string FacetName { get; set; }
    public int FacetOrder { get; set; }
}
...
var myFacetDefinitions = new List<FacetDefinition>();
myFacetDefinitions.Add(new FacetDefinition() { FacetName = "SomeNameThatMatchesTheFacetThatAzureSearchSendsBack", FacetOrder = 1});
myFacetDefinitions.Add(new FacetDefinition() { FacetName = "SomeOtherNameThatMatchesTheFacetThatAzureSearchSendsBack", FacetOrder = 2});
...

子弹#4答案:

要返回特定用户的所有书籍,您可以添加这样的过滤器表达式:

userId eq <put_authenticated_userid_here>

假设当前身份验证的用户只能看到自己的书籍。但是,如果您想能够在一个或多个方面列出一个或多个用户列表,那么这将需要对索引模式进行另一个重新结构,以便在书籍文档上拥有一个新字段,称为类似"用户"是用户名的集合(EDM.String(。这样:

{
    ...
    users: ["Luke Skywalker", "Han Solo", "Chewbacca", etc...]
    ...
}

最新更新