571

我在 Elasticsearch 中有一个小型数据库,出于测试目的,我想拉回所有记录。我正在尝试使用表单的 URL...

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

有人可以给我你用来完成此任务的 URL,好吗?

4

30 回答 30

847

我认为 lucene 语法是这样支持的:

http://localhost:9200/foo/_search?pretty=true&q=*:*

size 默认为 10,因此您可能还需要&size=BIGNUMBER获取超过 10 个项目。(其中 BIGNUMBER 等于您认为大于数据集的数字)

但是,elasticsearch 文档建议使用扫描搜索类型来处理大型结果集。

例如:

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

然后按照上面建议的文档链接继续请求。

编辑:scan在 2.1.0 中已弃用。

scanscroll与按 .排序的常规请求相比,没有提供任何好处_doc指向弹性文档的链接(由@christophe-roussy 发现)

于 2012-01-12T07:28:19.287 回答
167
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1
                                   ^

请注意 size 参数,它将显示的命中数从默认 (10) 增加到每个分片 1000。

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

于 2014-04-07T03:14:25.600 回答
44

elasticsearch(ES) 支持从 ES 集群索引获取数据的 GET 或 POST 请求。

当我们执行 GET 时:

http://localhost:9200/[your index name]/_search?size=[no of records you want]&q=*:*

当我们做一个 POST 时:

http://localhost:9200/[your_index_name]/_search
{
  "size": [your value] //default 10
  "from": [your start index] //default 0
  "query":
   {
    "match_all": {}
   }
}   

我建议使用带有弹性搜索的 UI 插件http://mobz.github.io/elasticsearch-head/ 这将帮助您更好地了解您创建的索引并测试您的索引。

于 2015-09-28T21:31:46.410 回答
34

注意:答案与旧版本的 Elasticsearch 相关0.90。此后发布的版本具有更新的语法。请参考其他答案,这些答案可能会为您正在寻找的最新答案提供更准确的答案。

下面的查询将返回您希望返回的 NO_OF_RESULTS。

curl -XGET 'localhost:9200/foo/_search?size=NO_OF_RESULTS' -d '
{
"query" : {
    "match_all" : {}
  }
}'

现在,这里的问题是您希望返回所有记录。所以很自然,在编写查询之前,您不会知道NO_OF_RESULTS的值。

我们如何知道您的文档中有多少条记录?只需在下面输入查询

curl -XGET 'localhost:9200/foo/_search' -d '

这会给你一个看起来像下面的结果

 {
hits" : {
  "total" :       2357,
  "hits" : [
    {
      ..................

结果总数告诉您文档中有多少记录可用。所以,这是了解NO_OF RESULTS值的好方法

curl -XGET 'localhost:9200/_search' -d ' 

在所有索引中搜索所有类型

curl -XGET 'localhost:9200/foo/_search' -d '

搜索 foo 索引中的所有类型

curl -XGET 'localhost:9200/foo1,foo2/_search' -d '

搜索 foo1 和 foo2 索引中的所有类型

curl -XGET 'localhost:9200/f*/_search

在任何以 f 开头的索引中搜索所有类型

curl -XGET 'localhost:9200/_all/type1,type2/_search' -d '

在所有索引中搜索类型用户和推文

于 2014-03-19T17:02:35.463 回答
23

这是我使用 python 客户端找到的最佳解决方案

  # Initialize the scroll
  page = es.search(
  index = 'yourIndex',
  doc_type = 'yourType',
  scroll = '2m',
  search_type = 'scan',
  size = 1000,
  body = {
    # Your query's body
    })
  sid = page['_scroll_id']
  scroll_size = page['hits']['total']

  # Start scrolling
  while (scroll_size > 0):
    print "Scrolling..."
    page = es.scroll(scroll_id = sid, scroll = '2m')
    # Update the scroll ID
    sid = page['_scroll_id']
    # Get the number of results that we returned in the last scroll
    scroll_size = len(page['hits']['hits'])
    print "scroll size: " + str(scroll_size)
    # Do something with the obtained page

https://gist.github.com/drorata/146ce50807d16fd4a6aa

使用 java 客户端

import static org.elasticsearch.index.query.QueryBuilders.*;

QueryBuilder qb = termQuery("multi", "test");

SearchResponse scrollResp = client.prepareSearch(test)
        .addSort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC)
        .setScroll(new TimeValue(60000))
        .setQuery(qb)
        .setSize(100).execute().actionGet(); //100 hits per shard will be returned for each scroll
//Scroll until no hits are returned
do {
    for (SearchHit hit : scrollResp.getHits().getHits()) {
        //Handle the hit...
    }

    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
} while(scrollResp.getHits().getHits().length != 0); // Zero hits mark the end of the scroll and the while loop.

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.html

于 2016-06-10T16:14:15.687 回答
17

如果您只是添加一些大数字作为大小, Elasticsearch 会变得非常慢,一种用于获取所有文档的方法是使用扫描和滚动 ID。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html

在 Elasticsearch v7.2 中,您可以这样做:

POST /foo/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match_all": {}
    }
}

