Запрос Elasticsearch для возврата всех записей
У меня есть небольшая база данных в Elasticsearch и в целях тестирования хотел бы вытащить все записи обратно. Я пытаюсь использовать URL-адрес формы...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
может кто-нибудь дать мне URL, который вы бы использовали для этого, пожалуйста?
22 ответов:
Я думаю, что синтаксис lucene поддерживается так:
http://localhost:9200/foo/_search?pretty=true&q=*:*размер по умолчанию 10, так что вам также может понадобиться
&size=BIGNUMBERчтобы получить более 10 предметов. (где BIGNUMBER равно числу, которое вы считаете больше, чем ваш набор данных)но, elasticsearch documentation предполагает для больших результирующих наборов, используя сканирование тип поиска.
например:
curl -XGET 'localhost:9200/foo/_search?search_type=scan&scroll=10m&size=50' -d ' { "query" : { "match_all" : {} } }'а затем продолжайте запрашивать в соответствии с приведенной выше ссылкой на документацию предлагает.
EDIT:
scanосуждается в 2.1.0.
scanне дает никаких преимуществ по сравнению с обычнымscrollзапрос отсортированный по_doc. ссылка на elastic docs (замечено @christophe-roussy)
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1 ^обратите внимание на размер param, что увеличивает количество попаданий, отображаемых по умолчанию (10) до 1000 на каждый осколок.
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html
elasticsearch (ES) поддерживает запрос GET или POST для получения данных из индекса кластера ES.
когда мы делаем GET:
http://localhost:9200/[your index name]/_search?size=[no of records you want]&q=*:*когда мы делаем сообщение:
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/ Это поможет вам получить лучшее представление о индексах, которые вы создаете, а также проверить свои индексы.
запрос ниже будет возвращать 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 'Поиск типов пользователей и твитов во всех индексах
Это лучшее решение, которое я нашел с помощью python client
# 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 pagehttps://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
использовать
server:9200/_statsтакже, чтобы получить статистику обо всех ваших псевдонимах.. как размер и количество элементов на псевдоним, это очень полезно и предоставляет полезную информацию
Elasticsearch получит значительное медленнее если вы просто добавляете какое-то большое число в качестве размера, один из методов для получения всех документов использует сканирование и прокрутку идентификаторов.
Так что ваш вызов будет:
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= перед URL
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"Примечание: максимальное значение, которое может быть определено в этом размере 10000. Для любого значения выше десяти тысяч он ожидает, что вы будете использовать функцию прокрутки, которая минимизирует любые шансы влияния на производительность.
http://localhost:9200/foo/_search/?в размере=1000&довольно=1
вам нужно будет указать параметр запроса размера по умолчанию 10
можно использовать
_countAPI, чтобы получить значение
некоторые из них дали правильный ответ с помощью сканирования и прокрутки, по-видимому, я не мог получить полный ответ, который бы волшебным образом работал. Когда кто-то хочет вытащить записи, то нужно запустить следующую команду 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 запустить следующую команду
, Я не думаю, что его легко запустить вручную. Лучше всего написать java-код, чтобы сделать то же самое.curl -XGET 'localhost:9200/_search/scroll' -d' { "scroll" : "1m", "scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1" } '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 6.x
запрос:
GET /foo/_search?pretty=trueответ: в хитах - > всего, дайте количество документов
{ "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1001, "max_score": 1, "hits": [ {
в размере param увеличивает хиты, отображаемые от значения по умолчанию (10) до 500.
http://localhost:9200/[indexName]/_search?pretty=true&size=500&q=*:*изменить С шаг за шагом, чтобы получить все данные.
http://localhost:9200/[indexName]/_search?size=500&from=0
по умолчанию Elasticsearch возвращает 10 записей, поэтому размер должен быть указан явно.
добавить размер с запросом, чтобы получить желаемое количество записей.
http://{host}: 9200 / {index_name} / _search?pretty=true & size=(количество записей)
Примечание. : Максимальный размер страницы не может быть больше индекса.значение индекса max_result_window по умолчанию равно 10 000.
чтобы вернуть все записи из всех показателей можно сделать:
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, ...
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{ "query": { "filtered": { "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" : "" }'
никто, кроме @Akira Sendoh, не ответил, как на самом деле получить все документы. Но даже это решение разбивает мой ES 6.3 сервис без логов. Единственное, что работало для меня с помощью низкого уровня
elasticsearch-pyбиблиотека была через scan helper использует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, как я для некоторых usecases, вот что я сделал. Кроме того, все данные означают, все индексы и все типы документов. Я использую Elasticsearch 6.3
curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d' { "query": { "match_all": {} } } '
вы можете использовать size=0 это вернет вам все документы пример
curl -XGET 'localhost:9200/index/type/_search' -d ' { size:0, "query" : { "match_all" : {} } }'
Comments