2009-03-03 8 views
0

Dans mes documents Lucene j'ai un champ "société" où le nom de l'entreprise est tokenized. J'ai besoin de la tokenisation pour une certaine partie de mon application. Mais pour cette requête, je dois être en mesure de créer une PrefixQuery sur tout le champ de l'entreprise.Rendre lucene traiter tous les termes dans un champ comme un seul terme

Exemple:

  • Marque Ma
    • ma
    • marque
  • brahmane ferme
    • brahmane
    • ferme

régulièrement pour l'interrogation « soutien-gorge » renverrait les deux documents parce qu'ils ont tous deux un terme commençant par soutien-gorge.
Le résultat que je veux, ne retournera que la dernière entrée parce que le premier terme commence par bra.

Des suggestions?

Répondre

0

Utilisez un SpanQuery pour rechercher uniquement le premier terme. Un PrefixQuery enveloppé par SpanMultiTermQueryWrapper enveloppé par SpanPositionRangeQuery:

<SpanPositionRangeQuery: spanPosRange(SpanMultiTermQueryWrapper(company:bra*), 0, 1)> 
1

Créer un autre champ indexé, où le nom de la société est et non. Si nécessaire, effectuez une recherche sur ce champ plutôt que sur le champ de nom de société à jeton.


Si vous voulez des recherches rapides, vous devez avoir des entrées d'index qui pointent directement sur les enregistrements d'intérêt. Il pourrait y avoir quelque chose que vous pouvez avec les données de proximité pour filtrer les enregistrements, mais ce sera lent. Je vois le problème comme: comment une requête "contient" sur un champ complet peut-elle être effectuée efficacement?

Vous pourriez réduire l'augmentation de la taille de l'index en créant (pour chaque champ actuel) un champ "premier terme" et un champ "termes restants". Cela éliminerait la duplication du premier terme dans deux domaines. Pour les requêtes "normales", vous recherchez des termes de requête dans l'un de ces champs. Pour les requêtes "startswith", vous recherchez uniquement le champ "first term". Mais cela semble plus ennuyeux que ça en vaut la peine.

+0

Ce serait une solution, mais augmenterait aussi mon index beaucoup. Je devrais dupliquer tous mes champs de cette façon (environ 15) pour les disques 2500K +. J'espérais trouver un moyen de faire simplement un démarrage avec un champ complet –

Questions connexes