2014-08-29 3 views
1

웹 사이트의 제품 필터에서 작업 중이며 "facet.missing = true"를 사용하는 데 어려움이 있습니다.누락 된 값에 대해 solr을 사용한 부정적인 패싯 쿼리에 문제가 발생했습니다.

필자는 "fq = -facetField : [* TO *]"와 같은 쿼리 필터를 사용하여 해당 필드가없는 제품에 대한 결과를 필터링해야한다고 알고 있습니다.

$params['fq'] = sprintf('((%s) AND (%s))', $custom, $system); 

:

나는 기본적으로이 (PHP)과 같은 사용자 권한 기반 필터를 놓치게에서 어떤을 방지하기 위해 모든 쿼리를 동적으로 FQ 매개 변수를 기반으로 내 응용 프로그램에 대한 글로벌 필터 도우미를 구축

(isdiscontinued:0 AND ishidden:0 AND contract:3) 

$ 사용자 정의는 사용자가 UI를 통해 구축되는 실제 필터 쿼리가 포함 : $ 시스템 (실제하지만 유사하지)처럼 보일 수있는 전역 권한을 기반으로 필터입니다. 노트북의 블루투스 필터의 이름이 fq_bluetooth이고 값이 No, Yes 또는 값이 없다고 가정 해 봅시다.

((-fq_bluetooth:[* TO *]) AND ((isdiscontinued:0 AND ishidden:0 AND contract:3))) 

그러나 이것이 내가이 범주에 대한 보내고있다 쿼리 0 제품을 반환 :이 같은 최종 FQ 모양을 만들 것입니다. 나는에 필터 쿼리를 수정하는 경우

는 :

((fq_bluetooth:[* TO *]) AND ((isdiscontinued:0 AND ishidden:0 AND contract:3))) 

를 다음 나는 결과가 지정되지 않은 무시, 예 + 없음의 수가 예상 수 얻는다.

제대로 작동하려면 필터 쿼리를 어떻게 포맷해야합니까?

[편집]

나는 또한 측면을 결합하고 어쩌면 아니 블루투스 또는 블루투스를 지정하지 않은 사람 만 제품을 필터링 할 수 있습니다. 그래서 어쩌면 (물론 중 하나가 작동하지 않는)이 같은 :로 분석되고

fq_bluetooth:("No" OR -[* TO *]) 

:

((-fq_bluetooth:[* TO *] OR fq_bluetooth:"No") AND ((isdiscontinued:0 AND ishidden:0 AND contract:3))) 

나는, 내가 좋아하는 필터 쿼리를보고 있어요에 debugQuery에 몰래 해요 :

fq_bluetooth:No -fq_bluetooth:[* TO *] 

내가보고 또는 구문 분석 된 쿼리 아니에요 - 내 연구에서 FQ 매개 변수 쿼리는 OR 연산자를 준수하지 않는 (?).

아마도 OR이 작동하지만 음수 쿼리가 자체적으로 실패한 것처럼 보였을 것입니다. 아마도 이런 이유로 이런 OR 조합을 볼 수 없습니다.

답변

4

불필요한 괄호를 제거하고 필터 쿼리를 두 개의 필터 쿼리 (시스템 제한 사항 용과 사용자 생성 필터링 용)로 나눕니다.

1) 요청에 2 가지 논리적 요구 사항 (보안 제한 및 사용자 생성 필터링)을 충족 시키려면 두 개의 필터 쿼리로 쿼리를 다시 작성하지 않으시겠습니까?시스템 권한에 대한

하나, (생략 이스케이프) 앱 UI에서 생성 된 쿼리에 대한 다른 하나

... FQ = isdiscontinued : 0 ishidden : 0 및 계약 : 3 & FQ = -fq_bluetooth [* TO]

이 심지어 특정 쿼리 문제에 관해서는 filter query caching

2)와 함께 도움이 될 것입니다, 실험함으로써, 괄호의 존재가 예상되는 결과를 변경하는 것 같다. 예상되는 동작 결과 -ProcedeImageElectronique:[* TO *] AND Pays:France AND GrandeCategorie:FILM

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 1, 
    "params": { 
     "facet": "off", 
     "indent": "true", 
     "q": "*:*", 
     "wt": "json", 
     "fq": "((-ProcedeImageElectronique:[* TO *]) AND (Pays:France AND GrandeCategorie:FILM))" 
    } 
    }, 
    "response": { 
    "numFound": 0, 
    "start": 0, 
    "maxScore": 0, 
    "docs": [] 
    } 
} 

: 나는 당신의 구문을 사용하는 경우 로컬 인스턴스로 테스트를 수행, 내가 ((-ProcedeImageElectronique:[* TO *]) AND (Pays:France AND GrandeCategorie:FILM)) 0을 반환 결과, 다음이 마찬가지로

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 1, 
    "params": { 
     "facet": "off", 
     "indent": "true", 
     "q": "*:*", 
     "wt": "json", 
     "fq": "-ProcedeImageElectronique:[* TO *] AND Pays:France AND GrandeCategorie:FILM" 
    } 
    }, 
    "response": { 
    "numFound": 1733, 
    "start": 0, 
    "maxScore": 1, 
    "docs": [...] 
    } 
} 

, 두 가지를 사용하여 필터 쿼리는 예상 된 결과를 반환

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 0, 
    "params": { 
     "facet": "off", 
     "indent": "true", 
     "q": "*:*", 
     "wt": "json", 
     "fq": [ 
     "-ProcedeImageElectronique:[* TO *]", 
     "GrandeCategorie:FILM AND Pays:France" 
     ] 
    } 
    }, 
    "response": { 
    "numFound": 1733, 
    "start": 0, 
    "maxScore": 1, 
    "docs": [...] 
    } 
} 

편집 : 괄호를 사용하여 UNEX로 이어질 수있는 이유 this post 명확하게 설명 pected 결과. 인용하자면 :

를 최상위 BoolenQuery 중첩 된 쿼리 수정하고 (정의)되지 않습니다 만 부정 절을 포함하는 중첩 된 BooleanQuery 그 안에 어딘가에 포함되어있는 경우와 일치하는 문서를 an't - 필요한 경우 외부 쿼리가 일치하지 않는다는 의미입니다.

+0

답장을 보내 주셔서 감사합니다! 나는 fq = -fq_bluetooth : [* TO *] & fq = (isdiscontinued : 0 AND ishidden : 0 AND contract : 3)와 같은 쿼리를 만들려고했다. (btw, 더 많은 그룹을 포함하는 더 많은 시스템 필터가있다. ORed 요소). fq = fq_bluetooth :("아니오"OR - [* TO *]) & fq = (isdiscontinued : 0 AND ishidden : 0 AND contract : 3) – Chris

+0

당신은 여러 조건을 추가하기를 원할 때 parenteshis없이 시도? 즉 fq = fq_bluetooth : "아니요"또는 - [* TO *] – qux

+0

문제는 부정 조항입니다. 'fq = fq_bluetooth : 아니요 (-fq_bluetooth : [* TO *] * : *)'이것은 다음과 같이 시도하십시오. 따라서 누락 된 값을 매치 할 때마다 앱 쿼리 생성기에서'(-fieldname : [* TO *] * : *)'를 사용하십시오 – qux