如何在Azure搜索中过滤数组

时间:2017-09-26 09:08:39

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

我的索引中有以下数据,

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

}

我必须得到列表中有Pike的所有文件。

虽然完整搜索查询适用于任何我无法获得包含工作。

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

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

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

我想eq会查找全文搜索,有没有办法使用给定的数据结构我应该让这个查询工作。

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

1 个答案:

答案 0 :(得分:5)

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”,则可以将searchsearchFields参数用于Search API,而不是{{ 1)}。)如果“列表”字段尚不可搜索,则需要添加新字段并重新索引“列表”值,或者使用新字段定义从头开始重新创建索引。 / LI>