首页 文章

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

提问于
浏览
39

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

  • 6

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

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

  • 27

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

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

  • 8

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

    这里的优点是它可以避免依赖于this similar SO question中建议的 UPPER_BOUND 的幻数,并避免构建过多的优先级队列的额外开销,Shay Banon描述了here . 与 scan 不同,它还可以让您对结果进行排序 .

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

  • 6

    使用扫描方法,例如

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

    here

相关问题