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.