Faire que lucene traite tous les termes d'un champ comme un seul terme

StackOverflow https://stackoverflow.com/questions/606576

  •  03-07-2019
  •  | 
  •  

Question

Dans mes documents Lucene, j'ai un champ "société". où le nom de l'entreprise est marqué. J'ai besoin du tokenization pour une certaine partie de mon application. Mais pour cette requête, je dois pouvoir créer une PrefixQuery sur l’ensemble du champ de la société.

Exemple:

  • ma marque
    • mon
    • marque
  • ferme brahmane
    • brahmane
    • ferme

Rechercher régulièrement " soutien-gorge " renverrait les deux documents parce qu'ils ont tous les deux un terme commençant par bra.
Le résultat que je veux cependant ne renverrait que la dernière entrée car le premier terme commence par bra.

Des suggestions?

Était-ce utile?

La solution

Utilisez un SpanQuery pour rechercher uniquement la position du premier terme. PrefixQuery enveloppé par SpanMultiTermQueryWrapper enveloppé par SpanPositionRangeQuery:

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

Autres conseils

Créez un autre champ indexé, dans lequel le nom de la société n'est pas marqué. Si nécessaire, effectuez une recherche dans ce champ plutôt que dans le champ du nom de société sous forme de marque.

Si vous souhaitez effectuer des recherches rapides, vous devez disposer d’entrées d’index pointant directement vers les enregistrements qui vous intéressent. Il se peut que vous puissiez utiliser les données de proximité pour filtrer les enregistrements, mais cela sera lent. Je vois le problème comme suit: comment un "contient" une requête sur un champ complet peut-elle être effectuée efficacement?

Vous pourrez peut-être réduire l'augmentation de la taille de l'index en créant (pour chaque champ actuel) un "premier terme". champ et " termes restants " champ. Cela éliminerait la duplication du premier terme dans deux domaines. Pour " normal " requêtes, vous recherchez des termes de requête dans l’un de ces champs. Pour " commence avec " requêtes, vous recherchez uniquement le " premier terme " champ. Mais cela semble être plus de problèmes que ça ne vaut la peine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top