Elasticsearch查询返回所有记录

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

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

有人能给我你要用来完成这个的URL吗?

887329 次浏览

我认为lucene语法是受支持的,所以:

# EYZ0

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中已弃用。

与按_doc排序的常规scroll请求相比,scan并不提供任何好处。链接到弹性文档(由@christophe-roussy发现)

答案与Elasticsearch的旧版本有关。此后发布的版本有了更新的语法。请参考其他可能为您正在寻找的最新答案提供更准确答案的答案。

下面的查询将返回您希望返回的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 '

在所有索引中搜索user和tweet类型

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 < a href = " http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html " > < / >

使用server:9200/_stats还可以获得所有别名的统计数据。就像每个别名的大小和元素数量一样,这非常有用,并提供了有用的信息

elasticsearch(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

如果你只是添加一些大的数字作为大小,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>"
}

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

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

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

如果你想提取成千上万的记录,那么……少数人给出了使用'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":[]}}

It's important to have _scroll_id handy as next you should run the following command:

    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来提取数据。

这是我使用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

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

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

注:此尺寸可定义的最大值为10000。对于任何高于10,000的值,它希望您使用滚动函数,这将最大限度地减少对性能的影响。

你可以使用size=0,这将返回你所有的文档 示例< / p >
curl -XGET 'localhost:9200/index/type/_search' -d '
{
size:0,
"query" : {
"match_all" : {}
}
}'

# EYZ0 ? # EYZ1 = 1000,漂亮= 1

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

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

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

返回# EYZ0。提取值'X',然后执行实际查询:

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

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

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

Change the from step by step to get all the data.

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

要从所有索引中返回所有记录,您可以执行:

# EYZ0

输出:

  "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,
...
curl -XGET '\{\{IP/localhost}}:9200/\{\{Index name}}/\{\{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'

Elasticsearch 6.x

要求:# EYZ0

Response:在Hits-> total中,给出文档的计数

    {
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1001,
"max_score": 1,
"hits": [
{
curl -X GET 'localhost:9200/foo/_search?q=*&pretty'

通过提供大小,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" : ""
}'

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

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

如果仍然有人像我一样寻找从Elasticsearch中检索的所有数据,下面是我所做的。此外,所有的数据意味着,所有的索引和所有的文档类型。我使用的是Elasticsearch 6.3

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

Elasticsearch reference

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

添加大小与请求,以获得所需的记录数量。

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

< p >注意: 最大页面大小不能超过索引。Max_result_window索引设置,默认值为10,000

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

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

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

来自Kibana DevTools的:

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

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

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

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

要获得所有的记录,你必须使用“match_all”查询。

size是你想要获取的记录的数量(一种限制)。 默认情况下,ES只返回10条

的记录

从就像跳过,跳过前3个记录。

如果你想获取所有的记录,只需使用“total”字段的值 当你从Kibana中命中这个查询时,从结果中使用"size".

使用Elasticsearch 7.5.1

http://${HOST}:9200/${INDEX}/_search?pretty=true&q=*:*&scroll=10m&size=5000

如果你也可以用&size=${number}来指定数组的大小

以防你不知道你的索引

http://${HOST}:9200/_cat/indices?v

如果它是一个小数据集(例如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=="
}'

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

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

您将返回第一页和一个滚动ID,与正常的滚动请求完全相同。你会像普通的滚动一样使用它,除了你得到的数据只有十分之一。

其他线程也会这样做,除了id将是1,2,3…

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

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

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

# EYZ0