我在 Elasticsearch 中有一个小型数据库,出于测试目的,我想拉回所有记录。我正在尝试使用表单的 URL...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
有人可以给我你用来完成此任务的 URL,好吗?
我在 Elasticsearch 中有一个小型数据库,出于测试目的,我想拉回所有记录。我正在尝试使用表单的 URL...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
有人可以给我你用来完成此任务的 URL,好吗?
我认为 lucene 语法是这样支持的:
http://localhost:9200/foo/_search?pretty=true&q=*:*
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 中已弃用。
scan
scroll
与按 .排序的常规请求相比,没有提供任何好处_doc
。指向弹性文档的链接(由@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
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": {}
}
}
我建议使用带有弹性搜索的 UI 插件http://mobz.github.io/elasticsearch-head/ 这将帮助您更好地了解您创建的索引并测试您的索引。
注意:答案与旧版本的 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 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 会变得非常慢,一种用于获取所有文档的方法是使用扫描和滚动 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>"
}
如果你想提取数千条记录,那么......有些人给出了使用“滚动”的正确答案(注意:有些人还建议使用“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 来提取数据。
还用于server:9200/_stats
获取有关所有别名的统计信息。例如每个别名的大小和元素数量,这非常有用并提供有用的信息
如果它是一个小数据集(例如 1K 条记录),您可以简单地指定size
:
curl localhost:9200/foo_index/_search?size=1000
不需要match all 查询,因为它是隐式的。
如果你有一个中等大小的数据集,比如 1M 条记录,你可能没有足够的内存来加载它,所以你需要一个scroll。
滚动就像数据库中的游标。在 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,就像一个普通的滚动请求一样。你会像普通滚动一样使用它,除了你得到 1/10 的数据。
其他线程也会这样做,除了id
1, 2, 3...
调整大小的最佳方法是在 URL 前面使用 size= number
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"
注意:可以在此大小中定义的最大值为 10000。对于任何超过一万的值,它希望您使用滚动功能,这将最大限度地减少对性能的影响。
简单的!你可以使用size
和from
参数!
http://localhost:9200/[your index name]/_search?size=1000&from=0
然后你from
逐渐改变,直到你得到所有的数据。
来自 Kibana DevTools:
GET my_index_name/_search
{
"query": {
"match_all": {}
}
}
您可以使用_count
API 获取size
参数的值:
http://localhost:9200/foo/_count?q=<your query>
退货{count:X, ...}
。提取值“X”,然后执行实际查询:
http://localhost:9200/foo/_search?q=<your query>&size=X
您实际上不需要将正文传递给match_all
,可以通过对以下 URL 的 GET 请求来完成。这是最简单的形式。
http://localhost:9200/foo/_search
使用 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。
size参数将显示的命中数从默认值 (10) 增加到 500。
http://localhost:9200/[indexName]/_search?pretty=true&size=500&q=*:*
逐步更改from以获取所有数据。
http://localhost:9200/[indexName]/_search?size=500&from=0
http://localhost:9200/foo/_search/?大小=1000&漂亮=1
您需要指定 size 查询参数,默认为 10
使用 kibana 控制台和 my_index 作为索引来搜索以下内容可以贡献。要求索引只返回索引的 4 个字段,您还可以添加大小以指示您希望索引返回多少个文档。从 ES 7.6 开始,您应该使用 _source 而不是 filter 它将响应更快。
GET /address/_search
{
"_source": ["streetaddress","city","state","postcode"],
"size": 100,
"query":{
"match_all":{ }
}
}
对于 Elasticsearch 6.x
要求:GET /foo/_search?pretty=true
响应:在 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 返回 10 条记录,因此应明确提供大小。
随请求添加大小以获取所需的记录数。
http://{host}:9200/{index_name}/_search?pretty=true&size=(记录数)
注意:最大页面大小不能超过 index.max_result_window 索引设置,默认为 10,000。
如果仍然有人像我一样为某些用例寻找要从 Elasticsearch 检索的所有数据,这就是我所做的。此外,所有数据意味着,所有索引和所有文档类型。我正在使用 Elasticsearch 6.3
curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
通过提供大小,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" : ""
}'
要返回所有索引中的所有记录,您可以执行以下操作:
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,
...
这是完成您想要的查询,(我建议使用 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”一起使用后,使用结果中“total”字段中的值即可。
使用 Elasticsearch 7.5.1
http://${HOST}:9200/${INDEX}/_search?pretty=true&q=*:*&scroll=10m&size=5000
如果您还可以使用 &size=${number} 指定数组的大小
如果你不知道你索引
http://${HOST}:9200/_cat/indices?v
除了@Akira Sendoh,没有人回答过如何实际获取所有文档。但即使该解决方案在没有日志的情况下也会使我的ES 6.3服务崩溃。使用低级elasticsearch-py
库对我有用的唯一方法是通过使用api的扫描助手: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
然而,如今更简洁的方式似乎是通过elasticsearch-dsl
库,它提供更抽象、更简洁的调用,例如:http ://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'
您可以使用 size=0 这将返回您所有的文档示例
curl -XGET 'localhost:9200/index/type/_search' -d '
{
size:0,
"query" : {
"match_all" : {}
}
}'