【问题标题】:search.in function not return correct resultssearch.in 函数没有返回正确的结果
【发布时间】:2021-03-08 09:59:13
【问题描述】:

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

我的初始查询是:

search=ski

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

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

初始查询返回一堆结果,其中许多在类别字段中有Ski Resorts。第二个查询不返回任何结果。

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

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

【问题讨论】:

    标签: azure-cognitive-search


    【解决方案1】:

    不出所料,这是操作员的错误,但我确实学到了很多东西。

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

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

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

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

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

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

    现在我的过滤器表达式似乎可以工作了!

    总的来说,有两个关键变化:

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

    供参考,OData Collection operators in Azure Cognitive Search

    谢谢指点!

    【讨论】:

      【解决方案2】:

      我使用酒店样本数据集建立了一个索引来测试这一点。在该数据集中,有一个具有可搜索属性的等效示例,Category,其中包含“Suite”。同样,“套件”一词出现在可搜索的 描述 属性中。

      我的第一个示例产生了 20 个匹配项,包括将 Category 设置为“Suite”的条目。

      search=suite
      

      然后我添加了 search.in。没想到,我得到了 0 次点击。

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

      经过一些试验,我尝试切换到大写的“Suite”,但得到了 1 次点击。

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

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

      【讨论】:

      • 可过滤字段不进行分析;这就是 search 和 $filter 之间的根本区别。 $filter 表达式,包括 search.in,总是在寻找完全匹配(search.ismatch/ismatchscoring 除外)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2014-09-13
      • 2012-08-01
      • 2014-05-10
      • 1970-01-01
      相关资源
      最近更新 更多