此结果将包含一个 _scroll_id ,您必须查询它才能获得下一个 100 块。

POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "<YOUR SCROLL ID>" 
}
于 2015-11-20T15:53:06.253 回答
14

如果你想提取数千条记录,那么......有些人给出了使用“滚动”的正确答案(注意:有些人还建议使用“search_type = scan”。这已被弃用,并在 v5.0 中被删除。你不需要它)

从“搜索”查询开始,但指定“滚动”参数(这里我使用 1 分钟超时):

curl -XGET 'http://ip1:9200/myindex/_search?scroll=1m' -d '
{
    "query": {
            "match_all" : {}
    }
}
'

这包括您的第一批“命中”。但我们还没有在这里完成。上述 curl 命令的输出将是这样的:

{"_scroll_id":"c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow==","took":109,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits" :{"total":22601357,"max_score":0.0,"hits":[]}}

使用 _scroll_id 很重要,因为接下来您应该运行以下命令:

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

但是,传递 scroll_id 并不是为了手动完成而设计的。你最好的选择是编写代码来做到这一点。例如在java中:

    private TransportClient client = null;
    private Settings settings = ImmutableSettings.settingsBuilder()
                  .put(CLUSTER_NAME,"cluster-test").build();
    private SearchResponse scrollResp  = null;

    this.client = new TransportClient(settings);
    this.client.addTransportAddress(new InetSocketTransportAddress("ip", port));

    QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
    scrollResp = client.prepareSearch(index).setSearchType(SearchType.SCAN)
                 .setScroll(new TimeValue(60000))                            
                 .setQuery(queryBuilder)
                 .setSize(100).execute().actionGet();

    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId())
                .setScroll(new TimeValue(timeVal))
                .execute()
                .actionGet();

现在在最后一个命令上的 LOOP 使用 SearchResponse 来提取数据。

于 2016-02-11T07:13:24.737 回答
12

还用于server:9200/_stats获取有关所有别名的统计信息。例如每个别名的大小和元素数量,这非常有用并提供有用的信息

于 2014-08-18T13:21:16.637 回答
12

如果它是一个小数据集(例如 1K 条记录),您可以简单地指定size

curl localhost:9200/foo_index/_search?size=1000

不需要match all 查询,因为它是隐式的。

如果你有一个中等大小的数据集,比如 1M 条记录,你可能没有足够的内存来加载它,所以你需要一个scroll

滚动就像数据库中的游标。在 Elasticsearch 中,它会记住您离开的位置并保持索引的相同视图(即防止搜索者因刷新而离开,防止段合并)。

API 方面,您必须在第一个请求中添加一个滚动参数:

curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'

您将返回第一页和一个滚动 ID:

{
  "_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
  "took" : 0,
...

请记住,您返回的滚动 ID 和超时对于下一页都是有效的。这里的一个常见错误是指定一个非常大的超时(值为scroll),这将涵盖处理整个数据集(例如 1M 条记录)而不是一页(例如 100 条记录)。

要获取下一页,请填写最后一个滚动 ID 和超时,该超时应持续到获取以下页面:

curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
  "scroll": "1m",
  "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'

如果您有很多要导出的内容(例如 1B 文档),您将需要并行化。这可以通过切片滚动来完成。假设您要在 10 个线程上导出。第一个线程会发出这样的请求:

curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
  "slice": {
    "id": 0, 
    "max": 10 
  }
}'

你会得到第一页和一个滚动 ID,就像一个普通的滚动请求一样。你会像普通滚动一样使用它,除了你得到 1/10 的数据。

其他线程也会这样做,除了id1, 2, 3...

于 2020-03-06T11:01:56.607 回答
6

调整大小的最佳方法是在 URL 前面使用 size= number

Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"

注意:可以在此大小中定义的最大值为 10000。对于任何超过一万的值,它希望您使用滚动功能,这将最大限度地减少对性能的影响。

于 2016-08-10T13:11:25.607 回答
5

简单的!你可以使用sizefrom参数!

http://localhost:9200/[your index name]/_search?size=1000&from=0

然后你from逐渐改变,直到你得到所有的数据。

