2017-11-28 14 views
2

solr 6.6.0을 사용하고 있으며 여기에 문서가 있습니다. solr 쿼리 문자열의 음수 연산자 (괄호)는 작동하지 않습니다.

{"id":1,"content":test1"} 
{"id":2,"content":test2"} 
{"id":3,"content":test3"} 

내가하지 "TEST1"와 "TEST2"를 포함하는 문서를 포함 wanto 말, refernce를 가이드의 Grouping Terms to Form Sub-Queries 섹션에 따라 다음과 같은 방법으로 쿼리 문자열을 작성하는 법적 보인다.

content:((NOT "test1") AND (NOT "test2")) 

쿼리 결과는 문서 # 3 만 반환 될 것으로 예상되지만 실제 결과는 비어 있습니다.

위의 쿼리를 다음과 같이 변경하면 "NOT expressions"을 괄호로 묶지 않고 예상 결과를 반환합니다.

content:(NOT "test1" AND NOT "test2") 

내 질문은 왜 첫 번째 쿼리 문자열이 예상되는 방식으로 작동하지 않는 것입니까?

답변

2

Solr은 현재 "순수한 제외"쿼리를 확인하고 *:* (모든 문서와 일치 함)을 삽입하므로 후자 형식 (괄호없이)이 올바르게 작동합니다. ,

는 org.apache.solr.search.QueryUtils.java

/** Fixes a negative query by adding a MatchAllDocs query clause. 
    * The query passed in *must* be a negative query. 
    */ 
public static Query fixNegativeQuery(Query q) { 
    BooleanQuery newBq = (BooleanQuery)q.clone(); 
    newBq.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST); 
    return newBq; 
} 

에서 아래의 코드 그래서 NOT "test"(*:* NOT "test")

에 SOLR에 의해 변환을 참조하십시오 그러나 SOLR는 오직 최상위 쿼리를 확인 따라서 순수 음수 쿼리가 최상위 수준에 있지 않으므로 (NOT "test1")과 같은 쿼리는 변경되지 않습니다. 이 때문에 이전 형식 (괄호 포함)이 예상대로 작동하지 않습니다.

그래서 우리는 대신에 단일의 NOT some_expression, NOT 연산자를 사용하는 적절한 방법은 (*:* NOT some_expression) 형태 것이 일반적으로 결론을 내릴 수있다.

+0

이것은 * : * NOT content :("test1"OR "test2")'와 동등한'-content :("test1"OR "test2")' 내용 : ("test1"이 아닌 "test2")' – EricLavault