gpt4 book ai didi

sql-server - Azure 搜索返回父记录和子记录

转载 作者:行者123 更新时间:2023-12-03 16:32:26 24 4
gpt4 key购买 nike

我们的应用程序管理用户拥有的书籍,其中一本书包含多个文档(pdf、word 文档等)。主页列出了用户的所有书籍,并带有一个用于加载下 10 本书的分页按钮。然后,当用户点击一本书时,它会在新屏幕中打开并列出该书的所有文档。

到目前为止,我们一直在使用 WCF/ Entity Framework 来检索主页上显示的所有书籍,然后使用 Azure 搜索(连接到 sql View )来获取一本书打开时的文档,这与分页配合得很好和排序。

现在,虽然我们还想从 Azure 搜索中获取用户的所有书籍列表,因此我们创建了一个新表来保存书籍和文档数据,每个文档一行,这意味着重复父书籍名称和书籍 ID每行。

AzureSearchTable

我们的 azure 搜索索引现在指向此表,我必须弄清楚如何通过分页和可能的排序为用户检索书籍。问题是我需要对书籍进行不同的选择,但 azure 搜索不会进行不同的选择,而且我不知道一本书可能有多少文档,所以我不能将 Top 参数设置为 10。一本书可能有30 或 40 个文档,这意味着前 40 行可能仅用于一本书。

我尝试在书籍 id 上使用一个 facet 哪种类型的作品并为我提供每本书的 id 和文档数量,但我似乎无法为 facet 指定排序顺序 - 顺序与我为查询设置的顺序 (BookId)。我也不知道如何使用 facet 获取所有书籍 - 我可以在 facet 上设置一个 count 属性,但我不知道用户将拥有多少本书。

我们的架构师说我应该获取所有行(可能有数千行)并在 C# 代码中过滤它们以获得 10 本书。不过,这对我来说似乎效率很低,而且感觉不对。

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

  • 我应该为书籍和文档数据(使用单独的表格)使用单独的 azure 搜索索引吗?
  • 如何在不知道每本书有多少文档的情况下从该表中返回前 n 本书?
  • 我可以使用 C# sdk 为构面指定排序顺序吗? (我认为通过 rest API 是可能的)
  • 如何获取一个 facet 来为用户归还所有图书?

最佳答案

这里有一些想法:

项目符号 #1 答案:

如果您的意图是能够根据对 DocumentName 的搜索返回图书列表,那么您可能希望将它们保存在同一个索引中。您的架构师关于在 C# 中处理结果的想法可能并不像您想象的那么糟糕。您可以在 LINQ 中执行 GroupBy。 Azure 搜索查询很快,LINQ 查询也很快。特别是如果发出 Azure 搜索查询的机器是 Azure Web/应用程序服务器并且位于同一区域(数据中​​心内通信)。我已经将这种方法与 Suggestions API 一起用于自动完成功能,该功能需要在用户键入时快速(在几百毫秒内)返回结果。我想说至少值得一试,看看您在最大和典型数据集上获得了什么样的性能。

但是,如果这对您不起作用,请考虑重新构建您的索引架构,使 DocumentName 的类型为 Collection(Edm.String)。你看起来像这样:

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

现在,如果您需要允许用户获取有关他们选择的特定书籍的文档的详细信息,您只需调用数据库来获取书籍详细信息即可。或者,您可以在此处为具有更详细文档信息的文档创建另一个 Azure 搜索索引。但此时在用户工作流程中,除非您要提供对那本书的文档的另一种全文搜索,否则您可能只想坚持使用按 ID 获取类型的数据库调用。

项目符号 #2 答案:

对于文档计数,您可以创建另一个字段(如上所示)并对其进行排序/过滤/构面。

项目符号 #3 答案:

SDK 和 Azure 搜索 REST API 均未提供对构面本身进行排序的方法,但请记住,您最终可以完全控制要如何在 UI 中显示构面信息。如果 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>

这是假设当前经过身份验证的用户应该只能看到他们自己的书。但是,如果您希望能够在一个方面拥有一个用户列表以过滤其中的一个或多个用户,那么这将需要对索引模式进行另一次重构,以便在书籍文档上有一个名为类似的新字段“users”是用户名的 Collection(Edm.String)。像这样:

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

关于sql-server - Azure 搜索返回父记录和子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43823312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com