2009-07-06 9 views
10

Actualmente estoy intentando usar Lucene para buscar datos poblados en un índice.Lucene - Comodines en las frases

Puedo hacer coincidir las frases exactas entre corchetes (es decir, "Procesamiento de documentos"), pero no puedo conseguir que Lucene encuentre esa frase haciendo ningún tipo de "Documento de procesamiento *".

La diferencia obvia es el comodín al final.

Actualmente estoy intentando usar Luke para ver y buscar en el índice. (Disminuye el asterisco al final de la frase al analizar)

Adición de las comillas alrededor de los datos parece ser el principal culpable como la búsqueda de documentos * va a funcionar, pero "documento *" no lo hace

Cualquier la asistencia sería muy apreciada

+0

jugueteando con esto. Posible solución. ¿Hay alguna manera de hacer una búsqueda de proximidad con comodines? Sin embargo, parece que esto podría causar un gran golpe en el rendimiento. –

Respuesta

0

No solo el QueryParser no admite comodines en las frases, PhraseQuery en sí mismo solo admite Términos. MultiPhraseQuery se acerca, pero como dice su resumen, aún necesita enumerar IndexReader.terms usted mismo para que coincida con el comodín.

0

Parece que el QueryParser predeterminado no puede manejar esto. Probablemente pueda crear un QueryParser personalizado para comodines en frases. Si su ejemplo es representativo, stemming puede resolver su problema. Lea la documentación del PorterStemFilter para ver si encaja.

0

Otra alternativa es usar NGrams y específicamente el EdgeNGram. http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory

Esto creará índices para ngramos o partes de palabras. Documentos, con un tamaño Ngram min de 5 y tamaño Ngram máximo de 8, haría index: Docum Docume Documento Documentos

hay un poco de una solución de compromiso para el tamaño y el tiempo índice. Uno de los libros de Solr cita como una guía general: La indexación tarda 10 veces más Utiliza 5 veces más espacio en disco Crea 6 veces más términos distintos.

Sin embargo, EdgeNGram lo hará mejor que eso.

Debe asegurarse de no enviar caracteres comodín en sus consultas. Como no está haciendo una búsqueda de comodín, está haciendo coincidir un término de búsqueda en ngrams (partes de palabras).

0

Yo también estaba buscando lo mismo y lo que encontré es PrefixQuery da una combinación de algo así como este "Documento de procesamiento *". Pero el campo es el que está buscando debe ser dessecanado y almacenarlo en minúsculas (razón por la cual, dado que el indexador no guardará los valores de su campo en minúsculas) para que esto funcione.Aquí está el código para PrefixQuery que funcionó para mí: -

List<SearchResult> results = new List<SearchResult>(); 
Lucene.Net.Store.Directory searchDir = FSDirectory.GetDirectory(this._indexLocation, false); 
IndexSearcher searcher = new IndexSearcher(searchDir); 
Hits hits; 

BooleanQuery query = new BooleanQuery(); 
query.Add(new PrefixQuery(new Term(FILE_NAME_KEY, keyWords.ToLower())), BooleanClause.Occur.MUST); 
hits = searcher.Search(query); 
this.FillResults(hits, results); 
Cuestiones relacionadas