множественные подчеркивания в названии поляasticsearch с помощью pythonasticsearch-dsl - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь понять, почему поле с одним подчеркиванием mods_genre будет вести себя иначе, чем поле с подчеркиванием 1+, например, mods__genre при использовании клиента python asticsearch-dsl .

Использование версии ElasticSearch 5.5.1 и python 3.5.

Ниже приведен код, с которым я работаю, чтобы выбрать все документы, для которых поле соответствует значению.

В этом примере выполняется поиск в индексе foo с именами полей, которые имеют только одно подчеркивание, и возвращает ожидаемые результаты (как я уже подтвердил, это поле заполняется этим значением):

# query against index with single underscores in field name
query = Search(using=es_handle, index='foo')
query = query.filter(Q('term', **{'%s.keyword' % 'mods_genre' : 'biography'}))
query_results = query.execute()

In [16]: query_results.hits.total
Out[16]: 6

Однако, с очень похожим кодом, но запросом индекса с именами полей с несколькими подчеркиваниями в строке, bar, я получаю ноль результатов:

# query against index with multiple underscores in field name
query = Search(using=es_handle, index='bar')
query = query.filter(Q('term', **{'%s.keyword' % 'mods__genre' : 'biography'}))
query_results = query.execute()

In [16]: query_results.hits.total
Out[16]: 0

Любое понимание, почему это может иметь место? Я понимаю, что имена полей, которые начинаются со знака подчеркивания, зарезервированы, но не встречались ни в одной документации, которая указывает на подчеркивания внутри поля - , в частности, несколько строк подряд - было бы проблематично.

1 Ответ

0 голосов
/ 02 июля 2018

Это просто потому, что elasticsearch-dsl-py заменяет двойное подчеркивание __ в именах полей точкой .. Это можно увидеть в строках 222-223 в utils.py. Таким образом, второй запрос фактически выполняется на mods.genre.keyword, что, вероятно, не то, что вы ожидаете.

Более подробную информацию о контексте можно увидеть в выпуске № 28 , но в основном они хотели принять концепцию, аналогичную той, что делается в Django CRM.

...