4

我的索引中有以下数据,

{
    "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 寻找全文搜索,有什么方法可以使用给定的数据结构,我应该使这个查询工作。

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

4

1 回答 1

12

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

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

更新

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')

复杂类型的文档在这里

于 2017-09-26T16:29:21.393 回答