Я хочу знать, будет ли собственный 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, ' ???'
Фактические результаты:
Я не знаю, правильный ли код?
Ожидается:
Я предполагаю, что код правильный.
Ваш ответ может спасти мои волосы!
Спасибо