Вернуть все строки в SQL-запросе Elasticsearch
У меня есть простой SQL-запрос в Elasticsearch, который, как я знаю, возвращает менее 100 строк результатов. Как я могу получить все эти результаты сразу (т.е. без использования прокрутки)? Я попробовал limit n
пункт, но это работает, когда n
меньше или равно 10, но не работает, когда n
отлично, чем 10.
Код Python для вызова API-интерфейса Elasticsearch приведен ниже.
import requests
import json
url = 'http://10.204.61.127:9200/_xpack/sql'
headers = {
'Content-Type': 'application/json',
}
query = {
'query': '''
select
date_start,
sum(spend) as spend
from
some_index
where
campaign_id = 790
or
campaign_id = 490
group by
date_start
'''
}
response = requests.post(url, headers=headers, data=json.dumps(query))
Приведенный выше запрос возвращает идентификатор курсора. Я попытался ввести идентификатор курсора в тот же API-интерфейс SQL, но он не дал мне большего результата.
Я также попытался преобразовать вышеуказанный SQL-запрос в собственный запрос Elasticsearch с помощью API-интерфейса SQL translate и обернул его в следующий код Python, но он также не работает. Я все еще получил только 10 строк результатов.
import requests
import json
url = 'http://10.204.61.127:9200/some_index/some_doc/_search'
headers = {
'Content-Type': 'application/json',
}
query = {
"size": 0,
"query": {
"bool": {
"should": [
{
"term": {
"campaign_id.keyword": {
"value": 790,
"boost": 1.0
}
}
},
{
"term": {
"campaign_id.keyword": {
"value": 490,
"boost": 1.0
}
}
}
],
"adjust_pure_negative": True,
"boost": 1.0
}
},
"_source": False,
"stored_fields": "_none_",
"aggregations": {
"groupby": {
"composite": {
"size": 1000,
"sources": [
{
"2735": {
"terms": {
"field": "date_start",
"missing_bucket": False,
"order": "asc"
}
}
}
]
},
"aggregations": {
"2768": {
"sum": {
"field": "spend"
}
}
}
}
}
}
response = requests.post(url, headers=headers, data=json.dumps(query)).json()
2 ответа
POST _sql?format=json
{
"query": "SELECT field1, field2 FROM indexTableName ORDER BY field1",
"fetch_size": 10000
}
Вышеупомянутый запрос вернет курсор в ответе, который необходимо передать при следующем вызове.
POST _sql?format=json
{
"cursor": "g/W******lAAABBwA="
}
Это похоже на обычный метод прокрутки в Elasticsearch.
С эластичным поиском-sql, LIMIT 100
следует перевести на "size": 100
в традиционном запросе DSL. Это вернет до 100 подходящих результатов.
Учитывая этот запрос:
POST _xpack/sql/translate
{
"query":"SELECT FlightNum FROM flights LIMIT 100"
}
Переведенный запрос:
{
"size": 100,
"_source": {
"includes": [
"FlightNum"
],
"excludes": []
},
"sort": [
{
"_doc": {
"order": "asc"
}
}
]
}
Синтаксически LIMIT N
должен делать то, что вы ожидаете. Что касается того, почему вы не видите больше результатов, это, скорее всего, что-то конкретное для вашего индекса, вашего запроса или ваших данных.
Есть настройка index.max_result_window
который может ограничить размер запроса, но по умолчанию он равен 10 КБ, а также должен возвращать ошибку, а не ограничивать результаты.
Упругость поиска ограничена, но если вы используете python, вы можете использовать asticsearc-dsl
from elasticsearch_dsl import Search
q = Q('term', Frequency=self._frequency)
q = q & Q("range", **{'@timestamp': {"from": self._start, "to": self._end}})
Search().query(q).scan()