Elasticsearch query to return all records
我在Elasticsearch中有一个小型数据库,出于测试目的,我希望将所有记录拉回来。 我试图使用表单的URL ...
1 | http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}} |
有人可以给我你用来完成这个的URL吗?
我认为支持lucene语法,所以:
size默认为10,因此您可能还需要
但是,elasticsearch文档建议使用扫描搜索类型来获取大型结果集。
例如:
1 2 3 4 5 6 | curl -XGET 'localhost:9200/foo/_search?search_type=scan&scroll=10m&size=50' -d ' { "query" : { "match_all" : {} } }' |
然后根据上面的文档链接继续请求建议。
编辑:
1 2 | 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
elasticsearch(ES)支持从ES集群索引获取数据的GET或POST请求。
当我们做GET时:
1 | http://localhost:9200/[your index name]/_search?size=[no of records you want]&q=*:* |
当我们做POST时:
1 2 3 4 5 6 7 8 9 | 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/
这将帮助您更好地了解您创建的索引并测试索引。
Note: The answer relates to an older version of Elasticsearch
0.90 . Versions released since then have an updated syntax. Please refer to other answers that may provide a more accurate answer to the latest answer that you are looking for.
下面的查询将返回您想要返回的NO_OF_RESULTS。
1 2 3 4 5 6 | curl -XGET 'localhost:9200/foo/_search?size=NO_OF_RESULTS' -d ' { "query" : { "match_all" : {} } }' |
现在,这里的问题是你想要返回所有记录。很自然地,在编写查询之前,您不会知道NO_OF_RESULTS的值。
我们如何知道您的文档中存在多少条记录?只需在下面输入查询即可
1 | curl -XGET 'localhost:9200/foo/_search' -d ' |
这会给你一个看起来像下面的结果
1 2 3 4 5 6 | { hits" : { "total" : 2357, "hits" : [ { .................. |
结果总计告诉您文档中有多少记录可用。所以,这是了解NO_OF结果值的好方法
1 | curl -XGET 'localhost:9200/_search' -d ' |
搜索所有索引中的所有类型
1 | curl -XGET 'localhost:9200/foo/_search' -d ' |
搜索foo索引中的所有类型
1 | curl -XGET 'localhost:9200/foo1,foo2/_search' -d ' |
搜索foo1和foo2索引中的所有类型
1 | curl -XGET 'localhost:9200/f*/_search |
搜索以f开头的任何索引中的所有类型
1 | curl -XGET 'localhost:9200/_all/type1,type2/_search' -d ' |
在所有索引中搜索类型用户和推文
这是我使用python客户端找到的最佳解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 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客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
使用
如果你想要提取数千条记录,那么......有些人给出了使用"滚动"的正确答案(注意:有些人还建议使用"search_type = scan"。这已被弃用,并在v5.0中删除了。你不需要它)
从"搜索"查询开始,但指定"滚动"参数(此处我使用1分钟超时):
1 2 3 4 5 6 7 | curl -XGET 'http://ip1:9200/myindex/_search?scroll=1m' -d ' { "query": { "match_all" : {} } } ' |
这包括你的第一批"点击"。但我们没有在这里完成。上面的curl命令的输出将是这样的:
1 | {"_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非常重要,接下来应运行以下命令:
1 2 3 4 5 6 | curl -XGET 'localhost:9200/_search/scroll' -d' { "scroll" :"1m", "scroll_id" :"c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1" } ' |
但是,传递scroll_id并不是设计为手动完成的。最好的办法就是编写代码来完成它。例如在java中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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来提取数据。
如果你只是添加一些大数字作为大小,Elasticsearch将变得更慢,一个方法用于获取所有文档使用扫描和滚动ID。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
在Elasticsearch v7.2中,您可以这样做:
1 2 3 4 5 6 7 | POST /foo/_search?scroll=1m { "size": 100, "query": { "match_all": {} } } |
这样的结果将包含一个_scroll_id,你必须查询它以获得下一个100块。
1 2 3 4 5 | POST /_search/scroll { "scroll" :"1m", "scroll_id" :"<YOUR SCROLL ID>" } |
简单!您可以使用
1 | http://localhost:9200/[your index name]/_search?size=1000&from=0 |
然后逐渐更改
调整大小的最佳方法是在URL前面使用size = number
1 | Curl -XGET"http://localhost:9200/logstash-*/_search?size=50&pretty" |
注意:可以在此大小中定义的最大值为10000.对于任何超过一万的值,它希望您使用滚动功能,这将最大限度地减少对性能的影响。
您可以使用
1 | http://localhost:9200/foo/_count?q=<your query> |
返回
1 | http://localhost:9200/foo/_search?q=<your query>&size=X |
?HTTP://本地主机:9200 /富/ _search /尺寸= 1000&安培;漂亮= 1
您需要指定大小查询参数,因为默认值为10
对于Elasticsearch 6.x
要求:
回复:在Hits-> total中,给出文档的计数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | { "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1001, "max_score": 1, "hits": [ { |
size param将显示的命中数从默认值(10)增加到500。
1 | http://localhost:9200/[indexName]/_search?pretty=true&size=500&q=*:* |
逐步更改以获取所有数据。
1 | http://localhost:9200/[indexName]/_search?size=500&from=0 |
1 | curl -X GET 'localhost:9200/foo/_search?q=*&pretty' |
默认情况下,Elasticsearch返回10条记录,因此应明确提供大小。
根据请求添加大小以获得所需的记录数。
http:// {host}:9200 / {index_name} / _search?pretty = true&amp; size =(记录数)
注意 :
最大页面大小不能超过index.max_result_window索引设置,默认为10,000。
官方文档提供了这个问题的答案!你可以在这里找到它。
1 2 3 4 | { "query": {"match_all": {} }, "size": 1 } |
您只需将size(1)替换为您想要查看的结果数量!
来自Kibana DevTools:
1 2 3 4 5 6 | GET my_index_name/_search { "query": { "match_all": {} } } |
弹性搜索返回的最大结果是10000,通过提供大小
1 2 3 4 5 6 7 | curl -XGET 'localhost:9200/index/type/_search?scroll=1m' -d ' { "size":10000, "query" : { "match_all" : {} } }' |
之后,您必须使用Scroll API获取结果并获取_scroll_id值并将此值放在scroll_id中
1 2 3 4 5 | curl -XGET 'localhost:9200/_search/scroll' -d' { "scroll" :"1m", "scroll_id" :"" }' |
这是完成你想要的查询,
(我建议使用Kibana,因为它有助于更??好地理解查询)
1 2 3 4 5 6 7 8 | GET my_index_name/my_type_name/_search { "query":{ "match_all":{} }, size : 20, from : 3 } |
获取所有记录,你必须使用"match_all"查询。
size是要获取的记录数(限制类型)。
默认情况下,ES只返回10条记录
from就像跳过,跳过前3条记录。
如果要准确获取所有记录,只需使用"total"字段中的值
一旦你从Kibana点击这个查询并使用它与"大小",从结果。
要返回所有索引的所有记录,您可以执行以下操作
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | "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 2 3 4 5 6 | curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{ "query": { "filtered": { "query": { "match_all": {} }}' |
没有,除了@Akira Sendoh已经回答了如何实际获得所有文档。但即使是那个解决方案也会在没有日志的情况下崩溃我的ES 6.3服使用低级
1 2 3 4 5 6 7 8 9 10 11 | 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中检索的所有数据用于某些用例,我就是这样做的。而且,所有数据均指,所有索引和所有文档类型。我正在使用Elasticsearch 6.3
1 2 3 4 5 6 7 | curl -X GET"localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d' { "query": { "match_all": {} } } ' |
Elasticsearch参考
使用python包elasticsearch-dsl的简单解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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。
您可以使用size = 0这将返回所有文档
例
1 2 3 4 5 6 7 | curl -XGET 'localhost:9200/index/type/_search' -d ' { size:0, "query" : { "match_all" : {} } }' |