【问题标题】:Azure Search Select within nested collections嵌套集合中的 Azure 搜索选择
【发布时间】:2020-09-06 20:45:50
【问题描述】:

目前,我们正在使用 Azure Cosmos Db,但考虑使用 Azure 搜索,因为它能够处理模糊搜索、拼写错误、同义词映射等。但由于 Azure 搜索将成为我们的主要搜索,我们最终将索引嵌套集合也是。

我们当前的架构如下:

{
  "id": "0010010011001",
  "partitionKey": "001001001",
  ...
  ...
  "items": [
    {
      "id": 1,
      "name": "abc",
      “category”: “A”,
      “subItems”: [
         {
              "id": 1,
              "level": "1",
              “rank”: “1”,
              “description”: “abc”
         },
         {
              "id": 2,
              "level": "1",
              “rank”: “2”,
              “description”: “def”
         },
         {
              "id": 3,
              "level": "2",
              “rank”: “3”,
              “description”: “xyz”
         }
      ]
    },
    {
      "id": 2,
      "name": "def",
      “category”: “A” ,
      “subItems”: [
         ….
      ]
    },
    {
      "id": 3,
      "name": "xyz",
      “category”: “B” ,
      “subItems”: [
         ….
      ]
    }
  ]
}

我们的要求是我们将拥有三个过滤器,名称(模糊搜索)、类别和排名。而且我们必须只从文件中选择名称/类别匹配的那些项目,而且我们还必须只选择项目中排名匹配的那些子项目。在查询 Cosmos 时,我正在对项和子项进行连接查询,但不确定如何在此处查询和选择元素。

【问题讨论】:

    标签: azure-cosmosdb azure-cognitive-search


    【解决方案1】:

    我是 Azure 认知搜索的工程师。我将在下面重申您的要求和我的一些假设(因为问题有点不清楚)只是为了确认我已经正确解释了它们:

    假设:

    要求:

    • 模糊搜索“名称”字段(必须是可搜索的)
    • 过滤与“类别”字段匹配的搜索结果(必须是可过滤的)
    • 过滤与“子项”字段中“排名”字段匹配的搜索结果(排名必须是可过滤的)
    • 选择子项(丢弃顶级 ID、名称、类别等 - 您可以通过选择更多感兴趣的字段轻松保留它们)

    解决方案

    使用这个查询:

    searchFields=name&search=<string>~&$filter=category eq '<string2>' AND subItems/all(subItem: subItem/rank eq '<string3>')&select=items/subItems
    

    参考文档

    如果您想了解有关在 Azure 认知搜索中对复杂数据类型建模的更多信息,我在下面提供了一些优秀文档的链接: https://docs.microsoft.com/en-us/azure/search/search-howto-complex-data-types

    【讨论】:

    • 让我在这里再澄清一个错误信息。这完全是一个文档,其中包含一些字段和项目,它们是 Compex 类型的集合。 Items 本身有一些字段,然后是 SubItems,它又是一个复杂类型的集合。您的查询几乎是正确的。唯一的问题是,您在根级别的 $filters 中提到了类别,但在我的情况下,类别位于 Items 下,因此我们需要像 subItems->rank 一样过滤类别。我的问题是我们只需要选择匹配过滤器的项目和子项目。我认为 $select=items/subItems 会选择所有子项。
    • 听起来我们可以调整过滤器语句以按照与项目/排名相同的模式过滤项目/类别。您能否扩展您对“仅选择匹配过滤器的项目和子项目”的第二个关注?使用上面的查询,过滤器将生成一个符合条件的索引字段列表,而 select 将仅从过滤列表中选择 subItems 值,这听起来像是所需的输出。鉴于原始问题中提供的索引架构形状,您能否提供一个所需输出的简短示例?
    • 对不起,我忘记了这个。我们在您分享的链接中有一个很好的例子docs.microsoft.com/en-us/azure/search/…你能帮我写一个查询或如何获得所需的结果吗?输入:城市、州、BaseRate 说 $100 选择:HotelId、名称、描述、标签、地址、房间描述、房间 BaseRate。过滤器:仅 BaseRate 小于或等于 Input rate 且 Address City 和 State 与输入值匹配的房间。在这个例子中,它应该只从 Rooms 中选择第一个房间。
    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2023-03-20
    • 2018-06-23
    • 1970-01-01
    • 2015-06-04
    • 2013-03-26
    • 2011-09-14
    相关资源
    最近更新 更多