【问题标题】:How to filter an array in Azure Search如何在 Azure 搜索中筛选数组
【发布时间】:2021-02-06 01:40:27
【问题描述】:

我的索引中有以下数据,

{
    "name" : "The 100",
    "lists" : [
                    "2c8540ee-85df-4f1a-b35f-00124e1d3c4a;Bellamy",
                    "2c8540ee-85df-4f1a-b35f-00155c40f11c;Pike",
                    "2c8540ee-85df-4f1a-b35f-00155c02e581;Clark"
              ]
    
}

我必须获取列表中包含 Pike 的所有文档。

虽然完整的搜索查询适用于 Any,但我无法获得包含的工作。

$filter=lists/any(t: t eq '2c8540ee-85df-4f1a-b35f-00155c40f11c;Pike')

但我不确定如何仅使用 Pike 进行搜索。

$filter=lists/any(t: t eq 'Pike')

我猜 eq 会寻找全文搜索,有什么方法可以使用给定的数据结构让这个查询工作。

目前字段列表没有可搜索的属性,只有可过滤的属性。

【问题讨论】:

    标签: azure-cognitive-search azure-search-.net-sdk


    【解决方案1】:

    eq 运算符查找精确的、区分大小写的匹配项。这就是为什么它不匹配'Pike'。您需要构建索引,以便可以轻松找到像“Pike”这样的术语。您可以通过以下两种方式之一完成此操作:

    1. 在索引文档时将 GUID 与名称分开。因此,与其将"2c8540ee-85df-4f1a-b35f-00155c40f11c;Pike" 索引为单个字符串,不如将它们索引为同一数组中的单独字符串,或者如果您需要按位置关联它们,也可以将它们索引为两个不同的集合字段(一个用于 GUID,一个用于名称)。
    2. 如果字段是searchable,您可以在过滤器中使用new search.ismatch function。假设该字段使用标准分析器,全文搜索将word-break 分号,因此您应该能够仅搜索“Pike”并获得匹配。语法如下所示:$filter=search.ismatch('Pike', 'lists')(如果您的过滤器只需要查找“Pike”,您可以在搜索 API 中使用 searchsearchFields 参数而不是 $filter。)如果“列表”字段尚未可搜索,您需要添加一个新字段并重新索引“列表”值,或者使用新字段定义从头开始重新创建索引。

    更新

    API 版本 2019-05-06 及更高版本中提供了解决此类问题的新方法。您现在可以使用复杂类型来表示结构化数据,包括在集合中。对于原始示例,您可以像这样构造数据:

    {
    "name" : "The 100",
    "lists" : [
                    { "id": "2c8540ee-85df-4f1a-b35f-00124e1d3c4a", "name": "Bellamy" },
                    { "id": "2c8540ee-85df-4f1a-b35f-00155c40f11c", "name": "Pike" },
                    { "id": "2c8540ee-85df-4f1a-b35f-00155c02e581", "name": "Clark" }
              ]
    }
    

    然后像这样直接查询name子字段:

    $filter=lists/any(l: l/name eq 'Pike')
    

    复杂类型的文档是here

    【讨论】:

    • 谢谢我将该字段设为可搜索并使用了 $filter ... 第一种方法在应用程序代码中有很多残留影响。谢谢
    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2021-11-02
    • 2019-12-01
    • 2021-06-01
    相关资源
    最近更新 更多