2009-07-27 8 views
5

J'ai un champ d'entreprise dans Lucene Index. Un des noms de sociétés indexés est: Moody'sStocker des mots avec apostrophe dans l'index Lucene

Lorsque l'utilisateur tape l'un des mots-clés suivants, je souhaite que cette société apparaisse dans les résultats de recherche. 1.Moo 2.Mood 3.Moodys

de 4.Moody

Comment conserver cet indice dans Lucene et quel type de Lucene Interrogation dois-je utiliser pour obtenir ce comportement?

Merci.

+0

La réponse dépend de la manière dont vous voulez construire le reste de votre index: 1. La pluralisation doit-elle être représentée? c'est-à-dire que "Apple" et "Apple" sont distincts? 2. Voulez-vous garder les apostrophes, ou peuvent-elles être effacées? 3. Un nom de société apparaît-il isolé ou dans un champ plus grand? –

+0

merci pour vos commentaires ... ma réponse 1.Non 2.Je veux que Lucene ne garde pas d'apostrophes 3. Le nom de l'entreprise peut apparaître isolé ainsi que dans un champ plus grand – Jimmy

Répondre

9

Sur la base de vos précisions, je veux diviser votre question en deux, et répondre chacun à son tour:

  1. Comment puis-je dire d'index avec l'apostrophe comme équivalent à des mots similaires sans apostrophe? par exemple. mappage Moodys et Moody's au même terme d'index.
  2. Comment implémenter la recherche automatique dans Lucene - c'est-à-dire avec un index, trouver des documents en utilisant des préfixes de mots, par ex. carte Moo à Moodys?

1 est relativement facile - Utilisez un StandardToeknizer pour créer un jeton combinant l'apostrophe et s avec le mot précédent, puis un StandardFilter pour enlever lapostrophe et s. Cela convertira Moody's en Moody. A StandardAnalyzer cela et beaucoup plus (minuscules et suppression de mots d'arrêt), ce qui peut être plus que nécessaire. L'utilisation d'un stemmer doit prendre les deux Moodys et Moody au même jeton. Essayez SnowBallFilter pour cela.

2 est plus difficile: Le PrefixQuery de Lucene, auquel Alan a fait allusion, ne fonctionnera que lorsque le nom de l'entreprise est le premier mot d'un champ. Vous avez besoin de quelque chose comme la réponse à this question about auto-complete in Lucene.

1

Le StandardAnalyser devrait fonctionner pour 3 et 4, mais ne fonctionnera pas pour 1 et 2.

Sans écrire votre propre analyseur de texte (complexe), je pense sur la façon dont vous attendez les noms de la société à recherché. Par exemple, la syntaxe de base de recherche lucene signifie que vous pouvez trouver "Moody's" si vous effectuez une recherche en utilisant des caractères génériques: "Moo *" et "Mood *". Par conséquent, vous pourriez envisager d'ajouter un "*" au terme de recherche avant de soumettre à lucene, mais cela pourrait causer une certaine confusion si l'utilisateur n'est pas au courant de cette addition générique sous le capot.