solr tokenize sunspot solr4 sunspot-solr

Solr: no se pueden buscar números mezclados con caracteres



tokenize sunspot (1)

Tengo algunos elementos en mi índice (Solr. 4.4), que contienen nombres como Foobar 135g , donde el 135g se refiere a algunos pesos. La búsqueda de foobar o foobar 135 funciona, pero cuando intento buscar la frase exacta foobar 135g , no se encuentra nada.

Analicé la consulta dentro del panel de administración de solr "Análisis". Aquí todo se ve bien. Los campos están indexados correctamente, la consulta se divide correctamente y obtengo visitas (indicadas por este fondo morado en los tokens).

Pero tiene que haber un problema por la forma en que proceso las cadenas en el índice y / o el tiempo de consulta. Esta es la definición de campo que estoy usando:

<fieldType name="text" class="solr.TextField" omitNorms="false"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30"/> <filter class="solr.ReverseStringFilterFactory" /> <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30"/> <filter class="solr.ReverseStringFilterFactory" /> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>

Estoy usando los dos ReverseStringFilterFactory con EdgeNGramFilterFactory para poder buscar foob y para bar u obar (cadenas que aparecen al final del nombre de un elemento). Primero pensé que tenía algo que ver con WordDelimiterFilterFactory y las opciones de WordDelimiterFilterFactory . Pero esta opción no hace nada con los números (¿estoy en lo cierto?).

Después de leer la documentación ( http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters ) encontré generateNumberParts que por defecto es 1 . Esto lleva a dividir 135g en 135 g . Pero mientras tenga habilitada la opción preserveOriginal , el 135g también se indexa como una cadena completa. Esto también se muestra en el panel Análisis desde la interfaz de administración:

¿Alguien sabe qué tipo de filtro, tokenizador ... está causando este problema?

ACTUALIZAR

He descubierto algo interesante. Cuando depuro la consulta para la búsqueda 135g , obtengo el siguiente resultado de depuración:

<lst name="debug"> <str name="rawquerystring">name_texts:135g</str> <str name="querystring">name_texts:135g</str> <str name="parsedquery">MultiPhraseQuery(name_texts:"(135g 135) (g 135g)")</str> <str name="parsedquery_toString">name_texts:"(135g 135) (g 135g)"</str> <lst name="explain"/> <str name="QParser">LuceneQParser</str> ... </lst>

Entiendo que debido a la solr.WordDelimiterFilterFactory antes mencionado, la cadena se divide en partes. Pero ¿por qué Solr lo está convirtiendo en una MultiPhraseQuery ? Estoy un poco confundido en este momento, pensé que cada token generado por el solr.WordDelimiterFilterFactory en el tiempo de consulta solr.WordDelimiterFilterFactory una búsqueda separada (o al menos, una declaración OR entre los tokens).

Por favor, alguien aclare mi mente, estoy un poco confundido;) ¿Cómo puedo evitar esto?


Es el WordDelimiterFilterFactory. Debería poder verlo en su panel de administración bajo análisis. Para no hacer ese uso: splitOnNumerics = "0" como atributo.

Actualizar:

Lea más sobre esto aquí: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters .

solr.WordDelimiterFilterFactory

Crea solr.analysis.WordDelimiterFilter.

Divide palabras en subwords y realiza transformaciones opcionales en grupos de subpalabras. Por defecto, las palabras se dividen en subwords con las siguientes reglas:

splitOnNumerics = "1" hace que alfabeto => transiciones numéricas generen una nueva parte [Solr 1.3]: "j2se" => "j" "2" "se" el valor predeterminado es verdadero ("1"); establecer a 0 para apagar

Actualización 2

Basado en tu último comentario, ahora entendí lo que querías decir. Tomé su definición de tipo de campo e indicé en solr4.5.1 con su oración y pude buscar test_mytext: "foobar 135g", test_mytext: foobar 135g, test_mytext: foobar 135g, test_mytext: foobar, test_mytext: 135g, test_mytext: 135. donde test_mytext es del tipo que definió en su pregunta anterior. Así que no sé por qué no puede encontrar en su propio índice. Asegúrese de que su campo esté definido de la siguiente manera: <field name="text" type="mytext" indexed="true" stored="true"/>

