2012-08-16 14 views
6

estoy usando el componente Solr sugerencia con la siguiente configuración:dinámicamente selección de campos para Solr sugerencia (Spellcheck) consulta de múltiples términos

schema.xml

<fieldType name="textSpell" class="solr.TextField"> 
<analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 
<field name="image_memo" type="text_general"/> 
<field name="username" type="text_general"/> 
<field name="image_memo" type="text_general"/> 
<field name="image_text" type="text_general"/> 
<!-- More fields included here --> 
<field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/> 
<copyField source="*" dest="spell"/> 

solrconfig.xml

<searchComponent class="solr.SpellCheckComponent" name="suggest"> 
    <lst name="spellchecker"> 
     <str name="name">suggest</str> 
     <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> 
     <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> 
     <str name="field">spell</str> 
     <str name="buildOnCommit">true</str> 
    </lst> 
</searchComponent> 

<requestHandler class="org.apache.solr.handler.component.SearchHandler" 
    name="/suggest"> 
    <lst name="defaults"> 
     <str name="spellcheck">true</str> 
     <str name="spellcheck.dictionary">suggest</str> 
     <str name="spellcheck.onlyMorePopular">true</str> 
     <str name="spellcheck.count">6</str> 
     <str name="spellcheck.collate">true</str> 
     <str name="spellcheck.collateExtendedResults">true</str> 
     <str name="spellcheck.collate">true</str> 
     <str name="spellcheck.maxCollations">6</str> 
     <str name="spellcheck.maxCollationTries">1000</str> 
     <str name="spellcheck.extendedResults">true</str> 
     <str name="spellcheck.collateParam.mm">100%</str> 
    </lst> 
    <arr name="components"> 
     <str>suggest</str> 
     <str>query</str> 
    </arr> 
</requestHandler> 

Como se puede ver hay una wich campo spell estoy usando durante las consultas de sugerencia. Esto funciona muy bien incluso para varias consultas plazo.

Pero lo que necesito es buscar en los campos seleccionados solamente.
Así que, por ejemplo, quiero sugerencias válidas solo para los campos image_memo y username El usuario puede agregar y eliminar campos dinámicamente para buscar.

Yo sé que podría hacer algo como esto:

q = (image_memo: * búsqueda * O image_username: * búsqueda *)

pero esto es se está desacelerando dramtically si tiene un montón de campos y una consulta de múltiples términos.

Ejemplo: Búsqueda en campo memo, username, field, field1 and field2 para term, term1 and term2.

((memo: término o nombre de usuario: término o en el campo: término O campo1: término O campo2: término) Y (nota: term1 O nombre de usuario: term1 O campo: term1 O campo1: term1 O campo2: term1) y (memo: término2 O username: término2 o en el campo: término2 O campo1: término2 O campo2: término2))

¿Hay alguna forma de seleccionar dinámicamente los campos spell? ¿O hay una forma en que puedo buscar campos específicos solo en un campo multivalor

Estoy usando Apach Solr 4 Alpha.

+0

Podría publicar qué solución funcionó para usted, veo que no ha aceptado la respuesta dada. En ese caso, podrías publicar la respuesta. Estoy enfrentando un desafío similar. Gracias – nish

Respuesta

0

Todo lo que necesita hacer es utilizar Dismax o eDismax. SpellcheckComponent se ejecuta automáticamente cada sugerencia usando sus Parámetros de consulta.

Por lo tanto, hay que consultar la siguiente manera:

/suggest?q={!dismax}term1 term2 term3&qf=memo username field field1 field2 

o

/suggest?q=term1 term2 term3&defType=dismax&qf=memo username field field1 field2 

puede implementar su QueryParser personalizada si no desea utilizar (e) dismax.

Cuestiones relacionadas