Собственный ES-синтаксис SQL анализируется как ES DSL (JSON-запрос)?Как получить время разбора? - PullRequest
0 голосов
/ 29 января 2019

Я хочу знать, будет ли собственный Elasticsearch SQL обрабатываться как Elasticsearch DSL (запрос json)?И как получить время разбора ??

Я нашел ссылку на это.
Введение в Elasticsearch SQL с практическими примерами - Часть 1

Вы можете найти картинку о Elasticsearch SQL implementation consists of 4 execution phases на Внутренние реализации .

Полагаю, ответ "ДА".Но я не могу найти способ получить «проанализированное время», которое ES собственного SQL ES будет анализировать как ES DSL (запрос json). Я думаю «путь» в течение длительного времени, затем я пишу следующие коды.

Мое локальное окружение:
- MacOS Mojave Версия 10.14.2
- MacBook Pro (Retina, 13-дюймовый, начало 2015 г.)
- Процессор 2,7 ГГц Intel Corei5
- память 8 ГБ, 1867 МГц, DDR3
- Elasticsearch 6.5.4
- python 2

Требования:
- pip installasticsearch
- запросы на установку pip

"""
SQL Access (X-Pack)
https://www.elastic.co/guide/en/elasticsearch/reference/6.5/xpack-sql.html
"""
import random
import requests
import datetime
import elasticsearch

URL_PREFIX = 'http://localhost:9200'


def get_url(url):
    return URL_PREFIX + url


def translate_sql(sql):
    return requests.post(url=get_url('/_xpack/sql/translate/?pretty'),
                         json={'query': sql}).content


def search_with_query(query):
    headers = {'Content-type': 'application/json'}
    start_time = datetime.datetime.now()
    result = requests.post(url=get_url('/_search?pretty'),
                           headers=headers,
                           data=query).content
    return datetime.datetime.now() - start_time


def search_with_sql(sql):
    # https://www.elastic.co/guide/en/elasticsearch/reference/6.6/sql-rest.html
    query = '{"query":"' + sql.replace('\n', '') + '"}'
    headers = {'Content-type': 'application/json'}
    start_time = datetime.datetime.now()
    result = requests.post(url=get_url('/_xpack/sql?format=txt&pretty'),
                           headers=headers,
                           data=query).content
    return datetime.datetime.now() - start_time


def gen_data(number):
    es = elasticsearch.Elasticsearch()
    for i in range(number):
        es.index(index='question_index', doc_type='question_type', body={
            'a': random.randint(0, 10),
            'b': random.randint(0, 10),
            'c': random.randint(0, 10),
            'd': random.randint(0, 10),
            'e': random.randint(0, 10),
        })
        if i % 10000 == 0:
            print i


if __name__ == '__main__':
    # gen_data(100000)
    sql = '''
        select max(a) as max_a 
        from question_index 
        group by a 
        having max_a > 1
        order by a limit 1
    '''
    json_query = translate_sql(sql)

    sql_cost_time = search_with_sql(sql)
    query_cost_time = search_with_query(json_query)

    print 'sql  :', sql_cost_time
    print 'query:', query_cost_time

    if query_cost_time < sql_cost_time:
        print 'parsing time is:', sql_cost_time - query_cost_time, ' ???'
    else:
        print 'parsing time is :', query_cost_time - sql_cost_time, ' ???'

Фактические результаты:
Я не знаю, правильный ли код?

Ожидается:
Я предполагаю, что код правильный.

Ваш ответ может спасти мои волосы!
Спасибо

...