Upadate 3 Aquí está mi registro de depuración, con su definición de campo, no explica por qué está viendo un procesamiento completamente diferente: Query => test_mytext: 135g debug ": {" rawquerystring ":" test_mytext: 135g "," querystring ":" test_mytext: 135g "," parsedquery ":" test_mytext: 135g test_mytext: 135 test_mytext: g test_mytext: 135g "," parsedquery_toString ":" test_mytext: 135g test_mytext: 135 test_mytext: g test_mytext: 135g "," explain ": {" 200 ": "/ n0.8563627 = (COINCIDIR) producto de: / n 1.141817 = (COINCIDIR) suma de: / n 0.35407978 = (COINCIDIR) peso (test_mytext: 135g en 1) [DefaultSimilarity], resultado de: / n 0.35407978 = puntaje ( doc = 1, freq = 2.0 = termFreq = 2.0 / n), producto de: / n 0.45980635 = queryWeight, producto de: / n 3.4849067 = idf (docFreq = 2, maxDocs = 36) / n 0.13194223 = queryNorm / n 0.77006286 = fieldWeight en 1, producto de: / n 1.4142135 = tf (freq = 2.0), con frecuencia de: / n 2.0 = termFreq = 2.0 / n 3.4849067 = idf (docFreq = 2, maxDocs = 36) / n 0.15625 = fieldNorm (doc) = 1) / n 0.4336574 = (COINCIDIR) peso (test_mytext: 135 en 1) [DefaultSimilarity], result de: / n 0.4336574 = puntuación (doc = 1, freq = 3.0 = termFreq = 3.0 / n), producto de: / n 0.45980635 = queryWeight, producto de: / n 3.4849067 = idf (docFreq = 2, maxDocs = 36) / n 0.13194223 = queryNorm / n 0.94313055 = fieldWeight en 1, producto de: / n 1.7320508 = tf (freq = 3.0), con la frecuencia de: / n 3.0 = termFreq = 3.0 / n 3.4849067 = idf (docFreq = 2, maxDocs = 36 ) / n 0.15625 = fieldNorm (doc = 1) / n 0.35407978 = (MATCH) peso (test_mytext: 135g en 1) [DefaultSimilarity], resultado de: / n 0.35407978 = puntaje (doc = 1, freq = 2.0 = termFreq = 2.0 / n), producto de: / n 0.45980635 = queryWeight, producto de: / n 3.4849067 = idf (docFreq = 2, maxDocs = 36) / n 0.13194223 = queryNorm / n 0.77006286 = campoPeso en 1, producto de: / n 1.4142135 = tf (freq = 2.0), con frecuencia de: / n 2.0 = termFreq = 2.0 / n 3.4849067 = idf (docFreq = 2, maxDocs = 36) / n 0.15625 = fieldNorm (doc = 1) / n 0.75 = coord (3 / 4) / n "},

Estoy usando solr 4.5.1.

Actualización 4 Entonces noté que estás usando Solr 4.4.0. Tomé su definición y frase exacta del campo y ejecuté una consulta y encuentra su resultado.

Query => name_texts: "135g"

Resultado:

<result name="response" numFound="1" start="0"> <doc> <str name="id">100</str> <str name="name_texts">Foobar 135g</str> <long name="_version_">1456487722571005952</long></doc> </result> <lst name="debug"> <str name="rawquerystring">name_texts:"135g"</str> <str name="querystring">name_texts:"135g"</str> <str name="parsedquery">MultiPhraseQuery(name_texts:"(135g 135) (g 135g)")</str> <str name="parsedquery_toString">name_texts:"(135g 135) (g 135g)"</str>

Tu procesamiento parece correcto y encuentra el resultado en mi instancia. Primero pensé que tenías más, pero parece que no está causando problemas en mi instancia local. El mejor lugar para buscar estos problemas es utilizar la página de análisis de administración y las consultas de depuración, que ya está haciendo. No puedo pensar en otra cosa ya que no puedo reproducir. Hágase un favor con solo tomar una instancia limpia de solr con solo cambiar a schema.xml para su definición de campo e indexar solo esto a través del panel de administración (documentos) => {"id": "100", "name_texts": "Foobar 135g "}. Ejecute esta consulta http://localhost:8983/solr/collection1/select?q=name_texts%3A%22135g%22&wt=xml&indent=true&debugQuery=true