search.in 函数没有 return 正确的结果

search.in function not return correct results

我正在向我的索引提交一个基本查询,然后使用 returned 结果中的数据使用 $filter 参数和 search.in 函数进一步过滤该结果集。但是,当我应用过滤器时,它随后 returns 0 结果,而我期望它是 return 原始结果集的一个子集。我能够使用 Azure 搜索门户中的搜索资源管理器工具重现此问题。

我的初始查询是:

search=ski

...我的后续过滤器是...

search=ski&$filter=search.in(categories,'Ski Resorts','|')

初始查询 return 是一堆结果,其中许多在类别字段中有 Ski Resorts。第二个查询 return 没有结果。

在索引定义中,categories 字段定义为 Edm.String 字段,可搜索、可过滤、可检索和分面。它包含以逗号分隔的文档类别列表。我的目标是利用这些类别让用户进一步过滤结果集。

有人知道我是否错误地使用了 search.in 参数吗?我将尝试使用其他方法来实现我的结果,但很好奇这里可能不正确的地方。

我用酒店样本数据集建立了一个索引来测试这个。在该数据集中,有一个等效示例,其中包含 属性、Category,其中包含 'Suite'。同样,单词 'suite' 出现在可搜索的 Description 属性.

我的第一个示例产生了 20 个匹配项,包括类别设置为 'Suite' 的条目。

search=suite

然后我添加 search.in。出乎意料的是,我得到了0次点击。

search=suite&$filter=search.in(Category, 'suite', '|')

经过一些试验,我尝试切换为大写字母 'Suite',我得到了 1 个匹配。

search=suite&$filter=search.in(Category, 'Suite', '|')

所以,这似乎是一个区分大小写的问题。令人惊讶的是,许多内置分析器的定义都没有使用小写字母。问我怎么知道的...

毫不奇怪,这是操作错误,但我确实学到了很多东西。

首先,我的目标是允许用户过滤到他们想要的类别。我的索引字段可以包含多个值,我最初试图通过以下方式实现它:

$filter=search.in(categories,pipeDelimitedTags,'|')

其中 categories 字段包含以逗号分隔的类别标签列表。

但是,该表达式假定 categories 字段中只有一个值。

我更新了我的索引并添加了一个字符串集合并将我的查询表达式更新为:

$filter=categoriesCollection/any(c: search.in(c,pipeDelimitedTags,'|'))

现在我的过滤器表达式似乎起作用了!

总而言之,有两个关键变化:

  1. 将我的逗号分隔字符串复制到 Collection(Edm.String)
  2. 将 OData 集合 any 运算符与 search.in 函数一起使用

供参考,OData Collection operators in Azure Cognitive Search

谢谢指点!