我有一个非常复杂的查询,现在我想提升一些符合某些标准的文档。我有以下简化的文档结构,我尝试根据id,流派,标记给一些文档提升。
{
"id": 123,
"genres": ["ACTION", "DRAMA"],
"tags": ["For kids", "Romantic", "Nature"]
}
我想做的是例如
id: 123 boost: 5
genres: ACTION boost: 3
tags: Romantic boost: 0.2
并提升我的查询中包含的所有文档并符合条件,但我不想过滤掉它们。所以查询子句提升对我来说没有任何帮助。
编辑:为了更容易理解我想要实现的目标(不确定是否可以使用elasticsearch,不是也是一个有效的答案)。
我想使用查询进行搜索并获取结果集。在这个集合中,我想提高一些文档。但我不想放大结果集或过滤它。提升应独立于查询。
例如,我搜索特定标记,并希望在结果集中使用“ACTION”类别提升所有文档。但我不希望结果集中包含“ACTION”类别的所有文档,也不希望只有具有特定标记和类别“ACTION”的文档。
答案 0 :(得分:2)
我认为你需要在查询时间内进行动态提升。
第一个匹配id标题与boost,第二个匹配'性别' ACTION。
{
"query": {
"bool": {
"should": [
{
"match": {
"title": {
"query": "id",
"boost": 5
}
}
},
{
"match": {
"content": "Action"
}
}
]
}
}
}
如果您希望根据查询进行multi_match
匹配:
{
"multi_match" : {
"query": "some query terms here",
"fields": [ "id^5", "genders^3", "tags^0.2" ]
}
}
注意:^ 5表示标题的提升。
修改强> 也许您要求ES参考指南中的不同类型的multi_match查询(至少对于ES 5.x):
best_fields
(默认)查找与任何字段匹配但使用的文档 来自最佳领域的_score。见best_fields。
<强> most_fields 强>
查找与任何字段匹配的文档并组合_score 每个领域。见most_fields。
<强> cross_fields 强>
使用相同的分析器处理字段,就好像它们是一个大的 领域。在任何字段中查找每个单词。见cross_fields。
<强>短语强>
在每个字段上运行match_phrase查询并组合来自的_score 每个领域。请参阅短语和phrase_prefix。
<强> phrase_prefix 强>
在每个字段上运行match_phrase_prefix查询并组合_score 来自每个领域。请参阅短语和phrase_prefix。
答案 1 :(得分:0)
我找到了一个解决方案而且非常简单。我使用了一个提升查询。我现在只是嵌套不同的提升标准,我的原始查询现在是基本查询。
https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-boosting-query.html
例如:
{
"query": {
"boosting": {
"positive": {
"boosting": {
"positive": {
"match": {
"director": "Spielberg"
}
},
"negative": {
"term": {
"genres": "DRAMA"
}
},
"negative_boost": 1.3
}
},
"negative": {
"term": {
"tags": "Romantic"
}
},
"negative_boost": 1.2
}
}
}