假设我有一个字段“productTitle”,我想让我的用户搜索产品。
我还想申请自动填充功能。所以我使用带有以下过滤器的autocomplete_analyzer:
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 10
}
然而,在用户进行搜索的同时,我不希望应用“edge_ngram”,因为它会产生大量不相关的结果。
例如,当用户想要搜索“mi”并开始输入“m”,“mi”时......他们应该得到以m,mi作为自动完成选项的结果。但是,当他们实际进行查询时,他们应该只获得带有“mi”一词的结果。目前他们也看到了“迷你”等的结果。
因此,是否可以使用两种不同的分析仪对“productTitle”进行索引?多字段类型是我的选择吗?
编辑:productTitle的映射
"productTitle" : {
"type" : "string",
"index_analyzer" : "second",
"search_analyzer" : "standard",
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
, “第二”分析仪
"analyzer": {
"second": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"trim",
"autocomplete_filter"
]
}
所以当我查询:
"filtered" : {
"query" : {
"match" : {
"productTitle" : {
"query" : "mi",
"type" : "boolean",
"minimum_should_match" : "2<75%"
}
}
}
}
我也得到像"mini"
这样的结果。但我只需要获得包括"mi"
谢谢
答案 0 :(得分:2)
答案 1 :(得分:0)
在您的答案中阻止您所描述内容的正确方法是在字段映射中指定analyzer
和search_analyzer
,如下所示:
"productTitle": {
"type": "string",
"analyzer": "autocomplete_analyzer",
"search_analyzer": "standard"
}
自动填充analyzer
将在编制索引时启动,并根据您的edge_ngram
配置对您的标题进行标记,standard
分析器将在搜索时启动而不会应用edge_ngram
的东西。
在此上下文中,除非您需要以不同方式对productTitle
字段进行标记,否则不需要多字段。