【发布时间】:2019-02-12 21:25:16
【问题描述】:
我需要使用 Elasticsearch 改进搜索结果列表。
假设我们有 3 个具有单个字段和内容的文档,如下所示:
- “苹果”
- “青苹果”
- “苹果树”
如果我搜索“apple”,可能会得到这样排序的结果:
- “青苹果”
- “苹果树”
- “苹果”
但我想要的是获得最高分的完全匹配,这里是带有“apple”的文档。
下一个最高分应该是以搜索词开头的条目,这里是“苹果树”,其余排序默认方式。
所以我想拥有它:
- “苹果”
- “苹果树”
- “青苹果”
我已经尝试通过使用 rescore 来实现它:
curl -X GET "http://localhost:9200/my_index_name/_search?size=10&pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"query_string": {
"query": "apple"
}
},
"rescore": {
"window_size": 500,
"query": {
"score_mode": "multiply",
"rescore_query": {
"bool": {
"should": [
{
"match": {
"my_field1": {
"query": "apple",
"boost": 4
}
}
},
{
"match": {
"my_field1": {
"query": "apple*",
"boost": 2
}
}
}
]
}
},
"query_weight": 0.7,
"rescore_query_weight": 1.2
}
}
}'
但这并不真正有效,因为 Elasticsearch 似乎用空格分隔所有单词。例如,搜索“apple*”也将提供“green apple”。这似乎是重新评分对我不起作用的原因。
可能还有其他字符,例如点“.”、“-”、“;”等等,Elasticsearch 用来拆分和弄乱我的排序。
我还在“rescore_query”中使用“match_phrase”而不是“bool”,但没有成功。
我也试过只匹配一个:
curl -X GET "http://localhost:9200/my_index_name/_search?size=10&pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"query_string": {
"query": "apple"
}
},
"rescore": {
"window_size": 500,
"query": {
"score_mode": "multiply",
"rescore_query": {
"bool": {
"should": [
{
"match": {
"my_field1": {
"query": "apple*",
"boost": 2
}
}
}
]
}
},
"query_weight": 0.7,
"rescore_query_weight": 1.2
}
}
}'
它似乎有效,但我仍然不确定。这是正确的做法吗?
EDIT1:对于其他查询,一个匹配重新评分无法正常工作。
【问题讨论】:
标签: elasticsearch