2012-03-23 18 views
6

He leído varias veces el documento wiki que destaca Solr, busqué en todas partes, pero no puedo obtener ni siquiera el resaltado básico para trabajar con la instalación de Solr. Estoy ejecutando Solr 3.5 en el servidor demo Jetty 6.1.¿Por qué falla este simple intento de resaltado Solr?

He indexado 250K documentos, y puedo buscarlos muy bien. Aparte de la configuración de mis definiciones de campo de documentos, la mayor parte de la configuración de Solr es "de valores", aunque he comentado temporalmente fuera "por defecto" Destacar de la solrconfig.xml para asegurarse de que no están causando este problema:

<!-- Highlighting defaults 
    <str name="hl">on</str> 
    <str name="hl.fl">title snippet</str> 
    <str name="f.name.hl.fragsize">0</str> 
    <str name="f.name.hl.alternateField">name</str> --> 

Mi URL querystring es muy simple. He intentado muchas variaciones, pero aquí está mi última con ella volviendo la consulta más básica:

hl=on&hl.fl=title&indent=on&version=2.2&q=toyota&fq=&start=0&rows=1&fl=*%2Cscore 

Aquí es el XML resultante:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 

<lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">32</int> 
    <lst name="params"> 
    <str name="explainOther"/> 
    <str name="indent">on</str> 
    <str name="hl.fl">title</str> 
    <str name="wt"/> 
    <str name="hl">true</str> 
    <str name="version">2.2</str> 
    <str name="rows">1</str> 
    <str name="fl">*,score</str> 
    <str name="start">0</str> 
    <str name="q">toyota</str> 
    <str name="qt"/> 
    <str name="fq"/> 
    </lst> 
</lst> 
<result name="response" numFound="9549" start="0" maxScore="0.9960097"> 
    <doc> 
    <float name="score">0.9960097</float> 
    <str name="id">2-33-200</str> 
    <str name="title">1992 Toyota Camry 2.2L CV Boots</str> 
    </doc> 
</result> 
<lst name="highlighting"> 
    <lst name="2-33-200"/> 
</lst> 
</response> 

¿Cómo puedo depurar esta cuestión? ¡Gracias!

Editar Aquí es la sección de <highlighting> solrconfig.xml. Como dije, es stock. Ese podría ser el problema, pero soy nuevo en Solr y todavía no estoy familiarizado con los puntos destacados (obviamente).

