将弹性搜索限制设置为“无限制”

时间:2013-01-18 10:09:48

标签: ruby elasticsearch

如何从弹性搜索中获得所有结果,因为结果仅显示限制为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 个答案:

答案 0 :(得分:28)

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

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

答案 1 :(得分:8)

另一种方法是首先执行searchType: 'count',然后进行常规搜索,将size设置为results.count

这里的优点是它避免了UPPER_BOUNDscan建议的ImageView的幻数,并避免了构建过多优先级队列的额外开销,Shay Banon描述{{3} }。与ScaleType.MATRIX不同,它还可以让您对结果进行排序。

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

答案 2 :(得分:7)

使用扫描方法,例如

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

请参阅here

答案 3 :(得分:7)

docs开始,“请注意from + size不能超过默认为10,000的index.max_result_window索引设置”。所以,我公认的非常特别的解决方案是,如果我使用size: 10000参数,只需从传递from或10,000减去

请注意,根据下面的Matt评论,如果您有大量文档,正确的方法是使用scroll api。我成功地使用了它,但只使用了python接口。