54

我如何从弹性搜索中获取所有结果,因为结果仅显示限制为 10。我有一个像这样的查询:

@data = Athlete.search :load => true do
          size 15
          query do
            boolean do
              must { string q, {:fields => ["name", "other_names", "nickname", "short_name"], :phrase_slop => 5} }
              unless conditions.blank?
                conditions.each do |condition|
                  must { eval(condition) }
                end
              end
              unless excludes.blank?
                excludes.each do |exclude|
                  must_not { eval(exclude) }
                end
              end
            end
          end
          sort do
            by '_score', "desc"
          end
        end

我已将限制设置为 15,但我不想使其无限制,以便我可以获取所有数据我无法设置限制,因为我的数据不断变化,我想获取所有数据。

4

4 回答 4

36

您可以使用fromsize参数来分页浏览所有数据。这可能会非常慢,具体取决于您的数据和索引中有多少。

http://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html

于 2013-01-18T14:46:10.177 回答
13

另一种方法是先执行 a searchType: 'count',然后使用sizeset to执行普通搜索results.count

这里的优点是它避免了依赖于类似 SO questionUPPER_BOUND中所建议的幻数,并避免了 Shay Banon在此处描述的构建过大的优先级队列的额外开销。与.scan

最大的缺点是它需要两个请求。根据您的情况,这可能是可以接受的。

于 2015-09-23T19:26:33.133 回答
10

文档中,“请注意,from + size不能超过index.max_result_window默认为 10,000 的索引设置”。因此,我公认的非常特别的解决方案是,如果我使用该论点,则只需通过减去10,000 size: 10000from

请注意,在下面 Matt 的评论之后,如果您有大量文档,正确的方法是使用scroll api。我已经成功地使用了它,但仅限于 python 接口。

于 2016-04-28T22:42:31.660 回答
7

使用扫描方法,例如

 curl -XGET 'localhost:9200/_search?search_type=scan&scroll=10m&size=50' -d '
 {
    "query" : {
       "match_all" : {}
     }
 }

这里

于 2013-01-18T10:14:05.313 回答