我想通过elasticsearch实现搜索。我用的是"edge_ngram">
搜索时,我得到不相关的结果(例如,我搜索"abcd"我得到了"abc…结果),所以我想使用"min_score"过滤器,问题是,如果我使用自定义排序,这个过滤器不起作用;(然后我得到"score": null)的结果。
我必须使最低分数过滤器工作,甚至与自定义的"排序",或使我的"分析器";不会给我不相关的结果(因为&;abcd&;)我想要结果&;abcd*&;
映射:
'search_by' => [
'type' => 'text',
'analyzer' => 'autocomplete'
]
分析仪:
"analysis" => [
"analyzer" => [
"autocomplete" => [
"tokenizer" => "autocomplete",
],
],
"tokenizer" => [
"autocomplete" => [
"type" => "edge_ngram",
"min_gram" => 3,
"max_gram" => 10,
"token_chars" => [
"letter"
]
]
]
...
]
查询:
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"match": {
"search_by": {
"query": "abcd"
}
}
}
]
}
}
],
"must_not": [],
"should": []
}
},
"min_score": 2,
"from": 0,
"size": 24,
"sort": [
{
"order_by": "desc"
}
]
问题是对索引和搜索时间使用相同的分析器。这是一个常见的错误。所以你应该做的就是:
'search_by' => [
'type' => 'text',
'analyzer' => 'autocomplete',
'search_analyzer' => 'standard' <--- add this
]