当您尝试实现3个查询的并集时,ElasticSearch会寻找与您的查询匹配的“最相关”文档。
最简单(也是最快)的方法是使用多重搜索运行三个查询:
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个文档)。
您的里程可能会有所不同,具体取决于您的文档在各个分片中的分布方式。



