我有一个名为 search_suggest 的字段,其中包含以下内容
search_suggest: {
type: "completion",
analyzer: "simple",
payloads: true,
preserve_separators: false,
preserve_position_increments: false,
max_input_length: 50
}
它的值索引为
{
input: [
"apple iphone 6"
],
output: "apple iphone 6",
weight: 5,
payload: {
category: "mobiles"
}
}
如果我搜索苹果,它会给我结果。但如果我搜索iphone,它不会给我任何结果。
完成建议者有没有办法做到这一点? 我必须将输入索引为
我知道edge-ngram的建议。但缺点是它也会暗示重复。
请帮忙。
答案 0 :(得分:2)
如果有人还在寻找答案,
完成建议适用于前缀匹配。因此,在输入中,您可以提供短语的可能后缀。这将允许您进行前缀搜索,即使您从中间开始,也就是子字符串搜索。
例如:
$date=date('Y-m-d H:i:s', strtotime($date));
正如您所看到的,无论您从哪里开始,#Courtyard; Courtyard by Marriot Munich City"你会得到结果。 (除非" by"因为在大多数情况下它将被作为停用词丢弃。)
对于一般搜索字符串来说,上升到4-5步就足够了。此外,如果您使用过滤器处理停用词,则无需担心输入中的停用词。
样本索引分析器
{
"text" : "Courtyard by Marriot Munich City",
"text_suggest" : {
"input": [
"Courtyard by Marriot Munich City",
"by Marriot Munich City",
"Marriot Munich City",
"Munich City",
"City"
],
"output" : "Courtyard by Marriot Munich City",
"weight" : 11,
"payload": { "id" : 314159 }
}
}
这将解决您在其中一条评论中提到的问题:
然后,如果我建议"苹果ip",它不会给出结果。 iphone 6怎么样?
{
"settings" : {
"analysis" : {
"filter" : {
"suggester_stop" : {
"type" : "stop",
"stopwords" : "_english_",
"remove_trailing" : false,
"ignore_case" : true
},
"suggester_stemmer" : {
"type" : "stemmer",
"name" : "light_english"
}
},
"analyzer" : {
"suggester_analyzer" : {
"type" : "custom",
"tokenizer" : "standard",
"char_filter" : ["html_strip"],
"filter" : [
"standard",
"lowercase",
"suggester_stop",
"suggester_stemmer"
]
}
}
}
}
}
您将获得" apple ip"," iphone 6"的搜索结果。然而,你不会得到"苹果6"无论如何,这对人们来说并不常见。
答案 1 :(得分:0)
这应该可以解决您的问题
{
"input": [ "apple", "iphone", "6" ]
}