2011-04-27 8 views
68

Soy nuevo en Apache Solr. Incluso después de leer la parte documentation, me resulta difícil comprender claramente la funcionalidad y el uso de la propiedad de tipo de campo multiValued.¿Para qué sirve el tipo de campo "multiValued" en Solr?

¿Qué internamente Solr hace/trata/maneja un campo que está marcado como multiValued?

¿Cuál es la diferencia en la indexación en Solr entre un campo que es multiValued y los que no?

¿Alguien puede explicar con un buen ejemplo?

Doc dice:

de varios valores = true | false

True si este campo puede contener varios valores por documento, es decir, si puede aparecer varias veces en un documento

Respuesta

68

Un campo multivalor es útil cuando hay más de un valor presente para el campo. Un ejemplo fácil serían las etiquetas, puede haber múltiples etiquetas que necesitan ser indexadas. así que si tenemos el campo de etiquetas como multivalor, la respuesta del solr devolverá una lista en lugar de un valor de cadena. Un punto a tener en cuenta es que hay que presentar varias líneas para cada valor de las variables como:

 
<field name="tags">tag1</tags> 
<field name="tags">tag2</tags> 
... 
<field name="tags">tagn</tags> 

una vez que tenga todo el índice de valores que se pueden buscar o filtrar los resultados por cualquier valor, e, g.se pueden encontrar todos los documentos con la etiqueta 1 utilizando consulta como

q=tags:tag1 

o utilizar las etiquetas para filtrar los resultados como

q=query&fq=tags:tag1 
+5

¿Cuál es la diferencia/ventaja entre hacer 'resultados de búsqueda o filtro por cualquier valor '? En este caso, ¿qué diferencia hace al buscar con * tags: tag1 * en 'q' o 'fq'? – Gnanam

+1

cada valor puede ser una cadena y puede coincidir exactamente con un conjunto de cadenas. En el caso de un campo con un solo valor, puede tener palabras tokenizadas o una cadena completa. Otro uso es almacenar valores que son listas como mencioné en el caso de las etiquetas, pueden ser números como una lista de valores numéricos. – Umar

+6

@Gnanam: las consultas filtradas se almacenan en caché y no afectan el puntaje. Su objetivo principal es crear un "superconjunto" fijo de documentos, que luego se puede buscar. Ejemplo: el usuario ingresa una consulta y la aplicación aplica restricciones adicionales, por ejemplo, para buscar solo los documentos que posee el usuario. En este caso, la aplicación enviaría la restricción "only given user" como 'fq' y la consulta de búsqueda real como' q'. –

14

multiValued se define en el esquema si se permite que el campo tenga más de un valor.

Por ejemplo:
si tengo una FieldType llamado ID que es multivalor = false indexación de un documento como este:

doc { 
    id : [ 1, 2] 
    ... 
} 

causaría una excepción a ser lanzado en el hilo de indexación y el documento se no indexado (la validación del esquema fallará).

Por otro lado, si tengo varios valores para un campo que me gustaría establecer valores múltiples = true con el fin de garantizar que la indexación se realiza correctamente, por ejemplo:

doc { 
    id : 1 
    keywords: [ hello, world ] 
    ... 
} 

En este caso lo haría defina "palabras clave" como un campo multiValued.

+1

Avísame si he entendido esto correctamente. Por ejemplo, si trato de indexar datos directamente desde la base de datos usando 'DataImportHandler' y si uno de mis campo de base de datos * tag * tipo es' VARCHAR [] '(varchar array), entonces tendría sentido mapear este campo * tag * en el campo Solar schema como multiValued. ¿Estoy en lo correcto en mi comprensión? – Gnanam

+1

tarde en el juego aquí, pero generalmente diría que sí ... pero nunca digas nunca y nunca digas siempre – markg

12

utilizo varios campos de valor únicamente con copyfields, por lo que de esta manera, dicen todos los campos será un solo valor a menos que sea un copyfield, por ejemplo tengo siguientes campos:

<field name="id" type="string" indexed="true" stored="true"/> 
<field name="name" type="string" indexed="true" stored="true"/> 
<field name="subject" type="string" indexed="true" stored="true"/> 
<field name="location" type="string" indexed="true" stored="true"/> 

Quiero consultar un solo campo y, posiblemente, para buscar los 4 campos arriba, entonces tenemos que u se copyfield. primero en crear un nuevo llamado campo 'todo', y luego copiar todo en 'todos'

<field name="all" type="text" indexed="true" stored="true" multiValued="true"/> 
<copyField source="*" dest="all"/> 

Ahora campo 'todos' tienen que ser de varios valores.