0

대상 포진은 Python DSL에 어떻게 부릅니까?Elasticsearch Python DSL에서 대상 포진과 솜털 모양을 사용합니까?

"name"필드와 "surname"필드에있는 구를 검색하는 간단한 예제입니다.

import json 
from elasticsearch import Elasticsearch 
from elasticsearch_dsl import Search, Q 

def make_dsl_query(fields): 
    """ 
    Construct a query 
    """ 
    es_client = Elasticsearch() 
    my_query = Search(using=es_client, index="my_index", doc_type="my_type") 

    if fields['name'] and fields['surname']: 
     my_query = my_query.query(Q('bool', should= 
        [Q("match", name=fields['name']), 
        Q("match", surname=fields['surname'])])) 
    return my_query 


if __name__ == '__main__': 

    my_query = make_dsl_query(fields={"name": "Ivan The Terrible", "surname": "Conqueror of the World"}) 
    response = my_query.execute() 

    # print response 
    for hit in response: 
     print(hit.meta.score, hit.name, hit.surname) 

1) 대상 포진을 사용할 수 있습니까? 그리고 어떻게? 난 많은 것들을 시도하고 그것에 대한 설명서에서 아무것도 찾을 수 없습니다.

이 정상적인 Elasticsearch 쿼리에서 작동하지만 분명히 파이썬 DSL에서 다른 방법으로 불리는 것 ...

my_query = my_query.query(Q('bool', should= 
        [Q("match", name.shingles=fields['name']), 
        Q("match", surname.shingles=fields['surname'])])) 

2) 어떻게 내 경기에 흐릿한 매개 변수를 전달합니까? 아무 것도 찾을 수없는 것 같습니다. 이상적으로는 이런 식으로 뭔가를 할 수있을 것입니다 : 당신이 당신의 매핑에서 그들을 정의 할 필요가 포진을 사용하려면

my_query = my_query.query(Q('bool', should= 
        [Q("match", name=fields['name'], fuzziness="AUTO", max_expansions=10), 
        Q("match", surname=fields['surname'])])) 

답변

1

, 그것은 시도하고 질의 시간을 사용하기에 너무 늦었어요. 쿼리 시간에 수행 할 수있는 작업은 match_phrase 쿼리를 사용하는 것입니다.

my_query = my_query.query(Q('bool', should= 
       [Q("match", name.shingles=fields['name']), 
       Q("match", surname.shingles=fields['surname'])])) 

로 작성된 경우 작동합니다

: 당신을 가정

my_query = my_query.query(Q('bool', should= 
       [Q("match", name__shingles=fields['name']), 
       Q("match", surname__shingles=fields['surname'])])) 

모두 namesurname 필드에 정의 된 shingles 필드가 있습니다. 당신은 또한 | 연산자를 사용할 수 있습니다

참고 :

my_query = Q("match", name__shingles=fields['name']) | Q("match", surname.shingles=fields['surname']) 

대신 bool 쿼리 자신을 구성하는.

희망이 도움이됩니다.

+0

고맙습니다. 그래도 퍼지를 허용하려면 어떻게해야합니까? 지금은 퍼지 검색에 필요한 검색어가 포함 된 사전을 만들어 Q 객체 ({...})로 변환하는 결과를 얻었습니다. 쿼리에 매개 변수를 전달하는 더 좋은 방법이 있습니까? 소스 코드는 쿼리가 추가 매개 변수를 허용하지 않음을 나타냅니다. –

+0

물론'Q ("match", name__shingles = { 'query': fields [ 'name'], 'fuzziness': 'AUTO'})'괜찮습니다. kwargs는 근본적으로 결과 json의 키입니다. . –

+0

대단히 고마워요! –