我有一个产品索引(ES 6.3),其中一些产品名称看起来像这样Tomato
,Tomatosoup
,Tomatojuice
等。我正在努力实现,例如,当我查询术语Toma
时,是为了获得最匹配的术语的集合,而不是整个产品名称。
要实现这一点,我有以下映射:
{
"name": {
"type": "text",
"analyzer": "custom-ngram" // Defined in the mapping
"search-analyzer": "standard",
"fields": {
"suggestion": {
"type": "text",
"fielddata": true,
"analyzer": "standard"
}
}
}
}
我的查询如下:
{
"query": {
"bool": {
"must":{
"multi_match": {
"query": "tom",
"fields": ["name^3", "description"]
}
}
}
},
"aggs": {
"suggestions": {
"terms": {
"field": "name.suggestion",
"include": "tom.*",
"size": 10
}
}
},
"size": 0
}
实际上这可以使我得到所需的东西,但我有两个担忧:
fielddata
includes
指令来实际过滤聚合桶这是继续解决此问题的正确方法,还是方法完全错误?有没有针对此问题的最佳实践?