Como consultar o SOLR para campos vazios?


112

Eu tenho um grande índice solr e notei que alguns campos não são atualizados corretamente (o índice é dinâmico).

Isso resultou em alguns campos com um campo "id" vazio.

Eu tentei essas consultas, mas não funcionaram:

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

Existe uma maneira de consultar campos vazios?

obrigado

Respostas:


144

Experimente isto:

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

7
Mesmo que a página SolrQuerySyntax diga -id: [* TO *], apenas -id: ["" TO *] funcionou para mim no solr 1.4.
— Jonathan Tran

1
@ user2043553 Não, se você ?q=-id:*obtiverCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
— Yzmir Ramirez

1
@YzmirRamirez Tentei com o exemplo do Solr 4.5.1 e ?q=-id:*parece funcionar conforme o esperado. Talvez o erro de análise esteja relacionado a esse problema .
— user2043553

Desculpe, esqueci a versão ... Lucene Specification Version: 3.2.0que estava usando. Que bom que eles adicionaram a sintaxe no Solr 4.5.1.
— Yzmir Ramirez

Esteja ciente de que esta sintaxe também parece retornar linhas cujo valor de campo começa com um espaço em branco (no Solr 4.3)
— metatechbe

89

Uma advertência! Se você quiser redigir isso por meio de OR ou AND, não poderá usá-lo desta forma:

-myfield:*

mas você deve usar

(*:* NOT myfield:*)

Esta forma é perfeitamente combinável. Aparentemente, o SOLR irá expandir a primeira forma para a segunda, mas apenas quando for um nó superior. Espero que você economize algum tempo!


2
Essa resposta merece mais pontos do que realmente tem. Você nos economizou muito tempo!
— Zac

1 aqui também. Implementei as outras opções, mas tive que incluí-lo em um fq = em vez de q = e também tive que implementar um OR para verificar se o campo estava vazio OR tinha um valor específico. Essa é a única opção que funcionou para esse caso de uso.
— Pixelmixer

Concordo que essa deve ser a resposta aceita para a pergunta
— consertar

Você me salvou de tanta dor de cabeça. Não tenho certeza se obrigado é suficiente.
— Camway


11

Se você tiver um índice grande, deve usar um valor padrão

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

e, em seguida, consulte esse valor padrão. Isso é muito mais eficiente do que q = -id: ["" TO *]


Isso funcionaria apenas para campos do tipo String? Como você faria isso para o booleano?
— jared

Eu acho que deve funcionar da mesma maneira. Mas eu nunca verifiquei isso.
— Matthias M


1

Se você estiver usando SolrSharp, ele não suporta consultas negativas.

Você precisa alterar QueryParameter.cs (Criar um novo parâmetro)

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; }
}

E na classe QueryParameterCollection.cs, a substituição ToString (), verifica se o parâmetro Negative é verdadeiro

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

Quando você chama o criador do parâmetro, se for um valor negativo. Simples mudança de propriedade

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

1

você pode fazer isso com a consulta de filtro q = *: * & fq = -id: *

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.