【问题标题】:Match all documents excluding some terms using full Lucene syntax使用完整的 Lucene 语法匹配除某些术语之外的所有文档
【发布时间】:2020-10-27 00:56:21
【问题描述】:

我们服务的默认搜索网页使用* 完整的 Lucene 查询来匹配所有文档。这是在用户提供任何搜索词之前。我们想要从搜索结果中排除一些数据(在我们的例子中是测试数据)。

是否可以匹配所有文档但排除所有文档的子集?

例如,假设我们有一个“所有者”字段,并且我们想要排除具有“testA”和“testB”所有者的文档。以下查询似乎不适用于 match all 方法:

查询:search=* -owners:testA -owners:testB&queryType=full&$orderby=created desc 错误:“无法解析查询字符串。有关支持的语法,请参阅 https://aka.ms/azure-search-full-query。”

当搜索除* 之外的任何内容时,这种方法可以正常工作。例如:

查询:search=foo -owners:testA -owners:testB&queryType=full&$orderby=created desc 结果:(许多文件匹配)

我为此考虑过$filter 并使用$filter=filterableOwners/all(p: p ne 'testa' and p ne 'testb'),但这有以下缺点:

  • 必须使用可过滤字段重建索引
  • 无法使用分析器,因此必须通过小写值和过滤器表达式来实现不区分大小写

理想情况下,这可以仅使用带有 Lucene 查询文本的 search 查询参数来完成。

【问题讨论】:

    标签: azure-cognitive-search


    【解决方案1】:

    我找到了解决此问题的方法。如果您的文档中有一个始终有值的字段,您可以使用 .* 正则表达式来匹配该字段中的所有值,从而匹配所有文档。

    例如,假设packageId 字段对所有文档都有一个值。

    不正确(如原始问题中所述):

    Query:  search=* -owners:testA -owners:testB&queryType=full&$orderby=created desc
    

    正确:

    查询:search=packageId:/.*/ -owners:testA -owners:testB&queryType=full&$orderby=created desc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-10
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多