2012-03-27 17 views
14

Estoy tratando de hacer una búsqueda difusa de "jahngir" ~ 0.2, que no devuelve ningún resultado. Mis índices tienen registros con datos "JAHANGIR RAHMAN MD". Si intento buscar con la palabra exacta "jahangir" ~ 0.2, funciona. Alguien puede por favor ayudar, en lo que estoy haciendo mal. He pasado mucho tiempo tratando de descubrir cómo funciona la búsqueda de Solr Fuzzy. Cualquier enlace que explique la búsqueda de Solr Fuzzy sería útil. A continuación se muestra el campo de texto que estoy usando para indexar. Gracias por adelantado.Solr Fuzzy Buscar palabras similares

<fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <!-- Case insensitive stop word removal. 
     add enablePositionIncrements=true in both the index and query 
     analyzers to leave a 'gap' for more accurate phrase queries. 
    --> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/> 
    </analyzer> 
</fieldType> 

Aquí es la configuración que trabajó para mí después de la respuesta. ¡Gracias!

<!-- Modified to fit fuzzy queries --> 
    <fieldType name="text_exact_fuzzy" class="solr.TextField" omitNorms="false"> 
     <analyzer type="index"> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.StandardFilterFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StandardFilterFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 
+0

¿Cuál es la implementación de búsqueda que está utilizando? FST, WFST o Jaspell? – Chiron

+0

¿Y cómo está enviando la solicitud a Solr? Usted definió una ¿O está enviando a través de 'select' endpoint '? – Chiron

+0

Quirón: la solicitud se envía utilizando el punto final seleccionado. – Ravi

Respuesta

18

No, no necesita habilitar la derivación, y el uso de un tallo puede estar causando el problema.

Tiene demasiados filtros en el campo de texto. Está convirtiendo una palabra en un tallo de Porter, que a menudo no es una palabra real, y luego toma la clave fonética de eso. La palabra superficial rara vez coincidirá con la clave fonética almacenada en el índice. La clave fonética será muy diferente de la palabra original.

Utilice la página del analizador en la interfaz de usuario del administrador para ver cómo se procesan los términos.

Recomiendo dividir los tipos de coincidencias aproximadas en diferentes campos.

  • text_exact: minúsculas, eso es todo
  • text_stem: minúsculas y tallo
  • text_phonetic: minúsculas y doble metaphone, no se derivan

Uso de coincidencia aproximada con text_exact, ya que maneja la tipificación errores No use difusa contra otros campos.

Puede ponderar estos campos de forma diferente, la coincidencia exacta es una coincidencia de mayor calidad que el resto, por lo que puede tener un mayor peso. La coincidencia de tallo es mejor que la fonética, por lo que debe tener un peso más pequeño que el exacto, pero más grande que el fonético.

+0

¡Muchas gracias! Has golpeado el clavo en la cabeza. He pasado mucho tiempo tratando de descubrir cómo funciona la búsqueda difusa y el factor de similitud con Solr.Su recomendación de dividirlo en diferentes tipos de campo, y usar la coincidencia text_exact para búsqueda difusa, ayudó a obtener una mayor comprensión de cómo funciona. – Ravi

+0

Ravi, ¿puedes compartir tu configuración final? – Mateusz

+1

Aquí está mi configuración final. \t \t \t \t Ravi

0

el fin de obtener Búsquedas Fuzzy para trabajar, que se necesitan para habilitar la correcta Partiendo de fábrica y/o filtro para el idioma deseado. Consulte el tema Langauge Analysis en el Solr Wiki para obtener más detalles.

Editar: Consulte Analyzers, Tokenizers and Token Filters para obtener más información sobre las diferentes formas de indexación de sus datos y cómo esto afecta la búsqueda de sus datos.

+0

Gracias por la respuesta. Es bueno saber que la fábrica de filtros de origen afecta las búsquedas difusas. En el campo de arriba, ya estoy usando PorterStemFilterFactory. ¿Debo cambiarlo a algo más? ¿Cuáles son los otros factores que podrían influir en una búsqueda difusa? – Ravi

+0

Consulte la actualización de mi respuesta para obtener más información. –

Cuestiones relacionadas