1

Solr 6.5.1에서 *_txt_en 필드와 string 문서 유형 필드가 있습니다. 이 필드에, 나는 형태의 쿼리 구축하고 싶습니다 :다중 부정으로 Solr 쿼리

일치를 특정 문서 유형의 모든 문서 여기서

  1. 특정 문구 ("문구 하나", "문장이") 일치 할 텍스트 필드에 있어야합니다.
  2. 그러나이 필드에는 다른 구문 ("phrase three", "phrase four", "phrase five")이 발생하면 일치하지 마십시오.

    (documenttype:references AND (field:"phrase one" OR field:"phrase two")) AND NOT field:"phrase three" AND NOT field:"phrase four" AND NOT field:"phrase five"

    내가 생각할 수있는 대안은 다음과 같습니다 :

    (documenttype:references AND (field:"phrase one" OR field:"phrase two")) AND NOT (field:"phrase three" OR field:"phrase four" OR field:"phrase five")

    위의 쿼리

    는에 작동하는 것 같다 다음과 같이 내가 외모를 썼다

나의 현재 SOLR 쿼리 두 가지 장난감 데이터 세트. Solr을 사용하면 부울 쿼리의 일부로 negations과 같은 명확한 함정이 아닌 쓴 규칙이 있다는 것을 알게되었습니다.

내가 설명한 쿼리의 경우,이를 구성하는 데 올바른 구문입니까?

답변

1

귀하의 질문에 괜찮습니다.

루씬에서 NOT

은/SOLR는 결과를 필터링하는 데 사용하고, 수행됩니다 하지 데이터베이스에 같은 다른 모든 일치하는 (물론, 때로는이 SOLR에서하는) 의미한다. lucene에서 부정이 어떻게 작동하는지 생각하는 쉬운 방법은 항상 앞에 AND이 있다고 가정하는 것입니다. AND NOT term1이 이해가되지 않기 때문에
  • term1 OR NOT term2

    실제로, 루씬에서는 작동하지 않습니다 term1 AND NOT term2
  • NOT term1의 결과를 얻을 수 있습니다. 그것이 (내가 돈 '부분 외부 괄호로 이동하기 전에 AND NOT term2을 평가하는 것 때문에,
  • term1 AND (NOT term2)가 작동하지 않습니다 (SOLR 따라서 NOT의 SOLR의 치료는 좀 일관성이 왜 자동으로 *:* AND NOT term1로 변환하여 해당 작업을 할 것입니다) t이 SOLR이 일을 보정 생각하지만, 그것은 DB 스타일 부울 논리와 다른 이유에 대해 좀 더 설명은)

날을 인용하지 않는, 어떤 이유가 있을까 my answer here

+0

를 살펴 내 AND NOT 필드를 변형 시키십시오 : "phrase three"... \ * : \ * 형식의 일부로 부분을 만들고 NOT 필드 : "phrase three", \ * : \ * AND NOT 필드 : "phrase four"를 언급 했습니까? – tkja

+1

@tkja - 아니요. '* : *'는 match-all-docs 절입니다. 당신이 일치시키고 자하는 문서들의 집합으로 시작하는 것처럼 보이고, 그 집합에서 몇 가지 것들을 걸러내는 것, 그것은 부정이 루신에서하도록 설계된 것입니다. 그것에 match-alls를 추가하면 얻을 수있는 문서 세트가 엉망이되어 훨씬 느려집니다. – femtoRgon

+1

@tkja - 귀하의 대안도 잘 작동합니다. 문제가 발생하는 곳은'x AND (NOT (y))' – femtoRgon