c# - ¿Cómo hacer búsquedas parciales de palabras en Lucene.NET?
(3)
Si, esto se puede hacer. Pero, comodín líder puede dar lugar a consultas lentas. Verifique la documentación . 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 solo de longitud 4) creará tokens para "Dayton Ohio" como "dayt", "ayto", "yton", y así sucesivamente.
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.
Mi índice contiene documentos con un campo Ubicación que contiene valores como
- Ohio
- Dayton, Ohio
- Dublin, Ohio
- Columbus, Ohio
Quiero poder escribir "ohi" y que aparezcan todos estos resultados y en este momento no aparece nada hasta que escriba la palabra completa "ohio".
Estoy usando Lucene.NET v2.3.2.1 y la parte relevante de mi código es la siguiente para configurar 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 que esto funcione como una cláusula LIKE similar a
SELECT * from Location where Name LIKE ''%ohi%''
¿Puedo hacer esto con Lucene?
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.
las personas generalmente usan analizadores realmente creativos que dividen palabras en palabras raíz (que quitan prefijos y sufijos).
profundiza en comprender lucene. es bueno. :-)
Prueba esta consulta:
parser.Parse(query.Keywords.ToLower() + "*")