빈 필드에 대해 SOLR을 쿼리하는 방법은 무엇입니까?


112

큰 solr 인덱스가 있고 일부 필드가 올바르게 업데이트되지 않은 것으로 나타났습니다 (인덱스는 동적 임).

이로 인해 일부 필드의 "id"필드가 비어 있습니다.

이 쿼리를 시도했지만 작동하지 않았습니다.

 id:''
 id:NULL
 id:null
 id:""
 id:
 id:['' TO *]

빈 필드를 쿼리하는 방법이 있습니까?

감사

답변:


144

이 시도:

?q=-id:["" TO *]

7
SolrQuerySyntax 페이지에 -id : [* TO *]가 표시되어 있지만 -id : [ ""TO *] 만 solr 1.4에서 작동했습니다.
조나단 트란

1
@ user2043553 아니, 당신이 경우에 ?q=-id:*당신이 얻을Cannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir 라미레즈

1
@YzmirRamirez Solr 4.5.1의 예제를 사용해 보았고 ?q=-id:*예상대로 작동하는 것 같습니다. 구문 분석 오류가이 문제 와 관련이있을 수 있습니다.
user2043553

죄송합니다. 버전을 잊어 버렸습니다 Lucene Specification Version: 3.2.0. 사용하고있었습니다. 그들은 Solr 4.5.1에 ​​구문을 추가하게되어 기쁩니다.
Yzmir Ramirez 2014

이 구문은 필드 값이 공백으로 시작하는 행을 반환하는 것으로 보입니다 (Solr 4.3에서)
metatechbe

89

한 가지주의 사항! OR을 통해 작성하려는 경우 또는 다음 형식으로 사용할 수 없습니다.

-myfield:*

하지만 당신은 사용해야합니다

(*:* NOT myfield:*)

이 양식은 완벽하게 구성 할 수 있습니다. 분명히 SOLR은 첫 번째 양식을 두 번째 양식으로 확장하지만 최상위 노드 일 때만 확장됩니다. 이것이 시간을 절약하기를 바랍니다!


2
이 답변은 실제보다 더 많은 점수를받을 가치가 있습니다. 당신은 우리에게 많은 시간을 절약했습니다!
Zac

여기에서도 +1. 다른 옵션을 구현했지만 q =가 아닌 fq =에 포함시켜야하고 필드가 비어 있는지 또는 특정 값이 있는지 확인하기 위해 OR를 구현해야했습니다. 이것은 해당 사용 사례에서 작동하는 유일한 옵션입니다.
Pixelmixer

나는 이것이 질문에 대한 대답이 받아 들여 져야한다는 데 동의합니다
tinker

당신은 나에게 많은 두통을 구했습니다. 감사합니다.
Camway


11

큰 색인이있는 경우 기본값을 사용해야합니다.

   <field ... default="EMPTY" />

이 기본값을 쿼리합니다. 이것은 q = -id : [ ""TO *]보다 훨씬 효율적입니다.


이것은 String 유형의 필드에서만 작동합니까? 부울을 위해 어떻게할까요?
자레드

같은 방식으로 작동해야한다고 생각합니다. 그러나 나는 그것을 확인한 적이 없습니다.
Matthias M


1

SolrSharp를 사용하는 경우 부정적인 쿼리를 지원하지 않습니다.

QueryParameter.cs를 변경해야합니다 (새 매개 변수 생성).

private bool _negativeQuery = false;

public QueryParameter(string field, string value, ParameterJoin parameterJoin = ParameterJoin.AND, bool negativeQuery = false)
{
    this._field = field;
    this._value = value.Trim();
    this._parameterJoin = parameterJoin;
    this._negativeQuery = negativeQuery;
}

public bool NegativeQuery
{
    get { return _negativeQuery; }
    set { _negativeQuery = value; }
}

그리고 QueryParameterCollection.cs 클래스에서 ToString () 재정의는 Negative 매개 변수가 true인지 확인합니다.

arQ[x] = (qp.NegativeQuery ? "-(" : "(") + qp.ToString() + ")" + (qp.Boost != 1 ? "^" + qp.Boost.ToString() : "");

매개 변수 작성자를 호출 할 때 음수 값이면. 간단한 속성 변경

List<QueryParameter> QueryParameters = new List<QueryParameter>();
QueryParameters.Add(new QueryParameter("PartnerList", "[* TO *]", ParameterJoin.AND, true));

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