2013-02-28 2 views
2

우리는 Hoosh 2.4.1과 함께 Haystack 1.2.7을 사용하여 백엔드로 색인 된 약 9,000 개의 문서를 보유하고 있습니다. Haystack을 사용함에도 불구하고, 그것은 Whoosh 문제처럼 보입니다. , 붕 아무튼를Whoosh : 검색 결과 만 늘리면 안됩니까?

>>> SearchQuerySet().all().models(PedidoSaida).filter(numero__exact='6210202443/10') 
[<SearchResult: logistica.pedidosaida (pk=u'6')>] 

2) 난 그냥 startswith 조회를 실행하는 경우 : 난 그냥 정확한 조회를 실행하는 경우

1), 붕)는 다음과 같이 (내 문서를 찾아 내 디버그의 경우에서 살펴 보자 't (아래로) 내 문서를 찾을 : 나는 하나의 OR 쿼리에서 모두 함께 넣으면

>>> SearchQuerySet().all().models(PedidoSaida).filter(numero__startswith='6210202443/10') 
[] 

3), 붕는 여전히 내 문서를 찾을 수없는() 아래로 :

>>> SearchQuerySet().all().models(PedidoSaida).filter(SQ(numero__exact='6210202443/10') | SQ(numero__startswith='6210202443/10')) 
[] 
건초 더미가 붕에 보내는 쿼리로 살펴보면 6,

, 우리는이 : 당신이 관찰 할 수 있듯이

>>> str(SearchQuerySet().all().models(PedidoSaida).filter(numero__exact='6210202443/10').query)          
'(numero:6210202443/10) AND (django_ct:logistica.pedidosaida)' 

>>> str(SearchQuerySet().all().models(PedidoSaida).filter(numero__startswith='6210202443/10').query) 
'(numero:6210202443/10*) AND (django_ct:logistica.pedidosaida)' 

>>> str(SearchQuerySet().all().models(PedidoSaida).filter(SQ(numero__exact='6210202443/10') | SQ(numero__startswith='6210202443/10')).query) 
'((numero:6210202443/10 OR numero:6210202443/10*)) AND (django_ct:logistica.pedidosaida)' 

는 마지막 쿼리는 정확하게 (첫 번째 또는 두 번째). Whoosh가 내 문서를 찾지 않아야합니까? 나는 내 논리가 잘못된 곳을 볼 수 없다 : 나는 OR을 사용하고 있으며, 진술 중 하나를 사용할 때보 다 적게 찾는다.

또한 Whoosh가 첫 번째 쿼리 (numero : 6210202443/10)로 내 문서를 찾았지만 두 번째 (numero : 6210202443/10 *)는 내 문서를 찾지 못한다고 생각합니다. 하지만 Haystack이 CharField에서 사용하는 StemmingAnalyzer와 관련이 있다고 생각합니다. 나는 그걸 깊이 들여다 볼게.

답변

1

당신이 사용할 수있는 QueryParser 직접 붕는 해당 쿼리 구문 분석하는 방법을 볼 수 있습니다 :

>>> from whoosh.qparser import QueryParser 
>>> QueryParser("content", schema=None).parse('((numero:6210202443/10 OR numero:6210202443/10*)) AND (django_ct:logistica.pedidosaida)') 
And([Or([Term('numero', '6210202443/10'), Term('numero', '6210202443/')]), Prefix('content', '10'), Term('django_ct', 'logistica.pedidosaida')]) 

이의 그 마지막 줄 포맷 보자

And([ 
    Or([ 
     Term('numero', '6210202443/10'), 
     Term('numero', '6210202443/'), 
    ]), 
    Prefix('content', '10'), 
    Term('django_ct', 'logistica.pedidosaida'), 
]) 

* 더 단단히보다 더 구속력이 같은 그것은 본다 귀하의 검색어에 /. 나는 이것을 whoosh의 버그라고 주장 할 수 있습니다.

해결 방법이 마음에 오는 (I는 메인테이너이 패치 ☺를 사랑 확신) :

  1. 이 붕의 정의 - fuzzily과 인간 중심의 쿼리 언어를 통해 라운드 트립 대신 쿼리를 직접 구축 할 수 있습니다. 물론 색인은 동일한 시스템에 있고 동일한 프로세스로 색인을 읽는 경우에만 작동합니다. 나는 건초 더미에 대해 많이 모른다.

  2. numero 필드에 슬래시를 사용하지 마십시오. 밑줄과 같이 쿼리 구문처럼 보이지 않는 것으로 변경하십시오.

  3. 접두사 검색을 할 때 슬래시를 포함하지 마십시오. 예를 들어 6210202443*은 쿼리의 어느 위치에서나 정상적으로 작동합니다.

+0

나는 QueryParser를 사용하는 것에 대해 생각하지 않았다. :) – msbrogli

0

@Eevee 아이디어에 이어 몇 가지 테스트를 수행했습니다. 이 일을 확인하십시오

>>> QueryParser("content", schema=None).parse('((numero:6210202443/10 OR (numero:6210202443/10*))) AND (django_ct:logistica.pedidosaida)') 
And([ 
    Or([ 
     Term('numero', '6210202443/10'), 
     And([ 
      Term('numero', '6210202443/'), 
      Prefix('content', '10') 
     ]) 
    ]), 
    Term('django_ct', 'logistica.pedidosaida') 
]) 

/OR보다 우선 것으로 보인다. 그것은 의미가 있습니까? 논리 연산자가 우선 순위가 가장 높아야한다고 생각합니다. 동의하니?

이 동작이 정확하다고 생각되면 Haystack 쿼리 생성기의 버그입니다. 그렇지 않니?

패치로 제공하고 싶지만 실제로 파서에 버그가 있는지 확실하지 않습니다. 더 의미있는 우선 순위에 달려 있습니다.

+0

이것은 정말로 질문에 대한 편집이되어야한다. :) 그러나 나는 whoosh에게 약간의 패치를 제공했고, 나의 경험에서 유지자는 매우 반응 적이다; 나는 티켓을 (https://bitbucket.org/mchaput/whoosh/issues?status=new&status=open) 또는 낙천적으로 패치를 작성하여 풀 요청으로 보냅니다. – Eevee