于 2015-12-14T10:29:43.257 回答
5

来自 Kibana DevTools:

GET my_index_name/_search
{
  "query": {
    "match_all": {}
  }
}
于 2019-02-25T07:45:05.330 回答
5

您可以使用_countAPI 获取size参数的值:

http://localhost:9200/foo/_count?q=<your query>

退货{count:X, ...}。提取值“X”,然后执行实际查询:

http://localhost:9200/foo/_search?q=<your query>&size=X
于 2017-06-16T21:43:07.597 回答
5

您实际上不需要将正文传递给match_all,可以通过对以下 URL 的 GET 请求来完成。这是最简单的形式。

http://localhost:9200/foo/_search

于 2021-02-19T15:13:32.403 回答
4

使用 python 包elasticsearch-dsl的简单解决方案:

from elasticsearch_dsl import Search
from elasticsearch_dsl import connections

connections.create_connection(hosts=['localhost'])

s = Search(index="foo")
response = s.scan()

count = 0
for hit in response:
    # print(hit.to_dict())  # be careful, it will printout every hit in your index
    count += 1

print(count)

另请参阅https://elasticsearch-dsl.readthedocs.io/en/latest/api.html#elasticsearch_dsl.Search.scan

于 2019-05-02T13:14:47.953 回答
4

size参数将显示的命中数从默认值 (10) 增加到 500。

http://localhost:9200/[indexName]/_search?pretty=true&size=500&q=*:*

逐步更改from以获取所有数据。

http://localhost:9200/[indexName]/_search?size=500&from=0
于 2018-01-25T08:12:01.893 回答
4

http://localhost:9200/foo/_search/大小=1000&漂亮=1

您需要指定 size 查询参数,默认为 10

于 2017-04-21T10:03:22.830 回答
4

使用 kibana 控制台和 my_index 作为索引来搜索以下内容可以贡献。要求索引只返回索引的 4 个字段,您还可以添加大小以指示您希望索引返回多少个文档。从 ES 7.6 开始,您应该使用 _source 而不是 filter 它将响应更快。

GET /address/_search
 {
   "_source": ["streetaddress","city","state","postcode"],
   "size": 100,
   "query":{
   "match_all":{ }
    }   
 }
于 2020-03-14T20:38:10.407 回答
3

对于 Elasticsearch 6.x

要求:GET /foo/_search?pretty=true

响应:在 Hits-> total 中,给出文档的数量

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1001,
        "max_score": 1,
        "hits": [
          {
于 2018-04-24T16:13:15.353 回答
2
curl -X GET 'localhost:9200/foo/_search?q=*&pretty' 
于 2018-05-22T09:49:20.920 回答
2

默认情况下,Elasticsearch 返回 10 条记录,因此应明确提供大小。

随请求添加大小以获取所需的记录数。

http://{host}:9200/{index_name}/_search?pretty=true&size=(记录数)

注意:最大页面大小不能超过 index.max_result_window 索引设置,默认为 10,000。

于 2018-09-28T23:59:17.843 回答
1

如果仍然有人像我一样为某些用例寻找要从 Elasticsearch 检索的所有数据,这就是我所做的。此外,所有数据意味着,所有索引和所有文档类型。我正在使用 Elasticsearch 6.3

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

弹性搜索参考

于 2018-08-10T06:51:26.050 回答
1

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

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

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

于 2018-12-11T10:36:39.010 回答
1

通过提供大小,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" : "" 
}'
于 2018-07-24T10:59:09.997 回答
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,
       ...
于 2018-02-14T17:39:17.337 回答
0

这是完成您想要的查询,(我建议使用 Kibana,因为它有助于更​​好地理解查询)

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

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

size 是您要获取的记录数(限制类型)。默认情况下,ES 只会返回 10 条记录

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

如果您想准确地获取所有记录,只需在您从 Kibana 中点击此查询并将其与“size”一起使用后,使用结果中“total”字段中的值即可。

于 2019-06-01T15:14:38.443 回答
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
于 2020-03-05T16:17:01.803 回答
0

除了@Akira Sendoh,没有人回答过如何实际获取所有文档。但即使该解决方案在没有日志的情况下也会使我的ES 6.3服务崩溃。使用低级elasticsearch-py库对我有用的唯一方法是通过使用api的扫描助手:scroll()

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

于 2018-08-08T21:29:03.217 回答
0
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'
于 2018-03-27T18:39:32.463 回答
-5

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

curl -XGET 'localhost:9200/index/type/_search' -d '
{
   size:0,
   "query" : {
   "match_all" : {}
    }
}'
于 2017-01-03T11:16:54.183 回答