Elasticsearch查询返回所有记录
我在Elasticsearch中有一个小型数据库,并且为了测试目的想要将所有记录都拉回来。我试图使用的形式的URL ...Elasticsearch查询返回所有记录
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
有人可以给我的URL你会用来完成这个,请?
我认为Lucene的语法支撑:
http://localhost:9200/foo/_search?pretty=true&q=*:*
大小默认为10,所以您可能还需要&size=BIGNUMBER
获得10余项。 (其中BIGNUMBER等于你认为比你的数据集大的数字)
但是,elasticsearch文档suggests对于大型结果集,使用扫描搜索类型。
EG:
curl -XGET 'localhost:9200/foo/_search?search_type=scan&scroll=10m&size=50' -d '
{
"query" : {
"match_all" : {}
}
}'
,然后继续要求按照上面的文档链接提示。
编辑:scan
在2.1.0中不推荐使用。
scan
与按照_doc
排序的常规scroll
请求相比不提供任何优惠。 link to elastic docs(由@克里斯托夫 - 鲁西看准)
查询下面将返回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 '
搜寻所有类型的富指数
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 '
搜索类型的用户,并在所有指数鸣叫
默认情况下,ES将返回10个结果,除非基本查询中包含大小参数。 – lfender6445 2014-04-07 03:11:39
以前的回答是三岁。将其更新为当前版本。 – vjpan8564 2015-07-11 18:19:59
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文档):请注意,从+大小不能超过index.max_result_window索引设置,默认值为10,000。 – user3078523 2018-02-14 11:47:32
使用server:9200/_stats
也让你所有的别名统计..喜欢的大小和每别名元素的数量,这是非常有用的,并提供有用的信息
但是,从我记得,ES只允许每个请求获得16000个数据。所以如果数据超过16000,这个解决方案是不够的。 – 2016-04-23 22:48:23
elasticsearch(ES)同时支持GET或从ES集群索引获取数据的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插件,这将有助于你得到一个更好的感觉您创建的指数,并测试您的指数。
Elasticsearch将获得显着较慢,如果你只是添加一个大号作为大小,一种方法来使用获取所有文件正在使用扫描和滚动ID。
所以,你的电话是:
GET /foo/_search?search_type=scan&scroll=1m
{
"query": { "match_all": {}},
"size": 1000
}
这将返回一个_scroll_id,你现在可以用它来得到第一批文件。
https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html
简单!您可以使用size
和from
参数!
http://localhost:9200/[your index name]/_search?size=1000&from=0
然后您逐渐更改from
,直到您获取所有数据。
如果数据中包含很多文档,请不要使用此方法...每次进入“下一页”弹性将变得越来越慢!使用SearchAfter代替 – Joshlo 2017-07-20 13:25:57
他们中的一些人给出了使用扫描和滚动的正确答案,显然,我无法得到一个可以神奇地工作的完整答案。当有人想要拉记录时,必须按照curl命令运行。
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方便,因为第二天你SHD运行以下命令
curl -XGET 'localhost:9200/_search/scroll' -d'
{
"scroll" : "1m",
"scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"
}
'
不过,我不认为它容易手动运行。你最好的选择是编写一个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来提取数据。
这是最好的解决方案,我发现使用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
的最佳方式来调整大小使用size = numbe [R在URL
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"
注面前:最大值可以在这个尺寸可以定义为10000一万以上的任何值,预计您使用滚动功能这将最大限度地减少影响到性能的任何机会。
由于哪个版本的最大尺寸发生了? – WoodyDRN 2017-02-04 01:10:51
您可以使用尺寸= 0这将返回所有的文件 例如
curl -XGET 'localhost:9200/index/type/_search' -d '
{
size:0,
"query" : {
"match_all" : {}
}
}'
这将返回一个累积的信息,但不是点击自己 – user732456 2017-03-30 13:17:18
对不起,我必须downvote误导 – 2017-07-13 06:40:21
http://localhost:9200/foo/_search/? 大小 = 1000 &漂亮= 1
你需要指定大小的查询参数的默认值是10
它的工作谢谢 – 2017-06-06 15:00:52
欢迎您@ hamzeh.hanandeh .....很高兴这有助于别人 – 2017-06-06 16:20:04
您可以使用_count
API来获取价值,为size
参数:
http://localhost:9200/foo/_count?q=<your query>
返回{count:X, ...}
。提取值 'X',然后执行实际查询:
http://localhost:9200/foo/_search?q=<your query>&size=X
大小 PARAM增加从默认显示的点击数(10)500
http://localhost:9200/[indexName]/_search?pretty=true&size=500&q=*:*
更改从步逐步获取所有数据。
http://localhost:9200/[indexName]/_search?size=500&from=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,
...
感谢。这是最后我想出了,返回我现在需要的... http:// localhost:9200/foo/_search?size = 50&pretty = true&q = *:* – 2012-01-12 09:41:09
添加到@ Steve的答案,你可以找到一个elasticsearch在此链接中可以理解的参数列表http://www.elasticsearch.org/guide/reference/api/search/uri-request/ – 2013-07-31 08:36:51
是否有可能使用match_all查询以外的查询运行扫描搜索? – Churro 2013-09-10 20:30:23