¿Cómo buscaría facetas en blanco en un campo de facetas múltiple y al mismo tiempo en Solr?

StackOverflow https://stackoverflow.com/questions/2250751

  •  20-09-2019
  •  | 
  •  

Pregunta

Tengo una aplicación donde los usuarios pueden elegir piezas de automóvil. Eligen 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 del motor rara vez es importante para un filtro de aire. Entonces, incluso si un usuario eligió 3.5L para el tamaño de su motor, todavía quería mostrar los filtros de aire en la pantalla como una parte posible que el usuario podía elegir. Hice algo de búsqueda y la siguiente consulta de facetas funciona perfectamente:

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

Esta consulta coincidiría con 3.5 o coincidiría con los registros donde no había valor para el campo del tamaño del motor (ningún valor significaba que no importara y se ajustara al automóvil). Perfecto...

EL PROBLEMA: Recientemente hice los campos de atributos del vehículo, campos multivalorales, para poder almacenar atributos para cada parte como una lista. Luego apliqué facetando y funcionó bien. Sin embargo, surgió el problema cuando apliqué la consulta mencionada anteriormente. Al seleccionar la faceta de motores, se redujo el número de documentos que se muestran solo a documentos que tienen ese tamaño del motor, los registros (también uso el registro de palabras para significar el documento) que tenía valores vacíos (es decir, ") para motores, no aparecían. La misma consulta anterior no funciona para facetas multivaloras de la misma manera que cuando los motoresizaron era un solo campo valorado.

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 retire los documentos 1 y 3 anteriores cuando busque el tamaño del motor por 3.5. El primer documento (el soporte del motor) coincide, porque contiene el valor en uno de los campos multivalores "motines" 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 al vacío <str> valores. No quiero devolver el segundo documento porque no coincide con el valor de la faceta

Básicamente, quiero una consulta que coincida con los 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 devuelva el documento 1 y el documento 3 (el soporte del motor y el filtro de aire), pero no el documento del perno del motor?

Intenté lo siguiente sin éxito (incluido 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:"")

Importé los datos anteriores usando un archivo CSV, configuré el campo keepEmpty=true. En su lugar, intenté insertar manualmente un espacio en el campo cuando generé el archivo CSV (que le daría <str> </str>, en lugar del anterior, y luego volvió a juzgar las consultas. Al hacer eso, obtuve 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 cualquiera de las situaciones, ya sea que tenga un espacio como valor en blanco o simplemente no haya ningún valor en absoluto?

¿Fue útil?

Solución

¿Qué tal cambiar la forma en que indexa, en lugar de cómo consulta?

En lugar de intentar indexar "el tamaño del motor no importa" como un registro vacío, indexe como "cualquiera".

Entonces su consulta simplemente se convierte en motores: "3.5" o (motoresize: cualquiera)

Otros consejos

Acabo de estar jugando con esto y encontré un insinuación Eso parece hacer el truco por mí. traducido a su consulta debe ser:

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

hth,

y yo


Actualización: después de algunas pruebas más, no creo que esto funcione de manera confiable: para algunos índices 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 múltiples valores o incluso de los valores reales.

En cualquier caso, parece demasiado hack. Probablemente resolveré sustituir el valor vacío con un marcador especial ...

Tuve el mismo problema, pero lo resolví en https://stackoverflow.com/a/35633038/13365:

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

los -enginesize La solución no funcionó para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top