【问题标题】:How to handle unordered multi-word query in Elasticsearch?如何处理 Elasticsearch 中的无序多词查询?
【发布时间】:2017-11-20 19:51:07
【问题描述】:

我有以下情况:

简单的分析器处理文本“棕色和绿色的狐狸很快”并将单个小写术语添加到索引中。

我想对我的索引使用以下查询短语:“quick brown f”

我使用match_phrase_prefix 来运行此搜索:

{
    "query": {
        "match_phrase_prefix" : {
            "message" : {
                "query" : "quick brown f",
                "max_expansions" : 10
            }
        }
    } 
}

很遗憾,由于术语的顺序与查询术语不匹配,因此没有返回任何结果。如果我使用 match 查询并且使用完整的术语,我会返回结果。似乎 match_phrase_prefix 正在检查顺序:

这个查询的工作原理是用 quick 和 brown 创建一个短语查询 (即“快速”一词必须存在并且必须在该词后跟 棕色)。

我的问题:

有没有一种方法可以运行查询来处理不完整的术语并返回结果,而不管源文档中术语的顺序如何?我目前能想到的唯一选择是为输入查询中的每个术语手动创建一个查询(例如:quick、brown、f),并使用 bool 查询将它们组合起来。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    edge_ngram 分析器应该可以满足您的需求。如果您将其设置为将 min_gram 值设置为 1 并将 max gram 值设置为 10,则文档将存储必要的令牌。然后,您可以将标准分析器应用于您的查询文本并将其与 edge_ngram 文档字段进行匹配。

    示例in the documentation 与您请求的解决方案几乎完全相同。请注意在查询中使用显式 and 运算符以确保您的所有搜索标记(部分或其他)都匹配。

    来自 5.6 的文档:

    PUT my_index
    {
      "settings": {
        "analysis": {
          "analyzer": {
            "autocomplete": {
              "tokenizer": "autocomplete",
              "filter": [
                "lowercase"
              ]
            },
            "autocomplete_search": {
              "tokenizer": "lowercase"
            }
          },
          "tokenizer": {
            "autocomplete": {
              "type": "edge_ngram",
              "min_gram": 1,
              "max_gram": 10,
              "token_chars": [
                "letter"
              ]
            }
          }
        }
      },
      "mappings": {
        "doc": {
          "properties": {
            "title": {
              "type": "text",
              "analyzer": "autocomplete",
              "search_analyzer": "autocomplete_search"
            }
          }
        }
      }
    }
    
    PUT my_index/doc/1
    {
      "title": "Quick Foxes" 
    }
    
    POST my_index/_refresh
    
    GET my_index/_search
    {
      "query": {
        "match": {
          "title": {
            "query": "Quick Fo", 
            "operator": "and"
          }
        }
      }
    }
    

    【讨论】:

    • 感谢 LaserJesus,该解决方案效果很好。我只需要增加 max_gram 并添加我的 char_filter :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2019-09-20
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多