solr 쿼리에서 OR 및 NOT 사용


83

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

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

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

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

답변:


82

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

-(myField:superneat AND -myOtherField:somethingElse)

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

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


도와 주셔서 감사합니다! 이것은 실제로 작동합니다-나는 이것을 solr-user 그룹에 제기했습니다. 여기에 유용한 정보를 게시하겠습니다.
stolenricecakes 2008 년

8
참고 -myField:superneat OR myOtherField:somethingElse또한 동일 약간 간단합니다.
Yorick Sijsling

3
@YorickSijsling 요점은 논리적으로 동일하더라도 Solr는 때때로 OP가 게시 한 쿼리 또는 게시 한 것과 같은 순전히 부정적인 쿼리에 잘 대처하지 못한다는 것입니다.
Mauricio Scheffer

@Mauricio Scheffer-나는 그것에 대해 완전히 의문을 제기합니다. 어떻게 잘 처리되지 않는지 더 설명해 주시겠습니까? 우리는 여기에서 다소 복잡한 조건문을 실행하고 수십억 개의 문서에 매우 잘 대처한다는 것을 알았습니다.
terrance.a.snyder 2012

@ terrance.a.snyder "복잡한 조건"! = "순전히 부정적 쿼리". 또한 최근 버전의 Solr에서 상황이 개선되었을 수 있지만 확인하지 않았습니다.
Mauricio Scheffer

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

1
고맙습니다! 이것은-(myField : superneat AND -myOtherField : somethingElse) 접근 방식-그렇지 않은 동안 복잡한 쿼리에서도 저에게 효과적이었습니다!
dpetruha 2013

33

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

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

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

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

?q=-title:foo&debug=query

로 변형됩니다

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

1
edismax 는 중첩 된 순수 네거티브 쿼리를 올바르게 처리합니다. Lucene 쿼리 구문 분석기를 패치하여이를 동일한 방식으로 지원하는 것에 대해 논의한 적이 있습니까?
Peter Dixon-Moses

24

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

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

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

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


1
오늘 Solr 5에서 정확히이 시나리오를 실행했으며이 제안이 작동합니다.
Ryan Shelley

9

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

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


3

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

*:* 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에 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.