Запрос Elasticsearch для возврата всех записей
У меня есть небольшая база данных в Elasticsearch, и в целях тестирования я хотел бы получить все записи обратно. Я пытаюсь использовать URL-адрес в форме...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
Может кто-нибудь дать мне URL, который вы бы использовали для этого, пожалуйста?
30 ответов
Я думаю, что синтаксис Lucene поддерживается так:
http://localhost:9200/foo/_search?pretty=true&q=*:*
размер по умолчанию равен 10, поэтому вам также может понадобиться &size=BIGNUMBER
чтобы получить более 10 предметов. (где BIGNUMBER равен числу, которое, по вашему мнению, больше, чем ваш набор данных)
НО, документация asticsearch предлагает для больших наборов результатов, используя тип поиска сканирования.
НАПРИМЕР:
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
^
Обратите внимание на параметр размера, который увеличивает количество отображаемых обращений со значения по умолчанию (10) до 1000 за шард.
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html
asticsearch(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": {}
}
}
Я бы предложил использовать плагин для пользовательского интерфейса с asticsearch http://mobz.github.io/elasticsearch-head/ Это поможет вам лучше понять создаваемые вами индексы, а также протестировать ваши индексы.
Приведенный ниже запрос вернет 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
Если это небольшой набор данных (например, 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,
...
Помните, что возвращаемый идентификатор прокрутки и время ожидания действительны для следующей страницы. Распространенной ошибкой здесь является указание очень большого тайм-аута (значениеscroll
), который будет охватывать обработку всего набора данных (например, 1 млн записей) вместо одной страницы (например, 100 записей).
Чтобы перейти на следующую страницу, введите последний идентификатор прокрутки и таймаут, который должен длиться до загрузки следующей страницы:
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
}
}'
Вы возвращаете первую страницу и идентификатор прокрутки, как при обычном запросе прокрутки. Вы бы использовали его точно так же, как обычный скролл, за исключением того, что вы получаете 1/10 данных.
Другие потоки будут делать то же самое, за исключением того, что id
будет 1, 2, 3...
Если вы хотите извлечь много тысяч записей, тогда... несколько человек дали правильный ответ с помощью '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==","взял":109,"timed_out" ложь "_ Осколки":{"всего":5,"успешно":5,"не":0},"хиты":{"всего":22601357,"max_score":0.0,"хиты":[]}}
Важно иметь под рукой _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 для извлечения данных.
Elasticsearch станет значительно медленнее, если вы просто добавите в качестве размера какое-то большое число, и один из способов получения всех документов - использовать идентификаторы сканирования и прокрутки.
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
Использование server:9200/_stats
также для получения статистики обо всех ваших псевдонимах, таких как размер и количество элементов на псевдоним, это очень полезно и предоставляет полезную информацию
На самом деле вам не нужно передавать тело
match_all
, это можно сделать с помощью запроса GET по следующему URL-адресу. Это самая простая форма.
http://localhost:9200/foo/_search
Вы можете использовать _count
API, чтобы получить значение для size
параметр:
http://localhost:9200/foo/_count?q=<your query>
Возвращает {count:X, ...}
, Извлеките значение 'X', а затем выполните фактический запрос:
http://localhost:9200/foo/_search?q=<your query>&size=X
Просто! Ты можешь использовать size
а также from
параметр!
http://localhost:9200/[your index name]/_search?size=1000&from=0
тогда вы меняете from
постепенно, пока вы не получите все данные.
Лучший способ отрегулировать размер - использовать размер =число перед URL
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"
Примечание. Максимальное значение, которое можно определить в этом размере, составляет 10000. Для любого значения, превышающего десять тысяч, ожидается, что вы будете использовать функцию прокрутки, которая сведет к минимуму любые шансы воздействия на производительность.
http://localhost:9200/foo/_search/?размер=1000& красивая = 1
вам нужно будет указать параметр запроса размера по умолчанию 10
От Kibana DevTools его:
GET my_index_name/_search
{
"query": {
"match_all": {}
}
}
Параметр size увеличивает количество отображаемых обращений со значения по умолчанию (10) до 500.
HTTP: // локальный:9200/[IndexName]/_search довольно = верно и размер =500& Q =*:*
Измените шаг за шагом, чтобы получить все данные.
HTTP: // локальный:9200/[имя_индекс] / _search размера =500& от 0 =
Используя консоль kibana и my_index в качестве индекса для поиска, можно добавить следующее. Требуя, чтобы индекс возвращал только 4 поля индекса, вы также можете добавить размер, чтобы указать, сколько документов вы хотите вернуть с помощью индекса. Начиная с ES 7.6 вы должны использовать _source, а не фильтровать, он будет реагировать быстрее.
GET /address/_search
{
"_source": ["streetaddress","city","state","postcode"],
"size": 100,
"query":{
"match_all":{ }
}
}
Простое решение с использованием пакета pythonasticsearch-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 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": [
{
По умолчанию Elasticsearch возвращает 10 записей, поэтому размер должен быть указан явно.
Добавьте размер с запросом, чтобы получить желаемое количество записей.
http: // {host}: 9200 / {index_name} / _search? pretty = true & size = (количество записей)
Примечание. Максимальный размер страницы не может быть больше, чем значение индекса index.max_result_window, которое по умолчанию равно 10 000.
Официальная документация дает ответ на этот вопрос! Вы можете найти это здесь.
{
"query": { "match_all": {} },
"size": 1
}
Вы просто заменяете size (1) на количество результатов, которое хотите увидеть!
Максимальный результат, который будет возвращаться с помощью asticSearch, составляет 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" : ""
}'
Если до сих пор кто-то ищет все данные, которые будут получены от Elasticsearch, как я, для некоторых случаев, вот что я сделал. Более того, все данные означают все индексы и все типы документов. Я использую Elasticsearch 6.3
curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
Чтобы вернуть все записи из всех индексов, вы можете сделать:
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".
Размер - это количество записей, которые вы хотите получить (ограничение). по умолчанию ES вернет только 10 записей
от как пропустить, пропустить первые 3 записи.
Если вы хотите извлечь все записи, просто используйте значение из поля "итоги" из результата, как только вы нажмете на этот запрос из Кибаны, и используйте его с "размером".
Использование Elasticsearch 7.5.1
http://${HOST}:9200/${INDEX}/_search?pretty=true&q=*:*&scroll=10m&size=5000
в случае, если вы также можете указать размер вашего массива с помощью &size=${number}
если вы не знаете, что индекс
http://${HOST}:9200/_cat/indices?v
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'
Никто, кроме @Akira Sendoh не ответил, как на самом деле получить ВСЕ документы. Но даже это решение приводит к сбою моего сервиса ES 6.3 без логов. Единственное, что сработало у меня при использовании низкого уровня elasticsearch-py
библиотека была через сканирование помощник, который использует 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
Вы можете использовать размер =0, это вернет вам все документы пример
curl -XGET 'localhost:9200/index/type/_search' -d '
{
size:0,
"query" : {
"match_all" : {}
}
}'