2010-02-12 13 views
6

Tengo una aplicación donde los usuarios pueden recoger piezas de automóviles. Escogen su vehículo y luego eligen los atributos del vehículo como facetas. Después de seleccionar su vehículo, pueden elegir facetas como el tamaño del motor, por ejemplo, para reducir la lista de resultados. El problema era que no todos los documentos tienen un tamaño de motor (es un valor vacío en Solr), ya que no importa para todas las partes. Por ejemplo, un tamaño de motor raramente es importante para un filtro de aire. Entonces, incluso si un usuario escogiera 3.5L para el tamaño de su motor, igual quería mostrar los filtros de aire en la pantalla como una posible parte que el usuario podría elegir. hice un poco de búsqueda y consulta de la siguiente faceta funciona perfectamente:¿Cómo buscaría las facetas en blanco en un campo de facetas multivalor y al mismo tiempo en Solr?

enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 

Esta consulta se correspondería con 3,5 o se correspondería con los registros donde no había valor para el campo Tamaño del motor (sin valor significaba que no tenía importancia, y se ajusta al automóvil). Perfecto ...

PROBLEMA: Hace poco hice que los campos de atributos del vehículo fueran campos multivalor, por lo que pude almacenar atributos para cada parte como una lista. Luego apliqué faceting a él, y funcionó bien. Sin embargo, el problema surgió cuando apliqué la consulta anteriormente mencionada. Al seleccionar la dimensión del tamaño del motor se redujo el número de documentos mostrados solo a documentos que tienen ese tamaño de motor, los registros (también uso el registro de palabras para referirme al documento) que tenían valores vacíos (es decir, "") para el tamaño del motor no aparecían. La misma consulta anterior no funciona para las facetas de varios valores de la misma manera que cuando el tamaño del motor era un campo de un solo valor.

Ejemplo:

<doc> 
    <str name="part">engine mount</str> 
    <arr name="enginesize"> 
    <str/> 
    <str/> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    </arr> 
<doc> 

<doc> 
    <str name="part">engine bolt</str> 
    <arr name="enginesize"> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    </arr> 
<doc> 

<doc> 
    <str name="part">air filter</str> 
    <arr name="enginesize"> 
    <str/> 
    <str/> 
    <str></str> 
    <str></str> 
    <str></str> 
    <str></str> 
    <str></str> 
    </arr> 
<doc> 

Lo que estoy buscando es una consulta que se tire hacia atrás documentos 1 y 3 anteriores, cuando hago una búsqueda faceta para el tamaño del motor de 3,5. El primer documento (la montura del motor) coincide, porque contiene el valor en uno de los campos con varios valores "tamaño del motor" que estoy buscando (contiene 3.5 en uno de los campos). Sin embargo, el tercer documento para el filtro de aire no se devuelve debido a los valores <str> vacíos. No deseo devolver el segundo documento porque no coincide con el valor de faceta

Básicamente quiero una consulta que coincida con valores de cadena vacíos para una faceta determinada y también coincida con el valor real, por lo que obtengo ambos documentos devueltos

¿Alguien tiene una consulta que devolvería el documento 1 y el documento 3 (el soporte del motor y el filtro de aire), pero no el documento del perno del motor?

He intentado lo siguiente sin éxito (incluyendo el que está en la parte superior de esta pregunta):

// returns everything 
enginesize:"3.5" OR (enginesize:[* TO *]) 
// only returns document 1 
enginesize:"3.5" OR (enginesize:["" TO ""] AND -enginesize:"3.5") 
// only returns document 1 
enginesize:"3.5" OR (enginesize:"") 

me importaron los datos anteriores mediante un archivo CSV, puse el campo keepEmpty=true. Probé en lugar de insertar manualmente un espacio en el campo cuando me genera el archivo CSV (lo que le daría <str> </str>, en lugar de la anterior, y luego vuelve a intentar las consultas de hacer eso, me dieron los siguientes resultados:.

// returns document 1 
enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 
// returns all documents 
enginesize:"3.5" OR (enginesize:["" TO ""] AND -enginesize:"3.5") 
// returns all documents 
enginesize:"3.5" OR (enginesize:"") 

¿alguien tiene una consulta que funcione para cualquier situación, si tengo un espacio como el valor en blanco o simplemente ningún valor?

Respuesta

8

¿qué hay de cambiar la forma de índice, en lugar de cómo se consulta?

lugar de tratar de indexar "el tamaño del motor no importa" como un registro vacío, indexarlo como "CUALQUIER".

A continuación, la consulta se convierte simplemente en enginesize: "3.5" O (enginesize: NINGUNA)

+0

No es necesario, ver http://stackoverflow.com/a/35646250/13365 – neu242

1

yo sólo he estado jugando con esto y encontré un hint que parece hacer el truco para mí. traducida a su pregunta debe ser:

enginesize:"3.5" OR (-enginesize:["" TO *]) 

HTH,

andi


Actualización: Después de algunas pruebas más, no creo que esto funciona de forma fiable - para algunos índices que tenía que ser al revés y sin el signo menos, es decir, enginesize:[* TO ""]. esto podría depender del tipo de índice, si tiene valores múltiples o incluso sobre los valores reales.

en cualquier caso, parece demasiado pirateo. probablemente voy a resolver sustituyendo el valor vacío con un marcador especial ...

Cuestiones relacionadas