【发布时间】:2015-10-22 21:30:19
【问题描述】:
上下文:我对 ElasticSearch 比较陌生,所以也许我缺少一个概念。
我想提高具有一个或多个标签的文档的相关性分数(标签越多,分数越高),而不过滤掉没有任何标签的文档。
尝试过的解决方案:
我尝试使用术语查询:
{
"query": {
"terms": {
tags: ['some','tags','to','boost'],
minimum_should_match: 0
}
}
}
但minimum_should_match 选项似乎被忽略了(文档对此不太清楚,但我认为此选项必须不为零)。
我还尝试使用带有match_all 的bool should 查询“作弊”:
{
"query": {
"bool": {
"should" : [
{"terms": {tags: ['some','tags','to','boost']}},
{"match_all": {}}
]
}
}
}
但由于某种原因,没有任何标签的结果无论如何都会被过滤掉。
我还尝试使用function_score 或boosting_query,但无法找出保留术语查询生成的相关性分数的有效语法。
编辑:
本着“布尔作弊”的精神,似乎有一个可行的解决方案:
{
"query": {
"dis_max": {
"queries" : [
{"terms": {tags: ['some','tags','to','boost']}},
{"match_all": {}}
]
}
}
}
但是:
- 这感觉很老套,
- 我不知道如何精确控制在这种情况下生成的相关性
问题:我觉得这一定是一个常见且简单的用例,那么有没有办法使用terms查询而不过滤掉不匹配的文档?
【问题讨论】:
-
对minimum_should_match 给出了很好的解释,即没有必需子句的布尔查询应该至少匹配一个可选子句。但是我不确定为什么您在 OP 中提到的第一个所谓的“布尔作弊”不起作用,似乎对我有用
-
抱歉耽搁了,假期回来了 ;) 我认为这与我使用的 gem 有关(我正在使用带有 Chewy 的 Rails,它基于“官方”elasticsearch gem )。不知何故,该库构建了一个奇怪的查询,它与我的预期不完全匹配,如果我发现更多,稍后会返回
标签: elasticsearch tags relevance