<highlighting> 
    <!-- Configure the standard fragmenter --> 
    <!-- This could most likely be commented out in the "default" case --> 
    <fragmenter name="gap" 
       default="true" 
       class="solr.highlight.GapFragmenter"> 
    <lst name="defaults"> 
     <int name="hl.fragsize">100</int> 
    </lst> 
    </fragmenter> 

    <!-- A regular-expression-based fragmenter 
     (for sentence extraction) 
    --> 
    <fragmenter name="regex" 
       class="solr.highlight.RegexFragmenter"> 
    <lst name="defaults"> 
     <!-- slightly smaller fragsizes work better because of slop --> 
     <int name="hl.fragsize">70</int> 
     <!-- allow 50% slop on fragment sizes --> 
     <float name="hl.regex.slop">0.5</float> 
     <!-- a basic sentence pattern --> 
     <str name="hl.regex.pattern">[-\w ,/\n\&quot;&apos;]{20,200}</str> 
    </lst> 
    </fragmenter> 

    <!-- Configure the standard formatter --> 
    <formatter name="html" 
      default="true" 
      class="solr.highlight.HtmlFormatter"> 
    <lst name="defaults"> 
     <str name="hl.simple.pre"><![CDATA[<em>]]></str> 
     <str name="hl.simple.post"><![CDATA[</em>]]></str> 
    </lst> 
    </formatter> 

    <!-- Configure the standard encoder --> 
    <encoder name="html" 
      class="solr.highlight.HtmlEncoder" /> 

    <!-- Configure the standard fragListBuilder --> 
    <fragListBuilder name="simple" 
        default="true" 
        class="solr.highlight.SimpleFragListBuilder"/> 

    <!-- Configure the single fragListBuilder --> 
    <fragListBuilder name="single" 
        class="solr.highlight.SingleFragListBuilder"/> 

    <!-- default tag FragmentsBuilder --> 
    <fragmentsBuilder name="default" 
        default="true" 
        class="solr.highlight.ScoreOrderFragmentsBuilder"> 
    <!-- 
    <lst name="defaults"> 
     <str name="hl.multiValuedSeparatorChar">/</str> 
    </lst> 
    --> 
    </fragmentsBuilder> 

    <!-- multi-colored tag FragmentsBuilder --> 
    <fragmentsBuilder name="colored" 
        class="solr.highlight.ScoreOrderFragmentsBuilder"> 
    <lst name="defaults"> 
     <str name="hl.tag.pre"><![CDATA[ 
      <b style="background:yellow">,<b style="background:lawgreen">, 
      <b style="background:aquamarine">,<b style="background:magenta">, 
      <b style="background:palegreen">,<b style="background:coral">, 
      <b style="background:wheat">,<b style="background:khaki">, 
      <b style="background:lime">,<b style="background:deepskyblue">]]></str> 
     <str name="hl.tag.post"><![CDATA[</b>]]></str> 
    </lst> 
    </fragmentsBuilder> 

    <boundaryScanner name="default" 
        default="true" 
        class="solr.highlight.SimpleBoundaryScanner"> 
    <lst name="defaults"> 
     <str name="hl.bs.maxScan">10</str> 
     <str name="hl.bs.chars">.,!? &#9;&#10;&#13;</str> 
    </lst> 
    </boundaryScanner> 

    <boundaryScanner name="breakIterator" 
        class="solr.highlight.BreakIteratorBoundaryScanner"> 
    <lst name="defaults"> 
     <!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE --> 
     <str name="hl.bs.type">WORD</str> 
     <!-- language and country are used when constructing Locale object. --> 
     <!-- And the Locale object will be used when getting instance of BreakIterator --> 
     <str name="hl.bs.language">en</str> 
     <str name="hl.bs.country">US</str> 
    </lst> 
    </boundaryScanner> 
</highlighting> 

Editar Aunque inicialmente mi campo "Título" se establece en indexada = "true" desde entonces han probado que con true (sin cambio/no resaltado todavía), y también termVectors = termPositions "verdaderos" = "true" termOffsets = "true" ... aún no tiene efecto. (He probado todas estas basado en la lectura de this post to SO.)

Y aquí está mi "título" definición de campo a partir de ahora:

<field name="title" type="string" indexed="true" stored="true" required="true" termVectors="true" termPositions="true" termOffsets="true" /> 

Inicialmente Empecé con:

<field name="title" type="string" indexed="false" stored="true" required="true" /> 

Editar I Ahora también he intentado esta definición:

<field name="title" type="text_general" indexed="true" stored="true" required="true" termVectors="true" termPositions="true" termOffsets="true" /> 

y sin cambios en el resaltado, todavía no funciona. Mi definición text_general es el que viene por defecto con la demostración de Solr:

<!-- A general text field that has reasonable, generic 
     cross-language defaults: it tokenizes with StandardTokenizer, 
removes stop words from case-insensitive "stopwords.txt" 
(empty by default), and down cases. At query time only, it 
also applies synonyms. --> 
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <!-- in this example, we will only use synonyms at query time 
     <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
     --> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Editar He ahora también trató título volver a clasificar con el FieldType text_en_splitting, que utiliza WhitespaceTokenizerFactory en lugar de StandardTokenizerFactory, y todavía no hay resaltado. Por lo que vale, estoy usando el analizador de consultas estándar, que de acuerdo con debugQuery = on es el LuceneQParser.

FINALIZADO! Gracias a @javanna por la ayuda. He hecho muchas pruebas, y los dos puntos clave son:

  1. Debe usar un tipo de campo de tokenización. El tipo de campo de cadena no funcionará. No parece necesario tener indexado = true o termVectors = true, pero el tipo de campo debe ser tokenizado.
  2. Debe tener cuidado de referirse a sus campos con la caja adecuada. Además de atornillar la tokenización, también cambié la caja en mis campos durante el desarrollo y olvidé cambiar la caja en la definición de hl.fl (campo resaltado), lo que evita que el resaltado funcione.
  3. Asegúrese de volver a indexar cada cambio de configuración. Para estar seguro, estaba borrando todos los documentos del índice y reconstruyéndolo desde cero, pero eso puede no ser necesario.

