Estoy tratando de implementar una búsqueda para una tienda en línea, los requisitos son los siguientes:

  1. Si el usuario solo busca el nombre de una categoría, devuelva la página de la categoría
  2. Si el usuario busca tanto una categoría como una marca, devuelva una página de búsqueda con el filtro de categoría y marca aplicado
  3. Si el usuario busca un valor que coincida exactamente con un producto, devuelva la página del producto.
  4. Si combinamos varios productos en varias categorías y marcas, devuelva los resultados.

Mi pregunta es: ¿es posible lograr esto usando un solo índice de Lucene o debo usar múltiples índices y buscar en todos ellos? Por lo que tengo entendido, Lucene no tiene relaciones, por lo que no puedo representar algo como categoría -> marca -> modelo.

¡Gracias!

2
Zephy 24 feb. 2021 a las 23:31

1 respuesta

La mejor respuesta

Mi pregunta es, ¿es posible lograr esto usando un solo índice de Lucene o debería usar múltiples índices y buscar en todos ellos?

Definitivamente puede lograr esto en un solo índice de LuceneNet. Tenga en cuenta que lo que normalmente se denomina "índice de Lucene" es en realidad una colección de índices dado que se pueden indexar varios campos.

Otra cosa que debe saber es que Lucene indexa "documentos" y no impone una estructura común a esos documentos. Un documento puede tener 2 campos (digamos categoryId, categoryName) y otro documento puede tener 4 campos (digamos productId, productName, productCategory, allProductFields). Lucene está totalmente de acuerdo con eso. Y si categoryName es un campo indexado, entonces puede buscar por ese campo y solo obtendrá los documentos que contengan ese campo y coincidan con la consulta. Lo mismo ocurre si consulta allProductFields.

Los desarrolladores pueden pensar en estos documentos como dos tipos de documentos, un documento de categoría y un documento de producto. Para Lucene, todos son solo documentos. Pero a veces es útil agregar a todos los documentos un campo que indique su "tipo de documento" tal como lo ve. Por ejemplo, puede optar por agregar un campo docType a cada documento y, al crear un documento a partir de un producto, puede establecer el valor de ese campo en "producto" y, al crear un documento a partir de una categoría, puede establecer su valor en "categoría".

Tener un campo de este tipo permite consultar solo documentos de productos o consultar solo documentos de categoría. Si no hay nombres de campo compartidos entre los documentos, entonces no es estrictamente necesario tener dicho campo. Pero supongamos que tanto los documentos de categorías como los documentos de productos tienen un campo llamado name, luego una búsqueda en el campo de nombre podría mostrar cualquier tipo de documento y tener un campo docType podría resultar útil para distinguir los tipos de resultados. devuelto, o podría usarse como parte de los criterios de búsqueda para buscar solo un tipo de documento.

Con suerte, esto le dará algunas ideas de cómo se puede utilizar un único "índice de Lucene" para realizar las diversas tareas que desea.

Por lo que tengo entendido, Lucene no tiene relaciones, por lo que no puedo representar algo como categoría -> marca -> modelo.

Bueno, es cierto que los documentos de Lucene no tienen intrínsecamente relaciones con otros documentos. Pero ciertamente puede optar por poner claves únicas en sus documentos y un docType, luego puede crear sus propias relaciones, por ejemplo, colocando el categoryId en el documento del producto y luego usándolo para retirar la categoría relacionada del producto. documento para cada producto devuelto en una búsqueda. Así que es una especie de rollo tu propio tipo de cosas.

También hay una cosa llamada BlockJoinQuery que es un poco más complicada y tiene algunas limitaciones. Puede aprender un poco al respecto con esta SO pregunta y respuestas y google alrededor en Internet al respecto.

Y finalmente, Lucene tiene un apoyo facetado. En realidad, tiene dos implementaciones de soporte de facetado. Uno de ellos utiliza un índice "side-car" (es decir, un índice hermano) y esta implementación admite facetas jerárquicas. Las facetas jerárquicas serían una forma mucho más avanzada de representar su categoría -> marca -> jerarquía del modelo. Si eso le interesa, la sesión de la conferencia Búsqueda por facetas con Lucene es algo que está probablemente querrá mirar.

2
Ron C 26 feb. 2021 a las 14:23