Elasticsearch查询返回所有记录

时间:2012-01-12 02:41:26

标签: database elasticsearch bigdata query-string elasticsearch-dsl

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

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

有人可以给我一个你用来完成此任务的网址吗?

30 个答案:

答案 0 :(得分:652)

我认为支持lucene语法:

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

尺寸默认为10,因此您可能还需要&size=BIGNUMBER才能获得超过10件商品。 (其中BIGNUMBER等于您认为比您的数据集更大的数字)

但是,弹性搜索文档suggests用于使用扫描搜索类型的大型结果集。

EG:

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

然后根据上面的文档链接继续请求。

编辑:scan在2.1.0中弃用。

scan排序的常规scroll请求相比,

_doc不提供任何好处。 link to elastic docs(由@ christophe-roussy发现)

答案 1 :(得分:121)

http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1
                                   ^

请注意尺寸参数,这会将默认(10)显示的点击次数增加到每个碎片1000次。

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

答案 2 :(得分:30)

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": {}
   }
}   

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

答案 3 :(得分:23)

  

注意:答案与旧版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结果的价值的好方法

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 '

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

答案 4 :(得分:17)

This is the best solution I found using python client

  # 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

Using java client

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

答案 5 :(得分:10)

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

答案 6 :(得分:8)

如果您想要提取数千条记录,那么......有些人给出了使用“滚动”的正确答案。 (注意:有些人还建议使用" 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来提取数据。

答案 7 :(得分:7)

如果您只是添加一些大号作为大小,Elasticsearch将会变得显着更慢,一种方法用于使所有文档都使用扫描和滚动ID。

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

答案 8 :(得分:7)

简单!您可以使用sizefrom参数!

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

然后逐渐更改from,直到获得所有数据。

答案 9 :(得分:6)

调整尺寸的最佳方法是在网址前面使用尺寸= 数字

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

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

答案 10 :(得分:6)

如果数据集很小(例如1K条记录),则只需指定size

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

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

如果您有一个中等大小的数据集(例如1M记录),则可能没有足够的内存来加载它,因此您需要使用scroll

滚动就像是数据库中的光标。在Elasticsearch中,它会记住您离开的地方并保持相同的索引视图(即,阻止搜索者离开refresh,阻止segments from merging)。

在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文档),则需要并行化。可以通过sliced scroll完成。假设您要导出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之外,您将像使用普通滚动一样完全消耗它。

其他线程将执行相同的操作,只是id将是1、2、3 ...

答案 11 :(得分:5)

How to configure maven project to deploy both snapshot and releases to Nexus?尺寸 = 1000&安培;漂亮= 1

您需要指定大小查询参数,因为默认值为10

答案 12 :(得分:5)

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

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

返回{count:X, ...}。提取价值&#39; X&#39;然后执行实际查询:

http://localhost:9200/foo/_search?q=<your query>&size=X

答案 13 :(得分:3)

尺寸参数会将显示的匹配数从默认值(10)增加到500.

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

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

http://localhost:9200/[indexName]/_search?size=500&from=0

答案 14 :(得分:3)

对于Elasticsearch 6.x

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

回复:在命中 - >总计,给出文件的计数

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1001,
        "max_score": 1,
        "hits": [
          {

答案 15 :(得分:2)

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

http://localhost:9200/foo/_search

答案 16 :(得分:2)

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

GET /address/_search
 {
   "_source": ["streetaddress","city","state","postcode"],
   "size": 100,
   "query":{
   "match_all":{ }
    }   
 }

答案 17 :(得分:2)

从Kibana DevTools获得:

GET my_index_name/_search
{
  "query": {
    "match_all": {}
  }
}

答案 18 :(得分:2)

官方文档提供了此问题的答案!您可以找到它here

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

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

答案 19 :(得分:2)

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

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

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

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

答案 20 :(得分:2)

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

答案 21 :(得分:0)

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

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

Elasticsearch reference

答案 22 :(得分:0)

除@Akira Sendoh以外,没有其他人回答了如何实际获取所有文档。但是,即使该解决方案也使我的 ES 6.3 服务崩溃而没有日志。使用低级install库对我有用的唯一方法是通过使用elasticsearch-py api的scan helper

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 库,该库提供了更抽象,更简洁的调用,例如:http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits

答案 23 :(得分:0)

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" : "" 
}'

答案 24 :(得分:0)

使用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

答案 25 :(得分: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”一起使用,便会从结果中获取数据。

答案 26 :(得分: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

答案 27 :(得分:0)

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

答案 28 :(得分:0)

要返回所有索引中的所有记录,您可以执行以下操作:

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,
       ...

答案 29 :(得分:-5)

你可以使用size = 0这将返回所有文件 示例

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