在 Elasticsearch 中搜索两个字段但只评分一次
Search for two fields but only score once in Elasticsearch
假设我在 Elasticsearch 中有这些文档:
{
"display_name": "Jose Cummings",
"username": "josecummings"
},
{
"display_name": "Jose Ramirez",
"username": "elite_gamer"
},
{
"display_name": "Lance Abrams",
"username": "abrams1"
},
{
"display_name": "Steve Smith",
"username": "josesmose"
}
我想 运行 对 Jose
进行“键入时”搜索,同时搜索 display_name
和 username
字段,我可以使用这个:
{
"query": {
"bool": {
"must": {
"multi_match": {
"fields": [
"display_name",
"username"
],
"query": "Jose",
"type": "bool_prefix",
"fuzziness": "AUTO",
"boost": 50
}
}
}
}
}
这里的问题是,当我搜索 Jose
时,Jose Cummings 得到 100 分,而 Jose Ramirez 和 Steve Smith 只得到 50 分,因为这似乎是两个领域得分的总和。这实质上是奖励拥有与 username
相同的 display_name
的用户,这是我们不希望发生的。
有没有办法只取两个字段的最高分?我已经尝试了数十种不同的组合,现在使用 function_score
、boost_mode
/score_mode
、constant_score
,试图与多个 match_bool_prefix
进行 should
匹配] 查询等。我尝试过的任何事情似乎都无法实现。
试试这个:
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"fields": [
"display_name^50",
"username^50"
],
"query": "Jose",
"type": "bool_prefix",
"fuzziness": "AUTO",
"tie_breaker": 0.3
}
}
]
}
}
}
请注意将 tie_breaker
设置为 0.0 而不是 0
另请注意,您的 bool_prefix
scoring behaves like most_fields
, but using a match_bool_prefix
query instead of a match
query.
也许您确实希望字段以 jose
为前缀。但是,如果用户名是 cool_jose
,它将被排除在外(除非您应用非标准的 analyzer)...
假设我在 Elasticsearch 中有这些文档:
{
"display_name": "Jose Cummings",
"username": "josecummings"
},
{
"display_name": "Jose Ramirez",
"username": "elite_gamer"
},
{
"display_name": "Lance Abrams",
"username": "abrams1"
},
{
"display_name": "Steve Smith",
"username": "josesmose"
}
我想 运行 对 Jose
进行“键入时”搜索,同时搜索 display_name
和 username
字段,我可以使用这个:
{
"query": {
"bool": {
"must": {
"multi_match": {
"fields": [
"display_name",
"username"
],
"query": "Jose",
"type": "bool_prefix",
"fuzziness": "AUTO",
"boost": 50
}
}
}
}
}
这里的问题是,当我搜索 Jose
时,Jose Cummings 得到 100 分,而 Jose Ramirez 和 Steve Smith 只得到 50 分,因为这似乎是两个领域得分的总和。这实质上是奖励拥有与 username
相同的 display_name
的用户,这是我们不希望发生的。
有没有办法只取两个字段的最高分?我已经尝试了数十种不同的组合,现在使用 function_score
、boost_mode
/score_mode
、constant_score
,试图与多个 match_bool_prefix
进行 should
匹配] 查询等。我尝试过的任何事情似乎都无法实现。
试试这个:
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"fields": [
"display_name^50",
"username^50"
],
"query": "Jose",
"type": "bool_prefix",
"fuzziness": "AUTO",
"tie_breaker": 0.3
}
}
]
}
}
}
请注意将 另请注意,您的 scoring behaves like 也许您确实希望字段以 tie_breaker
设置为 0.0 而不是 0
bool_prefix
most_fields
, but using a match_bool_prefix
query instead of a match
query.jose
为前缀。但是,如果用户名是 cool_jose
,它将被排除在外(除非您应用非标准的 analyzer)...