【发布时间】:2017-06-06 08:00:24
【问题描述】:
我在弹性搜索索引中有一些文档。这是示例文档
文档1
{
"feild1":["hi","hello","goodmorning"]
"feild2":"some string"
"feild3":{}
}
文档2
{
"feild1":["hi","goodmorning"]
"feild2":"some string"
"feild3":{}
}
文档3
{
"feild1":["hi","hello"]
"feild2":"some string"
"feild3":{}
}
我想查询具有值“hi”和“hello”的 feild1,如果两者都存在,那么如果存在任何一个文档,则该文档应该首先出现,然后它应该在之后出现。 例如: 结果应按 DOC1、DOC3、DOC2 的顺序排列。我尝试了提升查询。但它不是按照我想要的顺序重新调整。这是我正在尝试的查询。
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"avail_status": true
}
},
{
"bool": {
"should": [
{
"constant_score": {
"filter": {
"terms": {
"feild1": [
"hi"
]
}
},
"boost": 20
}
},
{
"constant_score": {
"filter": {
"terms": {
"feild1": [
"hello"
]
}
},
"boost": 18
}
}
]
}
}
]
}
}
}
这是首先向我返回那些带有“hi”的文档,然后是那些带有“hello”的文档。提前致谢!
【问题讨论】:
-
如果您可以检查当前查询,您可以看到 doc3 和 doc1 得分相等,因为在 custom_score 中包装过滤器忽略了 TDF/IDF。我不认为 ES 将 doc3 放在 doc1 之上。如果您正在应用一种模式,以便将具有更多字段的数组放置在具有较少字段的数组之上,同时提升匹配值,那么我建议开始查看函数分数。让我知道您是否适合这种情况
-
是的,我只在找那个,文档的匹配分数很高
-
我发布了功能分数