在ElasticSearch v5.2.2中,我可以使用通配符搜索“Jo *”,它将匹配包含“Joseph”的索引值
但是,如果我的索引也有这些值“约瑟夫”,“乔”,“乔斯”,“何塞”和“何塞普”,我想反转查询。
如何使用字符串“Joseph”作为搜索条件在索引中找到“Jo”,“Jos”,“Jose”和“Josep”?
答案 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"
}
}
}