Lucene.NET-haz una AND y busca varias palabras en mĂșltiples campos
(3)
Defino un objeto de documento para mi entidad de producto que tiene varios campos: Título, Marca, Categoría, Tamaño, Color, Material.
Ahora quiero ayudar al usuario a hacer una búsqueda Y en múltiples campos. Cualquier documento que tenga uno, dos o más campos contiene todas las palabras de búsqueda serán respondidas.
Por ejemplo, cuando el usuario ingrese "gucci shirt red", quiero devolver todos los documentos que tengan campos combinados con los 3 símbolos "gucci", "shirt" Y "red". Entonces todos los documentos a continuación serán respondidos:
1.Documentos con título contiene las 3 palabras, por ejemplo, Título = "Gucci Modern Shirt Red" o "Gucci blue shirt" ...
2.Documentos con título = "Camisa clásica Gucci" Y Color = "rojo"
3.Documentos con categoría = "camisa para hombre" Y marca = "gucci" Y color = "rojo"
4.etc ..
Sé que el operador de soporte de Lucene + debe hacer una consulta de búsqueda MUST. Por ejemplo, puedo traducir la palabra clave anterior para consultar "+ gucci + shirt + red", entonces estoy seguro de que los documentos del ejemplo anterior (1) serán definitivamente respondidos. Pero, ¿funciona para los casos (2) y (3) anteriores?
No, cuando no se proporciona un campo para buscar explícitamente en la consulta, irá al campo predeterminado, que aparecería como el "título" en su caso. Necesitaría una consulta más como:
+shirt +color:red +brand:gucci
por ejemplo.
O bien, un uso común es configurar un campo catch all, en el que todos (o un subconjunto grande) de datos de búsqueda se combinan, lo que le permite buscar todo de una manera muy flexible, en ese campo, en cuyo caso lo haría solo use algo como:
all:(+shirt +gucci +red)
O bien, si hiciste ese campo tu campo predeterminado en su lugar:
+shirt +gucci +red
Como usted indicó.
Al hacer este tipo de consultas, me gusta: crear una BooleanQuery maestra y agregar varias subconsultas que funcionen juntas para obtener el mejor resultado :
- TermQuery: (coincidencia exacta), alguien escribe la coincidencia exacta del título
- PhraseQuery: (use slop), por lo que si tiene "Gucci Modern Shirt Red" y alguien escribe "Gucci Shirt" (observe un salto de palabras) coincidiría
- FuzzyQuery: (lento en grandes índices (> 50 millones de registros) / no relacionados con la memoria) para dar cuenta de posibles errores ortográficos
- Subconsulta Booleana: con todos los términos separados y ordenados. Las consultas que coincidan con 1 de nuestras 4 palabras tendrán un puntaje bajo, sin embargo 3/4 palabras tendrán un puntaje más alto.
- Query Parse (como se mencionó anteriormente con potenciales aumentos de campo)
- Otros: es decir, búsqueda sinónima de frases, etc.
Quisiera O todos estos tipos y luego los filtro usando un puntaje mínimo de Colector.
El motivo por el que me gusta el enfoque maestro BooleanQuery es que puede tener una configuración donde un usuario elige "el tipo" de consulta. Tal vez sea simple -> avanzado y es fácil agregar / eliminar tipos de consultas rápidamente sobre la marcha y la consulta se puede construir con bastante facilidad dando resultados predictivos. Al aumentar los registros / similitudes, usted está trabajando dentro del algoritmo interno de Lucene y los resultados no son a veces claros.
Rendimiento: He realizado consultas como esta usando Lucene 3.0.x en índices con> 100M de registros NOT IN MEMORY y funciona bastante rápido dando respuestas en segundos. Fuzzy Query ralentiza las cosas, pero como se dijo antes, se puede convertir en una opción de búsqueda avanzada (o "Buscar de nuevo con ...")
Puede usar MultiFieldQueryParser. Agregue título, color, marca, etc. a esto.
Si busca "gucci shirt red", usar el analizador anterior devolvería consultas como
+ ((Título: gucci Color: gucci Marca: gucci) (Título: camisa Color: camisa Marca: camisa) (Título: rojo Color: rojo Marca: rojo)
Esto deberia resolver el problema.
Además, si lo desea, digamos que para la consulta anterior, desea mostrar la marca con los productos de Gucci para que se muestre primero, entonces podría aplicar el impulso a este campo.