부정에 관한 Lucene의 중첩 쿼리 평가
-
20-09-2019 - |
문제
나는 추가하고있다 아파치 루센 지원 querydsl (Java에 대한 유형-안전 쿼리를 제공합니다)와 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"
같은 종류의 물체 나무로.
이것이 루센의 버그입니까, 아니면 루센의 쿼리 평가를 오해 했습니까? 필요한 경우 더 많은 정보를 제공하게되어 기쁩니다.
해결책
그들은 의미 적으로 동일하지 않습니다.
~ 안에
+year:1990 +(-title:"Jurassic Park")
조항이 아닌 하위 쿼리가 있습니다. 일어나고있는 일은 루센이 평가하고 있다는 것입니다
-title:"Jurassic Park"
절과 0 문서를 반환하고 있습니다. 그런 다음 하위 쿼리가 발생해야한다는 것을 나타내며, 제로 문서를 반환하기 때문에 나머지 쿼리를 무효화합니다.
제휴하지 않습니다 StackOverflow