ElasticSearch 正在寻找与您的查询匹配的“最相关”文档,而您正在尝试实现 3 个查询的联合。
最简单(也是最快)的方法是使用multi search运行三个查询:
curl -XGET 'http://127.0.0.1:9200/my_index/_msearch?pretty=1' -d '
{}
{"query" : {"text" : {"title" : "some words"}}, "size" : 5}
{}
{"query" : {"text" : {"title" : "some other words"}}, "size" : 5}
{}
{"query" : {"text" : {"title" : "other words"}}, "size" : 5}
'
根据您的要求,另一种选择可能是使用限制过滤器,但请注意,它限制每个 SHARD 的结果数量,而不是每个索引。默认情况下,一个索引有 5 个主分片,因此如果您指定限制为 5,您很可能会返回 25 个结果。
所以也许是这样的:
curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1' -d '
{
"query" : {
"bool" : {
"should" : [
{
"filtered" : {
"filter" : {
"limit" : {
"value" : 1
}
},
"query" : {
"text" : {
"title" : "some words"
}
}
}
},
{
"filtered" : {
"filter" : {
"limit" : {
"value" : 1
}
},
"query" : {
"text" : {
"title" : "other words"
}
}
}
},
{
"filtered" : {
"filter" : {
"limit" : {
"value" : 1
}
},
"query" : {
"text" : {
"title" : "some other words"
}
}
}
}
]
}
}
}
'
这将为您提供每个分片上每个短语的得分最高的文档(有 5 个分片,最多 15 个文档,其中(因为您没有指定size=15
)将减少到前 10 个文档)。
您的里程可能会有所不同,具体取决于您的文档在分片中的分布方式。