2013-02-22 9 views
6

L'analizzatore standard non funziona. Da quello che posso capire, cambia questo per una ricerca di c e netCome personalizzare Lucene.NET per cercare parole con simboli senza distinzione tra maiuscole e minuscole (ad es. "C#" o ".net")?

Il WhitespaceAnalyzer avrebbe funzionato, ma è case sensitive.

La regola generale è di ricerca dovrebbe funzionare come Google in modo sperando che sia una cosa di configurazione considerando .net, c# ci sono stato fuori per un po 'o c'è una soluzione per questo.

Per i suggerimenti di seguito, ho provato l'WhitespaceAnalyzer personalizzato, ma poi se le parole chiave sono separate da una virgola e nessuno spazio non viene gestito correttamente ad es.

java,.net,c#,oracle 

non verrà restituito durante la ricerca che non sarebbe corretto.

Mi sono imbattuto in PatternAnalyzer che viene utilizzato per dividere i token ma non riesco a capire come usarlo in questo scenario.

sto usando Lucene.Net 3.0.3 e .NET 4.0

+0

è il codice sorgente del dominio? O sono solo esempi? – phani

+0

@phani quelli sono solo esempi – Kumar

risposta

-2

per gli altri che potrebbero essere alla ricerca di una risposta così

la risposta finale girò a essere fuori per creare un TokenFilter personalizzato e un analizzatore personalizzato utilizzando quel Segno filtro con Whitespacetokenizer, lowercasefilter ecc, tutto sommato circa 30 righe di codice, creerò un post sul blog e pubblicherò il link qui quando lo faccio, devo prima creare un blog!

+0

ciao ogni possibilità che tu possa pubblicarlo su un Gist? Sembra molto utile – mcintyre321

7

Scrivi la tua classe analizzatore personalizzati simile a SynonymAnalyzer in Lucene.Net – Custom Synonym Analyzer. L'override di TokenStream potrebbe risolvere questo problema eseguendo il pipelining dello stream utilizzando WhitespaceTokenizer e LowerCaseFilter.

Ricordare che l'indicizzatore e il ricercatore devono utilizzare lo stesso analizzatore.

Aggiornamento: Gestione di più delimitati da virgole parole chiave

Se avete solo bisogno di gestire le parole chiave unspaced delimitati da virgole per ricerca, non indicizzare allora si potrebbe convertire l'espressione di ricerca expr come di seguito.

expr = expr.Replace(',', ' '); 

Poi passano expr al QueryParser. Se vuoi supportare altri delimitatori come ';' si potrebbe fare in questo modo:

var terms = expr.Split(new char[] { ',', ';'}); 
expr = String.Join(" ", terms); 

Ma è anche necessario verificare la presenza di una frase un'espressione come "Sybase, C# ,. net, Oracle" (espressione include la citazione "caratteri) che non deve essere convertito (il utente è alla ricerca di una corrispondenza esatta):

expr = expr.Trim(); 
if (!(expr.StartsWith("\"") && expr.EndsWith("\""))) 
{ 
    expr = expr.Replace(',', ' '); 
} 

l'espressione potrebbe includere sia una frase e alcune parole chiave, in questo modo:

"sybase,c#,.net,oracle" server,c#,.net,sybase 

allora avete bisogno di analizzare e tradurre l'espressione di ricerca a questo:

"sybase,c#,.net,oracle" server c# .net sybase 

Se hai bisogno anche di gestire le parole chiave unspaced delimitati da virgole per l'indicizzazione allora avete bisogno di analizzare il testo per parole chiave unspaced delimitati da virgole e memorizzarli in un campo distinto per esempio. Keywords (che deve essere associato all'analizzatore personalizzato).Allora la vostra gestore di ricerca ha bisogno di convertire un'espressione di ricerca come questa:

server,c#,.net,sybase 

a questo:

Keywords:server Keywords:c# Keywords:.net, Keywords:sybase 

o più semplicemente:

Keywords:(server, c#, .net, sybase) 
+0

provato ma poi non riconosce le parole chiave come oracle, .net, C#, sybase ecc. Che sono fatte da google - lo standard d'oro per i nostri utenti per così dire, guarderà più info magari personalizzando il tokenizer se possibile – Kumar

+0

Aggiunti i dettagli al numero – Kumar

+0

questo è necessario per la ricerca e l'indicizzazione, un'idea interessante sull'analisi in un campo separato ma sarebbe più un lavoro considerando che dovremmo gestire say .net4/.net4.5 ecc. piuttosto che una ricerca .net * (silenziosa) ecc. Se non riesco a capire un modo per personalizzare il tokenizer, allora dovrò fare qualcosa come questo – Kumar

4

Utilizzare i WhitespacerAnalyzer e catena con un LowerCaseFilter .

Utilizzare la stessa catena alla ricerca e all'indice. convertendo tutto in minuscolo, lo rendi effettivamente insensibile alle maiuscole e alle minuscole.

In base alla descrizione del problema, questo dovrebbe funzionare ed essere semplice da implementare.

Problemi correlati