Program Tip

solr 쿼리에서 OR 및 NOT 사용

programtip 2020. 10. 4. 13:12
반응형

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제 경우에는 패싯을 수행하는 작업이며 해당 유형 (bar) 에서만 쿼리 용어 "foo"를 대상 으로 지정해야합니다.

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

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

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

참고 URL : https://stackoverflow.com/questions/634765/using-or-and-not-in-solr-query

반응형