2011-09-21 20 views
6

Estoy usando SOLR 3.2. Mi aplicación emite consultas de búsqueda en la instancia SOLR, para un tipo de campo de texto. ¿Cómo puedo hacer SOLR para devolver resultados como "libro", "estantería", "bookasd", etc. cuando el usuario emite una consulta como "libro". ¿Debo agregar caracteres "*" a la cadena de consulta manualmente o hay una configuración en SOLR para que haga búsquedas de prefijo en el campo de forma predeterminada?¿Cómo se configura SOLR para que los usuarios puedan hacer la búsqueda de prefijos por defecto?

Ésta es la sección schema.xml para el tipo de campo de texto:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="stopwords.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenat0All="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
    </fieldType> 
+0

¿Ya ha encontrado una respuesta? –

Respuesta

0

Se podría o bien tienen que hacer el manejo del lado del cliente añadiendo los caracteres comodín al final de los términos de búsqueda.

El impacto: -

  1. consultas comodín tiene un impacto en el rendimiento
  2. consultas comodín no se someten a análisis. Por lo tanto, el análisis del tiempo de consulta no se aplicará a los términos de búsqueda

La otra opción es implementar el analizador de consultas personalizado con el manejo que necesita.

1

Tenía el mismo requisito en un proyecto. Tuve que implementar Sugerencia. Lo que hice fue la definición de este suggester FieldType

<fieldType class="solr.TextField" name="suggester"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false" /> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Solía ​​ShingleFilterFactory porque necesitaba para obtener sugerencia compuesta de una o más palabras.

Luego usé consultas de faceting para obtener sugerencias.

Facet.Limit = 10

Facet.Prefix = "libro"

Facet.Field = "Suggester" // esto es el campo con FieldType = "suggester" en el que yo guardado los datos

Sé que utiliza los resultados de las facetas, pero tal vez resuelva su problema.

Si mi Jayendra Patil's answer o no le proporciona una solución también se puede echar un vistazo a EdgeNGramFilterFactory

0

I' Estoy seguro de que ya lo entendió, pero para que haya una respuesta aquí:

Lo manejé tomando el último término y poniendo un OR con el último término más un comodín, por ej. "mi libro favorito" se convierte en "mi + favorito + (libro O libro *)", y devolverá "mi estante favorito". Es probable que desee hacer algún procesamiento en la entrada de todos modos (escapando, etc.).

Si está buscando específicamente el texto escrito para que coincida con el comienzo del resultado, entonces edge n-grams es el camino a seguir, pero al leer su pregunta, no parecía que estuviera realmente pidiendo eso.

Cuestiones relacionadas