2012-08-31 26 views
10

Pregunta rápida, no sé cómo tratar con sinónimos que contiene un espacio! que tienen la siguiente configuración:Solr - sinónimos que contienen varias palabras

El archivo de configuración SOLR

<fieldType ... > 
    <analyzer type="index"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" 
          catenateWords="1" 
          preserveOriginal="1" 
          splitOnCaseChange="1" 
          generateWordParts="1" 
          generateNumberParts="1"   
          catenateNumbers="1" 
          catenateAll="1" 
          /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30" side="front"/> 
    </analyzer> 
    <analyzer type="query">  
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LengthFilterFactory" min="2" max="70" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="syn.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 

Mi archivo: syn.txt

st., st => saint 
istambul => istanbul 
airport, apt => aéroport 
NYC => New York 
pt., pt => port 
brussels => bruxelles 

Todo estaba funcionando bien, excepto el sinónimo:

"NYC => New York" 

Investigué un poco y encontré lo siguiente:

Tenga en cuenta que si bien la SynonymFilter estará feliz de trabajar con los sinónimos que contienen varias palabras (es decir: "galleta de mar, Biscit mar, Seabiscuit")

El método recomendado para tratar con sinónimos como este, es ampliar el sinónimo al indexar Esto se debe a que hay dos problemas potenciales que pueden surgir en el tiempo de consulta:

Lucene QueryParser hace tokens en el espacio en blanco antes de dar cualquier texto al analizador, por lo que si una persona busca las palabras sea biscit el analizador recibirá el las palabras "mar" y "biscit" por separado, y no sabrán que coinciden con un sinónimo.

La búsqueda de frases (es decir: "sea biscit") hará que QueryParser pase la cadena completa al analizador, pero si el filtro de sinónimos está configurado para expandir los sinónimos, cuando QueryParser recupera la lista de tokens resultante el Analizador, construirá una MultiPhraseQuery que no tendrá el efecto deseado.

Esto se debe al mecanismo limitado disponible para que el Analizador indique que dos términos ocupan la misma posición: no hay forma de indicar que una "frase" ocupa la misma posición que un término.

Para nuestro ejemplo el MultiPhraseQuery resultante sería "(mar | mar | Seabiscuit) (galleta | Biscit)", que no se correspondería con el simple caso de "Seabiscuit" que ocurren en un documento

Así que probé para cambiar mi archivo de configuración y agregar mis filtros en la indexación, pero no está funcionando.

¿Algo tiene algunas ideas?

+2

Tenga cuidado con este problema en Solr con sinónimos multiword: http://www.opensourceconnections.com/blog/2013/10/27/why-is-multi-term-synonyms-so-hard-in-solr/ –

Respuesta

7

Está haciendo un mapeo explícito con =>.

El Solr documentation dice

asignaciones explícitas encontró ningún secuencia de tokens en el LHS de "=>" y reemplazan con todas las alternativas en el lado derecho. Estos tipos de asignaciones ignoran el parámetro expand en el esquema.

así que supongo que si la búsqueda de NYC se obtiene nada a cambio, ya que quedó reemplazada por New York en el momento de índice.

En su lugar, ¿puedes intentar declararlos como sinónimos equivalentes? es decircomo NYC, New York en lugar de NYC => New York.

Entonces creo que puede buscar cualquiera de ellos y el resultado será el mismo.

2

Sobre

st., st => saint 

creo que debe hacerlo de esa manera:

st. => saint 
st => saint 

Sobre

NY => New York 

estoy frente a un problema similar y llegó a la conclusión de que es porque el análisis se hace ANTES de la sustitución de sinónimos, lo que probablemente causa un problema cuando se utilizan varias palabras. He encontrado que es posible incluir un programa de análisis en SynonymFactory:

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.KeywordTokenizerFactory" /> 

Acabo de prueba que me dieron resultados mucho mejores, pero aún no la que esperaba. Por extraño que parezca, al agregar KeywordTokenizerFactory parece afectar positivamente, la adición de WhitespaceTokenizerFactory o StandardTokenizerFactory no parece cambiar nada.

Por cierto, si no se usa el herpes zóster, esto ya debería estar bien.

0

basándose en la respuesta de Pr Shadoko:

Mira el funcionamiento de su analizador, por ejemplo, con

http://localhost/solr/analysis/field?analysis.fieldvalue=EXAMPLE-KEYWORDS&q=EXAMPLE-KEYWORD%203&analysis.fieldname=EXAMPLEFIELD&analysis.showmatch=true 

análisis/campo es un controlador de solicitudes de salida de la caja (sentado en solrconfig.xml). Here encuentra su lista de parámetros. ("analysis.query" no funciona para mí, así que tuve que usar "q")

Como el Sinónimo analiza (corta) el texto entrante ANTES de emparejar cualquier sinónimo, los sinónimos de varias palabras no se obtendrán un golpe. El truco es contar la SynonymFilter tomar un analizador, que en realidad no analiza: el keywordTokenizer

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.KeywordTokenizerFactory" /> 

De todos modos, este enfoque se siente como un truco y no puedo estimar los efectos secundarios (escalabilidad, ...) - ¡así que ten cuidado!

4

El problema es que los sinónimos de solr tienden a causar problemas cuando el número de palabras en la primera frase es menor que el número de palabras en la segunda frase. Cuando esto sucede, los tokens se desbordan en las posiciones de otros tokens.

tengo una solución para este problema, pero requiere dos usos de solr.SynonymFilterFactory en índice y el tiempo de consulta.

De esta manera:

<filter class="solr.SynonymFilterFactory" synonyms="multi_word_conversion.txt" 
ignoreCase="true" expand="true" /> 

<filter class="solr.SynonymFilterFactory" synonyms="layor_two_syns.txt" 
ignoreCase="true" expand="true"/> 

En el primer filtro que va a tener: Nueva York => New_York

En el segundo filtro: NYC => New_York

Ahora la búsqueda de Nueva York devolverá resultados que contengan NYC y viceversa.

En una nota final: Este método no funcionará a menos que esté en índice y tiempo de consulta.

Cuestiones relacionadas