2012-05-11 20 views
6

Utilizo solr 3.6 y me gustaría utilizar intercalaciones de sugerencia como una solución de autocompletar para búsquedas de múltiples términos. Desafortunadamente, el Sugeridor devuelve solo una recopilación para una búsqueda de múltiples términos, incluso si existe una gran cantidad de sugerencias para cada término. Según mis búsquedas de prueba y los datos indexados subyacentes, estoy seguro de que deben existir más intercalaciones.Solr devuelve solo una colación para el Componente Suggester

¿Hay algún problema con la configuración de Suggester?

<!--configuration --> 
<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.fst.WFSTLookupFactory</str> 
    <str name="field">text</str> <!-- the indexed field to derive suggestions from --> 
    <!--<float name="threshold">0.0005</float> disabled for test--> 
    <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">200</str> 
    <str name="spellcheck.collate">true</str> 
    <str name="spellcheck.maxCollations">10</str> 
</lst> 
<arr name="components"> 
    <str>suggest</str> 
</arr> 
</requestHandler> 

respuesta Ejemplo para q = bio + ber:

<response> 
<lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">4</int> 
</lst> 
<lst name="spellcheck"> 
    <lst name="suggestions"> 
     <lst name="bio"> 
      <int name="numFound">27</int> 
      <int name="startOffset">0</int> 
      <int name="endOffset">3</int> 
      <arr name="suggestion"> 
       <str>bio</str> 
       <str>bio-estetica</str> 
       <str>bio-kosmetik</str> 
            ... 
      </arr> 
     </lst> 
     <lst name="ber"> 
      <int name="numFound">81</int> 
      <int name="startOffset">4</int> 
      <int name="endOffset">7</int> 
      <arr name="suggestion"> 
       <str>beratung</str> 
       <str>bern</str> 
       ... 
      </arr> 
     </lst> 
     <str name="collation">bio beratung</str> 
    </lst> 
</lst> 
</response> 
+0

encontramos con este problema por mí mismo, simplemente mediante la aplicación de juguetes Solr básica (start.jar). Probé todas las combinaciones concebibles de parámetros de revisión ortográfica, incluida spellcheck.maxCollations, pero parece que no puedo obtener más de una intercalación. Cualquier idea sería apreciada. – nlawson

Respuesta

14

que estaba teniendo el mismo problema que tú, y me las arreglé para resolverlo. Resulta que hay varias cosas que necesita saber para que funcionen correctamente varias intercalaciones.

En primer lugar, debe especificar un QueryComponent en la lista de la components "sugerir" requestHandler en su solrconfig.xml. De lo contrario, su requestHandler no sabe cómo consultar el índice, por lo que no puede determinar cuántos hits tiene cada consulta corregida, por lo que solo obtendrá uno. Si hubiera agregado spellcheck.collateExtendedResults=true a su consulta, habría visto que hits era 0, lo que muestra que Solr no se molestó en verificar la consulta corregida contra el índice.

Sugieren esto con un mensaje de error algo opaca:

INFO: Could not find an instance of QueryComponent. Disabling collation verification against the index.

La forma más sencilla de añadir que es usar el valor por defecto QueryComponent, que se llama "consulta." Así, en el XML que envió por encima, que te cambia la parte "componentes" a:

<arr name="components"> 
    <str>suggest</str> 
    <str>query</str> 
</arr> 

En segundo lugar, debe configurar spellcheck.maxCollations ser más que 1 (duh), y menos intuitivamente, es necesario para configurar spellcheck.maxCollationTries para que sea un número grande (por ejemplo, 1000). Si cualquiera de estos se establece en los valores predeterminados (ambos 0), entonces Solr solo le dará una clasificación. Además, es necesario establecer spellcheck.count a ser mayor que 1.

En tercer lugar, necesita modificar la consulta para incluir el campo que desea realizar la búsqueda, y los términos debe estar entre comillas para asegurar la colación correcta. Así, en el caso de la consulta:

q=bio+ber

Esto realmente debería ser:

q=text:"bio+ber"

Obviamente, en su caso, "texto" es el campo por defecto, por lo que no es necesario eso. Pero en mi caso, estaba usando un campo no predeterminado, así que tuve que especificarlo. De lo contrario, Solr contaría los aciertos contra el campo "texto", y todos los resultados tendrían 0 aciertos, por lo que la clasificación sería inútil.

Así que en mi caso, la consulta era la siguiente:

q=my_field:"brain+c" 
&spellcheck.count=5 
&spellcheck.maxCollations=10 
&spellcheck.maxCollationTries=1000 
&spellcheck.collateExtendedResults=true 

Y mi respuesta era la siguiente:

<response> 
    <lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">4</int> 
    </lst> 
    <lst name="spellcheck"> 
    <lst name="suggestions"> 
     <lst name="brain"> 
     <int name="numFound">1</int> 
     <int name="startOffset">15</int> 
     <int name="endOffset">20</int> 
     <arr name="suggestion"> 
      <str>brain</str> 
     </arr> 
     </lst> 
     <lst name="c"> 
     <int name="numFound">4</int> 
     <int name="startOffset">21</int> 
     <int name="endOffset">23</int> 
     <arr name="suggestion"> 
      <str>cancer</str> 
      <str>cambrian</str> 
      <str>contusion</str> 
      <str>cells</str> 
     </arr> 
     </lst> 
     <lst name="collation"> 
     <str name="collationQuery">my_field:"brain cancer"</str> 
     <int name="hits">2</int> 
     <lst name="misspellingsAndCorrections"> 
      <str name="brain">brain</str> 
      <str name="c">cancer</str> 
     </lst> 
     </lst> 
     <lst name="collation"> 
     <str name="collationQuery">my_field:"brain contusion"</str> 
     <int name="hits">1</int> 
     <lst name="misspellingsAndCorrections"> 
      <str name="brain">brain</str> 
      <str name="c">contusion</str> 
     </lst> 
     </lst> 
     <lst name="collation"> 
     <str name="collationQuery">my_field:"brain cells"</str> 
     <int name="hits">1</int> 
     <lst name="misspellingsAndCorrections"> 
      <str name="brain">brain</str> 
      <str name="c">cells</str> 
     </lst> 
     </lst> 
    </lst> 
    </lst> 
    <result name="response" numFound="0" start="0"/> 
</response> 

éxito!

+0

+1 esto me dio algunas cosas para probar. – Aaron

+0

'@ nlawson': ¿Ayudarás a resolver estos errores: [http://stackoverflow.com/questions/27502903/threshold-frequency-is-not-working-in-spell-check-in-solr] & [http : //stackoverflow.com/questions/27484326/getting-most-likely-documents-of-the-query-using-phonetic-filter-in-solr] – iNikkz

0

Tenía el mismo problema.

Este es un error de Solr 3.6.1 (no estoy seguro acerca de las versiones anteriores). Por favor, consulte: https://issues.apache.org/jira/browse/SOLR-2853.

En realidad este comentario pone la luz: https://issues.apache.org/jira/browse/SOLR-2853?focusedCommentId=13136014&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13136014

Una posible solución es especificar spellcheck.maxCollationTries ser igual al número de colaciones que necesita, pero que también obligará a Solr para comprobar esas colaciones contra índice de búsqueda. Así que tenga cuidado de establecer esta propiedad a un gran número. Más sobre este parámetro aquí: http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.maxCollationTries.

El error no está cerrado, pero ya se han enviado los parches.

También he comprobado el código de Solr 4.0.0-BETA - fix ya está allí.

Buenas Solrs suerte!)

Cuestiones relacionadas