Elasticsearch DSL на Python не может создать счет - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть база данных Elasticsearch с несколькими полями, которые могут включать информацию об имени, и я пытаюсь найти ее следующим образом:

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search

client = Elasticsearch()
s = Search(using=client, index="names")
query = 'smith'
fields = ['name1', 'name2']

results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO')

for hit in results.scan():
    print(hit.meta.score)

Результаты:

None
None
None
...

Однако, еслиЯ структурирую это вручную:

results = client.search(index="names",
    body={"size": 100, "query":{
        "multi_match": {
            "query": query, "fields": fields, "fuzziness": 'AUTO'
        }
    }
})

Мои результаты:

{'_index': 'names', '_type': 'Name1', '_id': '1MtYSW4BXryTHXwQ1xBS', '_score': 14.226202, '_source': {...}
{'_index': 'names', '_type': 'Name1', '_id': 'N8tZSW4BXryTHXwQHBfw', '_score': 14.226202, '_source': {...}
{'_index': 'names', '_type': 'Name1', '_id': '8MtZSW4BXryTHXwQeR-i', '_score': 14.226202, '_source': {...}

Я бы предпочел использовать по возможностивестиasticsearch-dsl, но мне нужна информация о счете.

Ответы [ 3 ]

1 голос
/ 12 ноября 2019

Первая версия кода не эквивалентна второй версии кода. Вместо выполнения запроса первая версия использует Scroll API (asticsearch.helpers.scan).

Search.query() метод построения или расширения поискового объекта, а не отправки запроса вasticsearch. Поэтому следующая строка кода вводит в заблуждение:

results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO')

Это должно быть так:

# execute() added at the end
results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO').execute()
# scan() removed 
for hit in results:
    print(hit.meta.score)
0 голосов
/ 08 ноября 2019

Попробуйте это:

from elasticsearch_dsl.query import MultiMatch
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search

client = Elasticsearch()
s = Search(using=client, index="names")
query = 'smith'
fields = ['name1', 'name2']

query_multi = 
MultiMatch(query=query,fields=fields,fuzziness='AUTO')

r = s.query(query_multi)
results = r.execute()
for hit in results:
    print(hit.meta.score)
0 голосов
/ 08 ноября 2019

Попробуйте вместо этого:

results = s.query("multi_match", query=query, fields=fields, fuzziness='AUTO')
for hit in results["hits"]["hits"]:
    print(hit._score)
...