2010-03-18 4 views
1

Querydsl (Java 용 형식 안전 쿼리를 제공함)에 Apache Lucene 지원을 추가하고 있으며 Lucene이 중첩 쿼리의 부정에 대해 쿼리를 평가하는 방법을 이해하는 데 문제가 있습니다.부정에 관한 Lucene의 중첩 쿼리 평가

예를 들어, 다음 두 쿼리는 의미 상으로는 동일하지만 첫 번째 쿼리 만 결과를 반환합니다.

+year:1990 -title:"Jurassic Park" 
+year:1990 +(-title:"Jurassic Park") 

두 번째 예의 단순화 된 개체 트리가 아래에 나와 있습니다.

query : Query 
    clauses : ArrayList 
    [0] : BooleanClause 
     "MUST" occur : BooleanClause.Occur 
     "year:1990" query : TermQuery 
    [1] : BooleanClause 
     "MUST" occur : BooleanClause.Occur 
     query : BooleanQuery 
     clauses : ArrayList 
      [0] : BooleanClause 
      "MUST_NOT" occur : BooleanClause.Occur 
      "title:"Jurassic Park"" query : TermQuery 

루씬의는 자신의 QueryParser 오브젝트 나무의 같은 종류로 "AND (NOT"을 평가하는 것 같다.

Lucene의 버그입니까? 아니면 Lucene의 쿼리 평가를 오해 한 적이 있습니까? 필요한 경우 더 많은 정보를 제공해 드리겠습니다.

답변

3

의미 상 동일하지 않습니다.

+year:1990 +(-title:"Jurassic Park") 

에서

는 당신은 절을하지 않은 하위 쿼리가 있습니다. 무슨 일이 일어나고 있는지 Lucene이

-title:"Jurassic Park" 

절을 평가하고 0 개의 문서를 반환하고 있습니다. 그런 다음 하위 쿼리가 발생해야 함을 나타내며 반환 문서가 0이므로 나머지 쿼리는 무효화됩니다.

+0

감사합니다. 지금은 완벽합니다. – ponzao

+0

정말 단 한 번의 검색 만하면됩니다. –

+0

좋아,이 말이 맞는 것 같습니다. 그러나 if (-title : "Jurassic Park")이 1 개 이상의 문서를 반환 한 경우 ... + 1 년 : 1990 년이 해당 문서에만 존재하면 해당 문서 만 히트로 제공됩니다. ?? .. 그 것처럼 보입니다. 조금 더 이해하고 싶다. – AngelsandDemons