【问题标题】:Elasticsearch boolean query doesn't work with filterElasticsearch 布尔查询不适用于过滤器
【发布时间】:2021-10-27 03:43:19
【问题描述】:

我在 Elasticsearch 方面不是很强。我正在尝试在我的应用程序中设置搜索并遇到了一些奇怪的问题。我有两个文件:

{
  "title": "Second insight"
  "content": "Bla bla bla"
  "library": "workspace"
}
{
  "title": "Test source"
  "content": "Bla bla bla"
  "library": "workspace"
}

然后,我希望能够通过 titlecontent 等文本字段进行搜索,并对 library 等字段应用一些过滤器。我有一个问题:

{
    "query": {
      "bool": { 
        "should": [
          { "match": { "title": "insight" }}
        ],
        "filter": [
          {
            "term": {
              "library": "workspace"
            }
          }
        ]
      }
    }
}

尽管我明确定义titleinsight 匹配,但上面的查询返回两个 文档,而不仅仅是第一个。

如果我删除 filter 块:

{
    "query": {
      "bool": { 
        "should": [
          { "match": { "title": "insight" }}
        ]
      }
    }
}

查询返回正确的结果。

然后,我也尝试进行部分搜索。由于某些原因,下面的查询使用ins 而不是insight 不起作用,因此,它返回空列表:

{
    "query": {
      "bool": { 
        "should": [
          { "match": { "title": "ins" }}
        ]
      }
    }
}

我应该如何进行部分搜索?以及如何正确设置过滤器?也就是说,如何通过某些字段进行搜索部分查询,同时又被其他字段过滤?

谢谢。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您需要在第一个查询中提供minimum_should_match

    我做了以下操作,只得到了一个文件(你想要的结果)

    POST test_things/_search
    {
      "query": {
        "bool": {
          "minimum_should_match": 1, 
          "should": [
            {
              "match": {
                "title": "insight"
              }
            }
          ],
          "filter": [
            {
              "term": {
                "library": "workspace"
              }
            }
          ]
        }
      }
    }
    

    至于为什么ins不起作用,这取决于你使用的映射+分析器。您正在与索引中的已分析术语匹配,如果您想与 ins 匹配,您需要更改您的分析器(可能使用 ngram tokenizer)或使用 wildcard query

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2011-10-19
      • 2017-09-18
      • 1970-01-01
      相关资源
      最近更新 更多