如何在Elasticsearch中处理无序多字查询?

时间:2017-11-20 19:51:08

标签: elasticsearch

我有以下情况:

简单的分析仪处理文本"棕色和绿色的狐狸很快"并将单个小写字词添加到索引中。

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

我使用match_phrase_prefix来运行此搜索:

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

很遗憾,由于条款的顺序与查询字词不匹配,因此不会返回任何结果。如果我使用匹配查询并且使用完整的条款,我将得到结果。似乎 match_phrase_prefix 正在检查订单:

  

此查询的工作原理是创建一个快速和棕色的短语查询   (即快速一词必须存在,并且必须跟随一词   棕色)。

我的问题:

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

1 个答案:

答案 0 :(得分:2)

edge_ngram分析器应该做你想要的。如果将min_gram值设置为1并将最大克值设置为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"
      }
    }
  }
}