我在elasticsearch查询中有一个非常奇怪的问题。我在我的网站上做了一个自动完成搜索,我有一个问题。
例如,在我的国家有一个社区叫做"Recreio dos banddeirantes";当我搜索"banddeirant"时;(当用户输入时)查询找到邻居,但是,当输入"banddeirantes"找不到相同的邻居。
这是我的查询
{
query: {
bool: {
must: [
{
match: {
'city.name': city,
},
},
{
match: {
'city.state': state,
},
},
{
match: {
keyword: {
query, // The query is 'bandeirant' or 'bandeirantes'
},
},
},
],
},
},
highlight: {
fields: {
keyword: {
number_of_fragments: 9,
},
},
},
size: 20,
}
最终邻里值为"rereio dos Bandeirantes, Rio de Janeiro, RJ">
这个字段的映射是:
{
"search-neighborhood-01": {
"mappings": {
"properties": {
"city": {
//.....
},
"keyword": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
},
"name": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
}
分析器的设置
{
"search-neighborhood-01": {
"settings": {
"index": {
// .......
"analysis": {
"filter": {
"autocomplete_filter": {
"token_chars": [
"letter"
],
"min_gram": "1",
"type": "edge_ngram",
"max_gram": "10"
}
},
"analyzer": {
"autocomplete": {
"filter": [
"lowercase",
"autocomplete_filter",
"asciifolding"
],
"type": "custom",
"tokenizer": "standard"
}
}
},
// .....
}
}
}
}
我对bandeirant
的反应
// .....
{
//.....
"_source": {
"city": {
"name": "Rio de Janeiro",
"state": "RJ",
"keyword": "Rio de Janeiro, RJ"
},
"name": "Recreio dos Bandeirantes",
"keyword": "Recreio dos Bandeirantes, Rio de Janeiro, RJ"
},
"highlight": {
"keyword": [
"Recreio dos <em>Bandeirantes</em>, Rio de Janeiro, RJ"
]
}
}
我对bandeirantes
的响应是空的:/
我该如何解决这个问题?
由于o/
你有这个问题,因为你的Ngram过滤器令牌有"max_gram": "10"
配置,这意味着超过10的单词将不会被索引。
我的建议是随着“min_gram”
配置增加这个数量。
我将max_ngram更改为20并工作:)