2009-08-20 16 views
9

Tenemos una base de datos de películas y series, y como los datos provienen de muchas fuentes de fiabilidad variable, nos gustaría poder hacer coincidencias de cadenas difusas en los títulos de los episodios. Estamos utilizando Solr para buscar en nuestra aplicación, pero los mecanismos de coincidencia predeterminados operan en niveles de palabras, que no es lo suficientemente bueno para cadenas cortas, como títulos¿Cómo usar el emparejamiento aproximado de n-grams con Solr?

He usado n-grams coincidencia aproximada en el pasado, y estaba muy feliz de encontrar que Lucene (y Solr) es compatible con algo tan fuera de la caja. Desafortunadamente, no he podido configurarlo correctamente.

que supone que necesito un tipo de campo especial para esto, así que añade el siguiente -tipo de campo a mi schema.xml:

<fieldType 
    name="trigrams" 
    stored="true" 
    class="solr.StrField"> 
<analyzer type="index"> 
    <tokenizer 
     class="solr.analysis.NGramTokenizerFactory" 
     minGramSize="3" 
     maxGramSize="5" 
     /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 

y cambió el campo apropiado en el esquema a:

<field name="title" type="trigrams" 
    indexed="true" stored="true" multiValued="false" /> 

Sin embargo, esto no está funcionando como esperaba. El análisis de la consulta parece correctamente, pero no obtengo ningún resultado, lo que me hace pensar que algo sucede en el tiempo del índice (es decir, el título está indexado como un campo de cadena predeterminado en lugar del campo trigram).

La consulta que estoy tratando es algo así como

title:"guy walks into a psychiatrist office" 

(con un error tipográfico o dos) y que debe coincidir con "tipo entra en un psiquiatra de oficina".

(no estoy muy seguro de si la consulta es correcta.)

Por otra parte, me gustaría ser capaz de hacer algo más, de hecho. Me gustaría reducir la secuencia, eliminar todos los signos de puntuación y espacios, eliminar palabras vacías en inglés y LUEGO cambiar la cadena en trigramas. Sin embargo, los filtros se aplican solo después de que la cadena se ha tokenizado ...

Gracias de antemano por sus respuestas.

+0

Se puede publicar la consulta que está utilizando? – olle

+0

Edité la pregunta para incluir una consulta de ejemplo. –

Respuesta

3

La solución resultó ser muy simple: AND se configuró como el operador predeterminado, y si alguno de los ngramos no coincidía, la consulta completa falló. Por lo tanto, fue suficiente agregar:

<solrQueryParser defaultOperator="OR" /> 

en la definición de mi esquema.

+5

Su respuesta hace que parezca que a posteriori la pregunta no tiene nada que ver con los ngrams. ¿Estoy en lo cierto? –

+2

@RyszardSzopa 'OR 'definitivamente no es lo mismo que el análisis de n-gramas. 'O' da muchos resultados, pero en general son bastante malos. –

9

Para responder a la última parte de su pregunta: solr también tiene un filtro de ngram. Lo que no debe utilizar la tokenizer n-gramas (pero uno como "WhitespaceTokenizer", por ejemplo), aplicar todos los filtros pre-Ngram y luego añadir esta:

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" /> 
Cuestiones relacionadas