{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edgeNGram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"test": {
"properties": {
"suggest": {
"type": "completion",
"analyzer": "autocomplete"
},
"hostname": {
"type": "text"
}
}
}
}
} `
以上映射存储在弹性搜索中。
POST index/test
{
"hostname": "testing-01",
"suggest": [{"input": "testing-01"}]
}
POST index/test
{
"hostname": "testing-02",
"suggest": [{"input":"testing-02"}]
}
POST index/test
{
"hostname": "w1-testing-01",
"suggest": [{"input": "w1-testing-01"}]
}
POST索引/测试
{
“hostname”:“w3-testing-01”,
“建议”:[{“输入”:“w3-testing-01”}]
}
`
当有30个主机名为w1且主机名为w3的文档时,当搜索到术语“w3”时,我首先获得所有w1的建议,然后获得w3的建议。
建议查询
{
"query": {
"_source": {
"include": [
"text"
]
},
"suggest": {
"server-suggest": {
"text": "w1",
"completion": {
"field": "suggest",
"size": 10
}
}
}
}
}
尝试了不同的分析仪,同样的问题。 可以一些身体指导?
答案 0 :(得分:1)
这是一个常见的陷阱。这是因为min_ngram
为1,因此w1-testing-01
和w3-testing-01
都会生成令牌w
。由于您只指定了analyzer
,autocomplete
分析器也会在搜索时启动,因此w3
的搜索建议也会产生令牌w
,因此w1-testing-01
1}}和w3-testing-01
匹配。
解决方案是在search_analyzer
字段中添加suggest
,以便在搜索时不使用autocomplete
分析器(您可以使用standard
,{{ 1}}或者任何分析器对你的用例都有意义),但仅限索引时间。
keyword