2009-07-27 13 views
5

Ho un settore aziendale nell'indice Lucene. Uno dei nomi di società indicizzati è: Moody'sMemorizzazione di parole con apostrofo nell'indice di Lucene

Quando l'utente digita una delle seguenti parole chiave, desidero che questa società venga visualizzata nei risultati di ricerca. 1.Moo 2.Mood 3.Moodys di 4.Moody

Come devo conservare questo indice in Lucene e che tipo di Lucene Query dovrei usare per ottenere questo comportamento?

Grazie.

+0

La risposta dipende dal modo in cui si desidera creare il resto dell'indice: 1. La pluralizzazione deve essere rappresentata? cioè "Apple" e "Mele" sono distinti? 2. Vuoi mantenere gli apostrofi, o possono essere cancellati? 3. Il nome di una società appare isolato o all'interno di un campo più ampio? –

+0

grazie per i vostri commenti ... la mia risposta 1.No 2. Desidero che Lucene non mantenga gli apostrofi 3. Il nome della società può apparire isolted così come in un campo più ampio – Jimmy

risposta

9

Sulla base delle vostre precisazioni, voglio dividere la domanda in due, e rispondere a ciascuna a sua volta:

  1. Come faccio a parole indice con gli apostrofi come equivalenti alle parole simili senza un apostrofo? per esempio. mapping Moodys e Moody's allo stesso termine indicizzato.
  2. Come implementare la ricerca di completamento automatico in Lucene: ad esempio, dato un indice, trova i documenti utilizzando i prefissi delle parole, ad es. mappa Moo a Moodys?

1 è relativamente facile - Utilizzare un StandardToeknizer per creare un token che unisce l'apostrofo e s con la parola precedente, quindi un StandardFilter per rimuovere l'apostrofo e s. Questo convertirà Moody's in Moody. A StandardAnalyzer fa questo e molto altro (rimozione di parole minime e di stop), che potrebbe essere più del necessario. L'utilizzo di uno stelo dovrebbe utilizzare sia lo Moodys e Moody per lo stesso token. Prova SnowBallFilter per questo.

2 è più difficile: Lucene's PrefixQuery, a cui Alan ha alluso, funzionerà solo quando il nome dell'azienda è la prima parola in un campo. Hai bisogno di qualcosa come la risposta a this question about auto-complete in Lucene.

1

Lo StandardAnalyser dovrebbe funzionare per 3 e 4, ma non funziona per 1 e 2.

Senza scrivere il proprio (complessa) analizzatore testo, vorrei pensare a come vi aspettate nomi di società per essere Cercato. Ad esempio, la sintassi di ricerca lucene di base significa che è possibile trovare "Moody's" se si esegue la ricerca utilizzando i caratteri jolly: "Moo *" e "Mood *". Pertanto, potresti voler aggiungere un "*" al termine di ricerca prima di inviarlo a lucene, tuttavia ciò potrebbe causare confusione se l'utente non è a conoscenza di questa aggiunta di caratteri jolly sotto il cofano.