Elasticsearch查询以返回所有记录

616

我在 Elasticsearch 中有一个小型数据库,为了测试目的,我想要拉回所有记录。我尝试使用以下形式的 URL...

http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}

请问有人可以给我实现这个功能所需的URL吗?


1
...其中“foo”是您想显示所有记录的索引名称。 - jonatan
1
所有仅使用“size”查询参数的答案都是不正确的。无论查询中的“size”值如何,ES在响应中最多返回“index.max_result_window”个文档(默认为10k)。请参考“scroll”和“search_after”。 - narendra-choudhary
我只需要这一行代码就能够返回所有记录:http://curl -XGET 'localhost:9200/foo/_search' - Mr. N
30个回答

2
curl -X GET 'localhost:9200/foo/_search?q=*&pretty' 

1
为了从所有索引返回所有记录,您可以执行以下操作:

curl -XGET http://35.195.120.21:9200/_all/_search?size=50&pretty

输出:
  "took" : 866,
  "timed_out" : false,
  "_shards" : {
    "total" : 25,
    "successful" : 25,
    "failed" : 0
  },
  "hits" : {
    "total" : 512034694,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "grafana-dash",
      "_type" : "dashboard",
      "_id" : "test",
      "_score" : 1.0,
       ...

1

如果还有像我一样需要从Elasticsearch检索所有数据的人,以下是我的做法。此外,所有数据包括所有索引和所有文档类型。我正在使用Elasticsearch 6.3。

curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
    "query": {
        "match_all": {}
    }
}
'

Elasticsearch参考文档


1

这是实现你想要的查询的方法, (我建议使用Kibana,因为它能更好地理解查询)

GET my_index_name/my_type_name/_search
{
   "query":{
      "match_all":{}
   },
   size : 20,
   from : 3
}

要获取所有记录,您必须使用“match_all”查询。

大小是您想要获取的记录数(一种限制)。 默认情况下,ES仅返回10条记录

从就像跳过,跳过前3条记录。

如果您想精确获取所有记录,请使用来自Kibana查询结果中“total”字段的值,并将其与“size”一起使用。


此查询的限制是 size + from 必须小于或等于 "index.max_result_window"。对于大量文档(默认情况下为10000+),此查询不适用。 - KarelHusa

1
提供size参数时,ElasticSearch返回的最大结果为10000。
curl -XGET 'localhost:9200/index/type/_search?scroll=1m' -d '
{
   "size":10000,
   "query" : {
   "match_all" : {}
    }
}'

接下来,您需要使用Scroll API获取结果,并获得_scroll_id值,将此值放入scroll_id中。

curl -XGET  'localhost:9200/_search/scroll'  -d'
{
   "scroll" : "1m", 
   "scroll_id" : "" 
}'

滚动API应该从第一个请求开始就使用。 - Daniel Schneiter

1

官方文档提供了这个问题的答案!你可以在这里找到它。

{
  "query": { "match_all": {} },
  "size": 1
}

您只需将 size (1) 替换为您想要查看的结果数量即可!


1
问题的作者要求“所有”结果,而不是预定义数量的结果。虽然在帖子中发布文档链接很有帮助,但文档并没有描述如何实现这一点,你的答案也没有。 - Maarten00
使用从和大小的方法,您将遇到深度分页问题。请使用滚动API来转储所有文档。 - Daniel Schneiter

0
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'

虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。 - Stamos

0

除了@Akira Sendoh之外,没有人回答如何获取所有文档。但即使是那个解决方案也会在没有日志的情况下导致我的ES 6.3服务崩溃。唯一对我有用的是使用低级别的elasticsearch-py库,通过scan helper来使用scroll() api:

from elasticsearch.helpers import scan

doc_generator = scan(
    es_obj,
    query={"query": {"match_all": {}}},
    index="my-index",
)

# use the generator to iterate, dont try to make a list or you will get out of RAM
for doc in doc_generator:
    # use it somehow

然而,现在更清晰的方式似乎是通过elasticsearch-dsl库,它提供了更抽象、更简洁的调用,例如:http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits

0

使用 Elasticsearch 7.5.1

http://${HOST}:9200/${INDEX}/_search?pretty=true&q=*:*&scroll=10m&size=5000

如果您知道数组的大小,可以使用 &size=${number} 指定数组的大小。

如果您不知道索引,则可以这样做

http://${HOST}:9200/_cat/indices?v

-5

你可以使用 size=0,这将返回所有文档的示例。

curl -XGET 'localhost:9200/index/type/_search' -d '
{
   size:0,
   "query" : {
   "match_all" : {}
    }
}'

1
这将返回累积的信息,但不包括命中本身。 - user732456

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接