2012-04-17 19 views
10

Tengo problemas con un índice Lucene, que tiene palabras indexadas, que contienen caracteres "-".Lucene Problemas de índice con el carácter "-"

Funciona para algunas palabras que contienen "-" pero no para todas, y no encuentro el motivo, por qué no está funcionando.

El campo que estoy buscando, se analiza y contiene la versión de la palabra con y sin el carácter "-".

estoy usando el analizador: org.apache.lucene.analysis.standard.StandardAnalyzer

aquí un ejemplo:

si busco "gsx- *" Tengo resultado, el índice campo contiene "SUZUKI GSX-R 1000 GSX-R1000 GSXR"

pero si busco "v- *" no obtuve ningún resultado. El campo indexado del resultado esperado contiene: "SUZUKI DL 1000 V-Strom DL1000V-STROMVSTROM V STROM"

Si busco para "V-Strom" sin "*" funciona, pero si sólo la búsqueda de " v-str "por ejemplo, no obtengo el resultado. (Debe haber un resultado porque es para una búsqueda en vivo de una tienda web)

Entonces, ¿cuál es la diferencia entre los 2 resultados esperados? ¿Por qué funciona para "gsx- " pero no para "v-"?

+0

Interesante, trabajo con Solr y manejo V-Strom 650 :) –

+1

¿Ha comprobado realmente el contenido del campo indexado o solo espera que sea así? Si no utiliza la herramienta de índice más grande de Lucene, Luke: http://code.google.com/p/luke/ –

+0

sí, se muestra el mismo campo que estoy buscando en – Zteve

Respuesta

12

StandardAnalyzer tratará el guión como espacio en blanco, creo. Por lo tanto, convierte su consulta "gsx-*" en "gsx*" y "v-*" en nada porque también elimina los tokens de una sola letra. Lo que ve como el contenido del campo en el resultado de búsqueda es el valor almacenado del campo, que es completamente independiente de los términos que fueron indexados para ese campo.

Así que lo que desea es que "v-strom" en su totalidad sea un término indexado. StandardAnalyzer no es adecuado para este tipo de texto. Tal vez tener un ir con el WhitespaceAnalyzer o SimpleAnalyzer. Si eso aún no funciona, también tienes la opción de lanzar tu propio analizador, o simplemente comenzar los dos y componerlos con TokenFilters. Una muy buena explicación se da en the Lucene Analysis package Javadoc.

BTW no es necesario ingresar todas las variantes en el índice, como V-strom, V-Strom, etc. La idea es que el mismo analizador normalice todas estas variantes al misma cadena tanto en el índice como durante el análisis de la consulta.

+0

Gracias por su ayuda, sé que la pantalla el valor es independiente del campo buscado/indexado, pero para las pruebas visualicé el campo en el que estoy buscando. También uso a luke para probar y analizar el problema. Entonces, lo que necesito exactamente es que el cliente pueda escribir v- y obtenga todos los resultados que comienzan con v-. ¿Qué necesito cambiar, que funciona? Solo necesito la sintaxis correcta para poder cambiar la consulta del cliente – Zteve

+0

Estoy un poco oxidado con Solr, pero comenzaría añadiendo un campo adicional a su esquema (por ejemplo, nombre_producto) que solo debería minúsculas (campo tipo = minúscula). Agregue este campo (O) a sus URL de solicitud de búsqueda como parámetro adicional con mayor peso. –

+0

¿qué tipo de sintaxis/valor debería estar en este campo product_name? el mismo contenido que en el campo indexado real? También es posible cambiar el valor del campo indexado, ya que podría cambiarlo a "V-STROM v-strom vstrom v strom V STROM", ¿podría un cambio de valor ofrecer la solución?Lo único arreglado es que el cliente debería poder encontrar el resultado cuando escribe "v-str" o "v-", etc. en el campo de búsqueda. – Zteve

3

ClassicAnalyzer maneja '-' como un carácter útil, sin delimitador. Como yo entiendo ClassicAnalyzer, maneja '-' como el preamplificador estándar 3.1 ya que ClassicAnalyzer usa ClassicTokenizer que trata los números con un '-' incrustado como código de producto, por lo que todo se tokeniza como un término.

Cuando estaba en el Regenstrief Institute noté esto después de actualizar a Luke, ya que los términos médicos estándar de LOINC (LOINC fue iniciado por RI) se identifican por un número seguido de '-' y un dígito de verificación, como '1-8 'o' 2857-1 '. Mis búsquedas de LOINC como '45963-6' fallaron al utilizar StandardAnalyzer en Luke 3.5.0, pero tuvieron éxito con ClassicAnalyzer (y esto fue porque construimos el índice con 2.9.2 Lucene.NET).

+0

Acabo de probar y a partir de Lucene 4.0.0 WhitespaceAnalyzer no eliminará el guión, pero el estándar y el clásico lo harán. –

1

Se recomienda el ClassicAnalzer para indexar texto que contenga códigos de producto como 'GSX-R1000'. Reconocerá esto como un término único y no dividirá sus partes.Pero, por ejemplo, el texto "Europa/Berlín" se dividirá por el ClassicAnalzer en las palabras "Europa" y "Berlín". Esto significa que si tiene un texto indexada por el ClassicAnalyzer que contiene la frase

Europe/Berlin GSX-R1000 

puede buscar "Europa", "Berlín" o "GSX-R 1000".

Pero tenga cuidado con el analizador que utiliza para la búsqueda. Creo que la mejor opción para buscar un índice de Lucene es el KeywordAnalyzer. Con la KeywordAnalyzer también puede buscar campos específicos en un documento y se puede construir consultas complejas como:

(processid:4711) (berlin) 

Esta consulta buscará documentos con la frase 'Berlín', sino también un campo 'ProcessId' que contiene el número 4711

Pero si busca en el índice la frase "europa/berlín", ¡no obtendrá ningún resultado! Esto se debe a que KeywordAnalyzer no modificó su frase de búsqueda, pero la frase "Europa/Berlín" se dividió en dos palabras separadas por ClassicAnalyzer. Esto significa que debe buscar 'europe' y 'berlin' por separado.

Para resolver este conflicto se puede traducir un término de búsqueda, introducido por el usuario, en una consulta de búsqueda adaptada a sus necesidades utilizando el siguiente código:

QueryParser parser = new QueryParser("content", new ClassicAnalyzer()); 
Query result = parser.parse(searchTerm); 
searchTerm = result.toString("content"); 

Este código se traducirá el pharse Serach

Europe/Berlin 

en

europe berlin 

que se traducirá en el conjunto de documentos esperado .

Nota: Esto también funcionará en situaciones más complejas. El término de búsqueda

Europe/Berlin GSX-R1000 

se traducirá en:

(europe berlin) GSX-R1000 

que buscará correctamente para todas las frases en combinación utilizando el KeywordAnalyzer.

Cuestiones relacionadas