Mi definición aparece ahora como:

<field name="Title" type="text_general" indexed="false" stored="true" required="true" /> 

Y mi solrconfig.xml tiene este conjunto:

<str name="hl">on</str> 
<str name="hl.fl">Title</str> 
+0

¿Podría publicar su definición de campo de título en su schema.xml? – javanna

+0

Claro, lo siento, dejé eso inicialmente. –

+0

Gracias! Una cosa más: ¿cuál es la definición de la cadena fieldType en su schema.xml? ¿El predeterminado o algo diferente? – javanna

Respuesta

11

La forma en que está haciendo resaltado parece buena, pero su solrconfig.xml se ve un poco desordenado Lamentablemente, el ejemplo que tomaste usa básicamente todas las opciones disponibles, y supongo que no las necesitas. A menos que necesite algo diferente del predeterminado, comenzaría a comentar toda su configuración de resaltado, así como sus parámetros predeterminados. Luego jugaría con los parámetros de url que necesita, solo un par para comenzar: hl = on y hl.fl = title. Una vez que haya encontrado los parámetros correctos, puede configurarlos como predeterminados.

Dicho esto, dado su campo fieldType, sospecho que no está tokenizado, a menos que haya cambiado la definición del tipo de cadena por defecto. En ese caso, su consulta no coincidirá con el campo de título, es por eso que no se resalta. ¿Estás utilizando edismax (o dismax)? En caso afirmativo, ¿cuál es su parámetro qf? ¿Es posible que el término toyota esté en otro campo que coincida con su consulta? Si está usando edismax, puede intentar buscar q = title: toyota ans para ver si obtiene resultados.

También puede comprobar dónde está su coincidencia habilitando debugQuery = en y comprobando la salida de depuración.

ACTUALIZACIÓN
vi cambió el título a FieldType text_general, pero esto no cambia nada, porque ese tipo no se tokenized en espacios en blanco. No ha dicho todavía lo analizador de consultas que está utilizando, de todos modos, si estoy en lo correcto que debe utilizar en lugar de la WhitespaceTokenizerFactoryStandardTokenizerFactory:

<tokenizer class="solr.WhitespaceTokenizerFactory"/> 

Después de eso, recuerde que debe indexar todos sus datos, de lo contrario usted ganó' veo cualquier cambio Básicamente, si indiza algo como toyota whatever sin tokenizar en espacios en blanco, no obtendrá ningún resultado buscando toyota, y ni siquiera tendrá toyota resaltado en ese campo porque no coincide. Mi suposición es que estás usando dismax o edismax analizador de consultas y buscando en más de un campo, y algunos de ellos pero no el título coinciden con tu búsqueda, es por eso que obtendrías resultados pero no destacarías en title, el único campo que seleccionaste para resaltar ¿Puedes publicar los resultados que obtienes buscando toyota? ¿Es el término toyota en algunos otros campos que title?

+0

Sí, parece desordenado, pero esa es la configuración predeterminada que viene en Solr 3.5. :) No estoy usando dismax o edismax a menos que sea la configuración predeterminada. El lunes cuando regrese al trabajo, intentaré sus sugerencias, ¡gracias! –

+2

@ MasonG.Zhwiti No debería decir esto, pero ... nunca confíe en los ejemplos de solr :) Realmente, para comprender cómo funciona SOlr, mejor comenzar con un esquema casi vacío y una configuración limpia. ¡Avíseme si puedo ayudar más! – javanna

+0

Todavía estoy trabajando en restablecer la configuración a algo más barebones, pero hasta ahora he intentado cambiar el título fieldType a text_general, con y sin termVector = true, y eso no ha hecho nada para mí con respecto al resaltado. –

Cuestiones relacionadas