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

Eric Wilson
fonte

Respostas:

144

Experimente isto:

?q=-id:["" TO *]
netcoder
fonte
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!

KK1402
fonte
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 *]

Matthias M
fonte
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
2

Você também pode usá-lo assim.

fq=!id:['' TO *]
user1976546
fonte
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));
Adriano Galesso Alves
fonte
1

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

Nimrod Cohen
fonte