ElasticSearch反向通配符搜索

时间:2017-03-10 14:44:14

标签: elasticsearch

在ElasticSearch v5.2.2中,我可以使用通配符搜索“Jo *”,它将匹配包含“Joseph”的索引值

但是,如果我的索引也有这些值“约瑟夫”,“乔”,“乔斯”,“何塞”和“何塞普”,我想反转查询。

如何使用字符串“Joseph”作为搜索条件在索引中找到“Jo”,“Jos”,“Jose”和“Josep”?

1 个答案:

答案 0 :(得分:1)

这是可能的,但您需要在索引设置中创建一个edgeNGram搜索分析器。

首先创建这样的设置。 name字段将使用standard分析器编制索引,但会使用您的自定义prefix_search分析器进行搜索。

PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "prefix_search": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "prefix"
          ]
        }
      },
      "filter": {
        "prefix": {
          "type": "edgeNGram",
          "min_gram": 1,
          "max_gram": 10
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "standard",
          "search_analyzer": "prefix_search"
        }
      }
    }
  }
}

然后,如果您创建这样的文档:

PUT test/doc/1
{
   "name": "Jos"
}

您可以通过以下查询找到它:

POST /test/doc/_search
{
  "query": {
    "match": {
      "name": "Joseph"
    }
  }
}