2011-09-14 9 views
5

Estoy tratando de diseñar un esquema para escenarios donde hay una relación Muchos a Muchos entre Productos y Proveedor. La búsqueda se puede realizar desde una forma centrada en el producto o desde una perspectiva centrada en el proveedor. Un producto puede ser suministrado por muchos proveedores y el proveedor tendrá muchos productos. A continuación está la solución que estoy pensando, pero parece que hay mucha redundancia en las definiciones de campo, ¿necesito 2 definiciones de entidad para soportar búsquedas centradas en productos o proveedores? No se ve óptimodiseño de esquema de solr para muchas a muchas definiciones de entidad

Cuando se realiza una búsqueda de un proveedor, "producto" se puede definir "MultiValue = true" Cuando se realiza una búsqueda de un producto, "proveedor" se puede definir "MultiValue = true"

<!-- Field definitions to support supplier search --> 
<field name="s_supplier" type="string" indexed="true" stored="true" > 
<field name="s_product" type="string" indexed="true" stored="true" multiValue="true"> 

<!-- Field definition to support product search --> 
<field name="p_product" type="string" indexed="true" stored="true" > 
<field name="p_supplier" type="string" indexed="true" stored="true" multiValue="true"> 

entidad definición en DataHandler es

<entity name="products" ....> 
    <field name="p_product" column=""> 
    <entity name="suppliers"> 
     <field name="p_supplier"> 
    </entity> 
</entity> 

<entity name="suppliers" ....> 
    <field name="s_supplier" column=""> 
    <entity name="products"> 
     <field name="s_product" column=""> 
    </entity> 
</entity> 

Respuesta

9

la belleza del motor de búsqueda Solr es que sólo se puede escoger una definición de esquema, ya sea producto o proveedor centrado y luego aprovechar el poder de Solr para lograr los resultados deseados. Digamos que usted va con una centrada en el producto, utilizando la siguiente:

<field name="product" type="string" indexed="true" stored="true" > 
<field name="supplier" type="string" indexed="true" stored="true" multiValue="true"> 

Ahora puede buscar productos simplemente mediante la ejecución de una consulta en el campo de productos product:my product y luego, si desea buscar un proveedor específico, solo puede usar supplier:my supplier y dado que el campo del proveedor es un campo multivalor asociado con cada producto, obtendrá todos los productos donde esté asociado ese proveedor.

Otra opción para una mayor flexibilidad sería la de aprovechar el campo text que se define en el archivo de ejemplo schema.xml y utilizar la función 'copyfield copiar ambos valores de proveedores y productos a un campo y se puede entonces buscar para cualquiera y obtendrá todos los documentos devueltos que coincidan con el término de la consulta en el campo del proveedor o del producto.

Aquí hay un ejemplo, sigue usando los campos definidos anteriormente.

<field name="text" type="text" indexed="true" stored="false" multiValued="true"/> 
<copyField source="product" dest="text" /> 
<copyField source="supplier" dest="text" /> 

A continuación, si la búsqueda de text:my term puede ser cualquiera de los productos o proveedor y todos los documentos en el índice que partido se volvió ese campo. Tenga en cuenta que el campo de texto tiene índices específicos y analizadores de tiempo de consulta aplicados, por lo que debe tener en cuenta lo que se está aplicando.

Además, si necesita generar una lista de proveedores únicos, puede aprovechar Solr Faceting para obtener esa lista de todos los documentos en el índice o solo relacionada con los criterios de búsqueda actuales.

favor, ver algunas de las siguientes referencias para más detalles sobre estos temas:

+0

Gracias por la respuesta elaborada. Estoy probando esto, publicaré los hallazgos. – tech20nn

Cuestiones relacionadas