【发布时间】:2015-02-09 15:52:02
【问题描述】:
我有存储用户知道的技能的文档:
{
"size": 1000,
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "Objective-C",
"default_field": "user.skill.name"
}
},
{
"range": {
"user.skill.weight_relative": {
"gte": 1
}
}
},
{
"range": {
"user.skill.weight_absolute": {
"gte": 1
}
}
},
...
我遇到的问题是,ElasticSearch 正在返回用户,例如 skill.name == Objective-C,但相对权重和绝对权重均为 0,以及得分大于 1 的用户,但 Skill.name 完全是不同。
有没有办法告诉弹性我不希望这些搜索是“本地”范围的?我不知道这个场景的名称。如果我没有正确调用它,请原谅。
我正在运行的查询也有一个自定义的 _score 函数,它为具有第三个指标的用户提供更高的分数(不包括因为它不相关)。可能是因为这个自定义评分功能吗?是否会因为第三个指标高于具有所需技能和水平的用户而给予“错误”用户更高的分数?
谢谢。
【问题讨论】:
-
我没有完全理解你的问题,但看起来你想要'must'子句而不是'should'
-
请记住,
should子句可以被认为是一个布尔值OR(而不是AND,这更多的是must实现的) - 我认为默认情况下,任何满足这些条件之一(并且可以是任何一个)的文档都将匹配,尽管此要求可以由minimum_should_match明确指定。 elasticsearch.org/guide/en/elasticsearch/reference/current/… -
大家好,感谢您的回复。它不能是
must,因为should条件只是用来添加分数。想象一个用户对某项技能的权重为 0,它仍然应该出现,但更低。 -
谢谢@rchang,如果我能指定哪个至少应该匹配,那将是完美的,因为我至少需要匹配技能名称,其余的应该只是添加分数:分数越高,他们就越高
-
我将再次解释我的场景:我可能会搜索很多技能,例如 Objective-C、Swift、Cocoa。所以我不能把技能名称作为“必须”,因为有些用户可能只有其中一个,但这应该没问题。然后我需要权重来自该技能而不是其他技能:我可能有 2 个技能 - Swift 和 Python。我在 Python 中很重要,在 Swift 中没有。这不应该给用户更高的分数,因为权重对应于“错误”的技能。
标签: elasticsearch