2010-09-28 8 views
3

De schema.xml:Pourquoi ne puis-je pas rechercher un champ "0" dans Solr?

<field name="myfield" type="integer" indexed="true" stored="false"/> 

L'enregistrement avec id 5 a myfield avec une valeur de 0, que je l'ai confirmé par la recherche de plaine id:5 et en regardant le objectXml.

Une recherche de id:5 AND myfield:0 ne renvoie aucun enregistrement.

Une recherche de id:5 AND -myfield:1, cependant, renvoie l'enregistrement auquel je m'attends.

Pourquoi?

- Informations complémentaires:

Définition pour le type entier: <fieldType name="integer" class="solr.IntField" omitNorms="true"/>

Version Solr: 1.4

+1

L'extrait de schéma ne correspond pas à votre description. Vous ne pouvez pas vérifier la valeur d'un champ non stocké en consultant les résultats. Veuillez vérifier qu'il correspond à votre schéma actuel. Veuillez également inclure la définition de votre type d'entier et spécifier la version de Solr que vous utilisez. –

Répondre

0

J'ai résolu le problème. C'était un bug dans le cœur de l'application (CMS tiers) et n'avait rien à voir avec Solr.

Le problème était que le code du fournisseur vérifiait pour voir si la valeur indexée n'était pas fausse avant de l'indexer. Malheureusement, ils le faisaient comme ceci:

$value = strval($node); 
if ($value) 

Bien sûr, 0 devient fausse, même si elle est la chaîne « 0 ».

je l'ai changé:

$value = strval($node); 
if ($value !== false) 

... et maintenant il fonctionne.

Merci pour vos efforts et désolé le problème a fini par être quelque chose de complètement indépendant.

1

Quelle est la classe qui est lié au type de champ "entier"? Est-ce qu'il traite 0 comme un marqueur pour ne pas indexer? À quoi les données d'index de ce document ressemblent-elles dans l'administrateur?

+0

La requête entière est id: 5 ET myfield: 0. Je n'essaie pas de retourner mon champ. Je cherche par id et myfield. FWIW, si je cherche quelque chose d'autre en utilisant myfield: 1, cela renvoie des résultats. Il ne semble pas aimer myfield: 0. –

-1

Les champs numériques nécessitent des requêtes numériques. Essayez de donner un type de quelque chose d'autre que numérique pour votre domaine.

+2

Quand est-ce que 0 a cessé d'être un nombre? –

+0

...? Lorsque vous spécifiez un type de champ numérique, cela signifie que vous voulez le stocker en tant que trie, avec une certaine précision.Cela signifie que votre numéro est * non * indexé mot pour mot; vous avez donc besoin d'un type particulier de requête pour l'interroger (essentiellement, il s'agit d'une variante de requête de plage). "Requête numérique" ne signifie pas "une requête normale avec un nombre", elle fait référence à une classe Lucene spéciale. – Xodarap

+0

Merci pour l'explication, mais cela ne m'aide pas vraiment. J'ai un champ qui est un entier. Si je recherche "myfield: ", je trouve ce que je cherche. Si je recherche "myfield: 0", je n'ai rien. Vous dites que j'ai besoin d'un type particulier de requête - ok, pouvez-vous me donner un exemple? –

0

J'ai essayé votre cas, vous en supposant utilisé le FieldType standard pour int:

<fieldtype name="integer" class="solr.TrieIntField" ... />

Cela fonctionne très bien. Donc, je suppose que la définition du type de champ de integer est en quelque sorte fausse. Vérifiez cette définition.