2014-01-29 55 views
1

我对ElasticSearch中的限制过滤器有些不确定。我不认为我正确地理解了他们。ElasticSearch限制过滤器歧义

我在健康记录信息的多个节点上搜索多个分片。我想让顶端让我说50个最高得分的结果给我的查询。

docs它说

甲限制滤波器限制到上执行 的文档(每分片)的数量。

SO响应状态

You should use filters when you don't care about scoring, they are faster and cache-able. 

但如果没有得分在我的情况下,事情应该我不使用限制过滤器来限制我回到只有排名前50位得分最高的结果吗?

会像这样更准确(在Java中):

SearchResponse response = client.prepareSearch().setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(qb).setFrom(0).setSize(50).setExplain(true).execute().actionGet(); 

更新 我对这个SO帖子里的响应状态跌跌撞撞:

没错,你应该使用过滤器排除甚至 在执行查询时考虑的文档。

好的。所以在这种情况下,也许我可以将我的问题细化到以下内容:

如何返回前50个得分结果?上面的java参考了正确的解决方案吗?

回答

4

所有limit过滤器的作用是告诉每个分片在找到一定数量的匹配文档时停止搜索。它没有说任何关于这些文件是最好的匹配。

例如,假设您只有一个分片,并且您使用"foo bar"索引了10个文档,并且仅使用"foo"索引了另外10个文档。然后,运行此搜索:

GET /_search 
{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match": { 
      "text": "foo bar" 
     } 
     }, 
     "filter": { 
     "limit": { 
      "value": 10 
     } 
     } 
    } 
    } 
} 

match查询查找foo OR bar,因此,所有20个文档将匹配,但有两个方面的10将匹配较好。 limit过滤器说:只要你有10个文档就停下来,所以你会得到10个结果,但它们可能不是最好的10个 - 相反,你的结果可能包括仅有foo的文档。

(注:该limit每碎片应用,而不是按指数)

你说:

我想上可以说,50个得分最高结果我的查询。

您希望最高的事实会自动阻止使用limit过滤器。相反,您要做的就是将size parameter设置为50:

GET /_search 
{ 
    "size": 50, 
    "query": {....} 
}