我是Elasticsearch的新手,我有一个关于使用NGram实现自动完成功能的问题。从互联网上,我了解NGram实现允许灵活的解决方案,例如中间匹配,突出显示等,与使用内置完成建议器相比。
因此,我的一个索引类型有以下字段映射:
"suggest_keywords": {
"type": "string",
"analyzer": "nGram_analyzer",
"search_analyzer": "whitespace_analyzer"
},
nGram analyzer config:
"nGram_analyzer": {
"filter": [
"lowercase",
"asciifolding",
"nGram_filter"
],
"type": "custom",
"tokenizer": "whitespace"
}
以下是我对于字段的示例数据。
"suggest_keywords": [
"Wholesale",
"Fish",
"Seafood",
"Fishmongers",
"Markets"
],
当我使用以下查询时,它将返回整个数组。因为我只需要少数
{
"query": {
"match":{
"suggest_keywords" : "food"
}
}
}
我尝试使用突出显示来提取单个术语,但突出显示的术语存在于搜索结果的每个文档中。我尝试使用聚合但未能编写将高亮显示和聚合相结合的查询。是否可以这样做?
{
"query": {
"match": {
"suggest_keywords": "nge"
}
},
"highlight": {
"fields": {
"suggest_keywords": {}
}
}
}
或者是否有更好的实现从nGram分析数组中搜索?或者我应该将所有这些关键字编入不同的类型?
谢谢!
答案 0 :(得分:0)
您最好在单独的文档中为数组的每个项目建立索引,以便仅查找匹配的文档。
代替使用:
POST /doctype
{
"suggest_keywords": [
"Wholesale",
"Fish",
"Seafood",
"Fishmongers",
"Markets"
]
}
使用单独的文档并分别为其编制索引:
doc1:
POST /doctype
{
"suggest_keywords": "Wholesale"
}
doc2:
POST /doctype
{
"suggest_keywords": "Fish"
}
以此类推...
然后在搜索结果中,您将在单独的文档中获得匹配的结果