Вернуть все строки в запросе Elasticsearch SQL - PullRequest
0 голосов
/ 25 октября 2018

У меня есть простой SQL-запрос в Elasticsearch, который, как я знаю, возвращает менее 100 строк результатов.Как я могу получить все эти результаты сразу (т.е. без использования прокрутки)?Я пробовал предложение limit n, но оно работает, когда n меньше или равно 10, но не работает, когда n больше 10.

Код Python для вызова API-интерфейса Elasticsearch SQLкак показано ниже.

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 ]

0 голосов
/ 25 октября 2018

С asticsearch-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 КБ и должен возвращать ошибку, а не ограничивать результаты.

0 голосов
/ 25 октября 2018

эластичный поиск ограничен, но если вы используете Python, вы можете использовать эластичный поиск-100 *

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()
...