带简单查询字符串查询的前缀通配符

时间:2019-12-28 21:27:11

标签: elasticsearch

是否可以使用前缀通配符查询(其中*ing可以通过简单查询字符串查询找到frustrating

Query String Query似乎可以使用allow_leading_wildcard参数(默认为true),但是Simple Query String Query中没有提到前缀通配符,并且尝试时,前缀通配符查询似乎不起作用。

1 个答案:

答案 0 :(得分:0)

如果您确实希望通过wildcard进行Simple Query String Query搜索,则可以使用edge_ngram标记程序创建自己的一个。

Edge Ngram

示例:

映射

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "my_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "min_gram": "2",
          "type": "ngram",
          "max_gram": "3"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "data": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

为文档编制索引

PUT my_index/_doc/1
{
  "data": "frustrating"
}

搜索查询

GET my_index/_search
{
 "query": {
   "simple_query_string": {
     "query": "ing",
     "fields": ["data"]
   }
 }
}

结果

"hits" : [
  {
    "_index" : "my_index",
    "_type" : "_doc",
    "_id" : "1",
    "_score" : 0.8630463,
    "_source" : {
      "data" : "frustrating"
    }
  }
]

另一种解决方案是使用query_stringallow_leading_wildcard默认为true),并且您在映射中不需要analyzer字段:

GET my_index/_search
{
 "query": {
   "query_string": {
     "query": "*ing",
     "fields": ["data"]
   }
 }
}

希望这会有所帮助