2009-12-04 12 views
9

Tengo un índice relativamente pequeño que contiene alrededor de 4.000 ubicaciones. Entre otras cosas, lo estoy usando para rellenar un campo de autocompletar en un formulario de búsqueda.¿Cómo hacer búsquedas parciales de palabras en Lucene.NET?

Mi índice contiene documentos con un campo de Ubicación que contiene valores como

  • Ohio
  • Dayton, Ohio
  • Dublin, Ohio
  • Columbus, Ohio

quiero estar puedo escribir "ohi" y todos estos resultados aparecen y en este momento no aparece nada hasta que escriba la palabra completa "ohio".

estoy usando v2.3.2.1 Lucene.NET y la parte correspondiente de mi código es el siguiente para la creación de mi consulta ....

BooleanQuery keywords = new BooleanQuery(); 
QueryParser parser = new QueryParser("location", new StandardAnalyzer()); 
parser.SetAllowLeadingWildcard(true); 
keywords.Add(parser.Parse("\"*" + location + "*\""), BooleanClause.Occur.SHOULD); 
luceneQuery.Add(keywords, BooleanClause.Occur.MUST); 

En resumen, me gustaría conseguir este trabajo como una cláusula LIKE similar a

SELECT * from Location where Name LIKE '%ohi%' 

¿Puedo hacer esto con Lucene?

Respuesta

14

Intentar esta consulta:

parser.Parse(query.Keywords.ToLower() + "*") 
+0

¡Eso hizo el truco! Usted tenía justo lo que necesitaba. /GBT: werd !!! – JamieGaines

+3

Esta respuesta no refleja cómo debería ser el código final. No sé dónde poner esto. ¿Qué tipo es "consulta"? Una muestra final sería genial. – irperez

+0

En Java al menos, debe recortar espacios, ya que la consulta "Prueba *" compilará mientras "Prueba *" no lo hará – bcoughlan

0

es más una cuestión de poblar su índice con palabras parciales en primer lugar. su analizador debe incluir las palabras clave parciales en el índice mientras analiza (y esperemos que las pondere más abajo que las palabras clave completas).

Los árboles de búsqueda de índice lucene funcionan de izquierda a derecha. si desea buscar en medio de una palabra clave, la divide a medida que la analiza. el problema es que las palabras clave parciales explotarán sus tamaños de índice generalmente.

personas generalmente usan analizadores realmente creativos que rompen palabras en palabras raíz (que quitan prefijos y sufijos).

profundice en la comprensión de lucene. es bueno. :-)

1

Sí, esto se puede hacer. Pero, comodín líder puede dar lugar a consultas lentas. Compruebe el documentation. Además, si está indexando toda la cadena (por ejemplo, "Dayton, Ohio") como un token único, la mayoría de las consultas se degenerarán en consultas de prefijos. Usar un tokenizer como StandardAnalyzer (que supongo que ya está haciendo) disminuirá el requisito de comodín principal.

Si no desea prefijos iniciales por motivos de rendimiento, puede probar la indexación de ngrams. De esta forma, no habrá ninguna consulta comodín principal. El tokenizador ngram (suponiendo solamente de longitud 4) creará tokens para "Dayton Ohio" como "dayt", "ayto", "yton", y así sucesivamente.

+0

Gracias por la respuesta. No estoy demasiado preocupado por las consultas lentas todavía, ya que me gustaría ver que funcione antes de decidir si es demasiado lento o no. Mi lista de ubicaciones debe mantenerse constante en alrededor de 4.000 documentos, así que no estoy demasiado preocupado de que se haga más grande. Cuando dice "Sí, esto se puede hacer". podrías elaborar un poco más? Pensé que el código que mostraba arriba debería estar haciendo lo que esperaba, pero no es así. ¿Alguna idea sobre lo que estoy haciendo mal? – JamieGaines

Cuestiones relacionadas