我在 Elasticsearch 中有一个小型数据库,为了测试目的,我想要拉回所有记录。我尝试使用以下形式的 URL...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
请问有人可以给我实现这个功能所需的URL吗?
我在 Elasticsearch 中有一个小型数据库,为了测试目的,我想要拉回所有记录。我尝试使用以下形式的 URL...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
请问有人可以给我实现这个功能所需的URL吗?
http://localhost:9200/foo/_search?pretty=true&q=*:*
大小默认为10,所以您可能还需要&size=BIGNUMBER
来获取超过10个项目。(其中BIGNUMBER等于您认为比数据集更大的数字)
但是,Elasticsearch文档建议对于大量结果集使用扫描搜索类型。
例如:
curl -XGET 'localhost:9200/foo/_search?search_type=scan&scroll=10m&size=50' -d '
{
"query" : {
"match_all" : {}
}
}'
scan
已被弃用。
scan
与按_doc
排序的常规scroll
请求相比没有任何优势。指向elastic文档的链接(由@christophe-roussy发现)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
max_result_window
的限制。 - steliospretty
参数设置为布尔类型:curl -XGET 'localhost:9200/logs/_search/?size=1000&pretty=true'
。 - Yarq
。谢谢! - asgselasticsearch(ES)支持使用GET或POST请求从ES集群索引中获取数据。
当我们使用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/,这将帮助您更好地了解您创建的索引,并测试您的索引。
from
+ size
不能超过默认为10,000的 index.max_result_window
索引设置。 - stelioscurl -XGET ... -d '{...}'
这种非正式的混合请求方式。感谢您展示了正确的 GET 和 POST 格式。 - Jesse Chisholm注意: 此答案相关的是较旧版本的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" : [
{
..................
结果total告诉您文档中有多少条记录可用。因此,这是了解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 '
在所有索引中搜索用户和推文类型
我发现使用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
elasticsearch_dsl==5.4.0
,并且它可以在不使用 search_type = 'scan'
的情况下工作。 - Usman Maqboolsize=10000
滚动查看110k个文档,在第5-7次迭代之间出现了status=127
、main ERROR Null object returned for RollingFile in Appenders
、main ERROR Unable to locate appender "rolling" for logger config "root"
的错误。
在/var/log/elasticsearch/elasticsearch.log
中没有日志。 - steliossearch_type = 'scan'
已被弃用。不使用此代码也能实现类似功能,虽然在旧文档中存在一些有趣的差异,这些差异并不明显。 https://www.elastic.co/guide/en/elasticsearch/reference/1.4/search-request-scroll.html#scroll-scan 特别是,在迁移以不使用search_type=scan
时,第一个“search”查询将携带第一批要处理的结果。 - Harry Wood如果数据集很小(例如1K条记录),您可以简单地指定size
:
curl localhost:9200/foo_index/_search?size=1000
匹配所有查询不需要,因为它是隐含的。
如果您有一个中等大小的数据集,比如1M记录,您可能没有足够的内存来加载它,所以您需要使用滚动。
滚动就像数据库中的游标。在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=="
}'
如果您需要导出大量数据(例如10亿份文档),您需要进行并行处理。可以使用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……
[ ]
)返回问题。 - Kalnode如果您想要获取数千条记录,那么使用“scroll”是正确的答案(注意:有些人建议使用“search_type=scan”。但这已经被弃用,在v5.0中已经移除。您不需要它)
从“search”查询开始,但指定一个“scroll”参数(这里我使用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();
现在使用SearchResponse循环最后一个命令以提取数据。
如果您只是添加了一些大数字作为大小,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,您需要查询该ID以获取下一个100个文档块。
POST /_search/scroll
{
"scroll" : "1m",
"scroll_id" : "<YOUR SCROLL ID>"
}
search_type=scan
现在已经被弃用了,所以你应该将其删除,但是行为有了一些变化。第一批数据从初始搜索调用中返回。你提供的链接确实展示了正确的做法。 - Harry Wood使用server:9200/_stats
可以获取有关所有别名的统计信息,例如每个别名的大小和元素数量,这非常有用并提供了有帮助的信息。
match_all
,只需通过GET请求访问以下URL即可完成。这是最简单的形式。http://localhost:9200/foo/_search
http://curl -XGET 'localhost:9200/foo/_search'
。 - Mr. N