[search] solr 쿼리에서 OR 및 NOT 사용

다음과 유사한 solr 쿼리를 작성 중입니다.

((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)

이것을 실행하면 결과가 반환되지 않습니다. OR NOT의 양쪽에 기준을 사용하면 예상했던 결과가 반환됩니다. 함께 제대로 작동하지 않습니다. 하는 경우 myField가 일치 superneat을 , 또한 수 있도록하려는거야 myOtherField이 설정되어 SOMETHINGELSE 하지만, 경우 myField가 아닌 superneat , 결과에 포함.

누군가 solr이 이런 종류의 쿼리에 대한 결과를 반환하지 않는 이유를 설명 할 수 있습니까? 쿼리를 어떻게 든 재구성해야합니까? 아니면 원하는 결과를 얻기 위해 solr을 사용할 수있는 다른 방법이 있습니까?



답변

이하지 않는 일, 그러나 이것은 논리적으로 동일하며 그 이유를 모르겠어요 않는 일을 :

-(myField:superneat AND -myOtherField:somethingElse)

쿼리에서 동일한 필드를 두 번 정의하는 것과 관련이있을 수 있습니다.

에 물어보십시오 SOLR 사용자 그룹 다음, 여기에 최종 답변을 다시 게시!


답변

Instead of "NOT [condition]" use "(*:* NOT [condition])"


답변

Solr은 현재 “순수한 부정”쿼리를 확인하고 다음을 삽입합니다. *:* 올바르게 작동하도록 (모든 문서와 일치)합니다.

-foo solr에 의해 (*:* -foo)

큰 경고는 Solr이 최상위 쿼리가 순수한 부정 쿼리인지 확인 만한다는 것입니다! 따라서 이것은 bar OR (-foo)순수 네거티브 쿼리가 최상위 쿼리의 하위 절에 있으므로 다음 과 같은 쿼리 가 변경되지 않음을 의미 합니다. 이 쿼리를 다음으로 직접 변환해야합니다.bar OR (*:* -foo)

solr 쿼리 설명을 확인하여 쿼리 변환을 확인할 수 있습니다.

?q=-title:foo&debug=query

로 변형됩니다

(+(-title:foo +MatchAllDocsQuery(*:*))


답변

Solr 문서 및 다른 SO 질문에 대한 몇 가지 다른 답변의 주석을 모아 다음 구문이 내 사용 사례에 대한 올바른 결과를 생성한다는 것을 알았습니다.

(my_field = my_value 또는 my_field가 null 임) :

(my_field:"my_value" OR (*:* NOT my_field:*))

이것은 solr 4.1.0에서 작동합니다. 이것은 OP의 사용 사례와 약간 다릅니다. 그러나 다른 사람들이 유용하다고 생각했습니다.


답변

solr-user 그룹에 대한 후속 조치는 solr 사용자 메일 링 목록 에서 찾을 수 있습니다.

일반적인 생각은 NOT 연산자는 쿼리에서 결과를 제거하는 데만 사용할 수 있으며 전체 데이터 세트에서 항목을 제외하는 데에만 사용할 수 있다는 것입니다. mausch가 제안한 구문이 마음에 들었습니다. 감사합니다!


답변

예상치 못한 다른 경우를 추가하기 위해 예상 한 결과를 반환하지 않은 쿼리는 다음과 같습니다.

*:* AND ( ( field_a:foo AND field_b:bar ) OR !field_b:bar )

field_b내 경우에는 내가 패싯을 수행하는 작업이며 검색어 “foo” 타겟팅해야합니다. 해당 유형 (bar) 으로 지정해야합니다.

이 작업을 수행하려면 다음과 같이 또는 조건 뒤에 다른 항목 을 삽입 *:*해야했습니다.

*:* AND ( ( field_a:foo AND field_b:bar ) OR ( *:* AND !field_b:bar ) )

편집 : 이것은 solr 6.6.3에 있습니다.


답변

간단한 do id 🙁 “12345”) OR id 🙁 “7890”) …. 등