我最近发现我不应该在弹性搜索查询中使用通配符。相反,有人告诉我应该使用 ngrams。在我的实验中,这非常有效。我想做的是能够告诉 Elasticsearch 对所有映射字段(或适合特定模式的映射属性)使用 ngram。例如:
CURL -XPUT 'http://localhost:9200/test-ngram-7/' -d '{
"mappings": {
"person": {
"properties": {
"name": {
"type": "string",
"analyzer": "partial"
}
}
}
},
"settings": {
"analysis": {
"filter": {
"lb_ngram": {
"max_gram": 10,
"min_gram": 1,
"type": "nGram"
}
},
"analyzer": {
"partial": {
"filter": [
"standard",
"lowercase",
"asciifolding",
"lb_ngram"
],
"type": "custom",
"tokenizer": "standard"
}
}
}
}
}'
现在,当我添加此映射时:
CURL -XPUT 'http://localhost:9200/test-ngram-7/person/1' -d '{
"name" : "Cobb",
"age" : 31
}'
我可以轻松查询“obb”并获得部分结果。在我的应用程序中,我事先不知道人们将映射哪些领域。我显然可以在客户端将其短路并在发布文档之前声明我的映射,但如果我能做这样的事情会非常酷:
CURL -XPUT 'http://localhost:9200/test-ngram-7/' -d '{
"mappings": {
"person": {
"properties": {
"_default_": {
"type": "string",
"analyzer": "partial"
}
}
}
},
"settings": {
"analysis": {
"filter": {
"lb_ngram": {
"max_gram": 10,
"min_gram": 1,
"type": "nGram"
}
},
"analyzer": {
"partial": {
"filter": [
"standard",
"lowercase",
"asciifolding",
"lb_ngram"
],
"type": "custom",
"tokenizer": "standard"
}
}
}
}
}'
请注意,我使用的是“默认”。如果我能像 "name.*" 那样做也很酷,并且所有以 name 开头的属性都会以这种方式被过滤。我知道弹性搜索支持默认和通配符。*,所以我希望我只是做错了。
简而言之,我希望在自动创建映射时通过 ngram 过滤器运行新属性,而不是使用映射 API。