2009-11-11 17 views
6

Acaba de instalar Solr, editó el schema.xml, y ahora estoy tratando de indexarlo y buscarlo con algunos datos de prueba.SOLR no busca en ciertos campos

En el archivo XML que estoy enviando a Solr, uno de mis campos de tener este aspecto:

<field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field> 

Hay HTML allí, así que he envolvió en CDATA.

En mi Solr schema.xml, la definición de ese campo tiene el siguiente aspecto:

<field name="PageContent" type="text" indexed="true" stored="true"/> 

Cuando me encontré con la herramienta de publicación de anuncios, todo ha ido bien, pero cuando la búsqueda de contenidos que sé que está dentro del campo de PageContent No obtengo resultados

Sin embargo, cuando configuro el nodo <defaultSearchField> en PageContent, funciona. Pero si lo configuro en cualquier otro campo, no buscará en PageContent.

¿Estoy haciendo algo mal? ¿Cual es el problema?


Para aclarar el error:

He subido un "doc" con los siguientes datos:

<field name="PageID">928</field> 
<field name="PageName">some name</field> 
<field name="PageContent"><![CDATA[<p>html content</p>]]></field> 

En mi esquema he definido los campos tales como:

<field name="PageID" type="integer" indexed="true" stored="true" required="true"/> 
<field name="PageName" type="text" indexed="true" stored="true"/> 
<field name="PageContent" type="text" indexed="true" stored="true"/> 

Y:

<uniqueKey>PageID</uniqueKey> 
<defaultSearchField>PageName</defaultSearchField> 

Ahora, cuando uso la herramienta de administración de Solr y busco "some name" obtengo un resultado. Pero, si la búsqueda para "html content", "html", "content" o "928", no da resultados positivos

¿Por qué?

Respuesta

7

Mencionó que su campo de búsqueda predeterminado está establecido en PageName, no esperaría que una búsqueda de "contenido" devuelva algo.

Probablemente quiso poner "PageContent: content" en el cuadro de búsqueda para buscar datos en ese campo. Si desea buscar en varios campos, querrá verificarlo http://wiki.apache.org/solr/DisMaxRequestHandler. La consola de administración de Solr no es tan genial como una herramienta para jugar con todas las opciones de búsqueda de DisMax, querrá simplemente manipular la URL para eso.

Independientemente, estoy de acuerdo con el cartel anterior, si la configuración de su análisis no está configurada correctamente para tratar con HTML, es probable que obtenga todo tipo de resultados de búsqueda inesperados. Elimine el HTML e indexe solo el texto.

Si desea que su manejador de consultas estándar busque en todos sus campos, puede cambiarlo en su solrconfig.xml (siempre agrego un segundo manejador de consultas en lugar de modificar "estándar". El campo qf es la lista de campos que desea realizar la búsqueda. es una lista separada por espacios.

<requestHandler name="standard" class="solr.DisMaxRequestHandler"> 

    <lst name="defaults"> 
      <str name="echoParams">all</str> 
      <str name="hl">true</str> 

      <str name="fl">*</str> 
      <str name="qf">PageName PageContent</str> 
    </lst> 

</requestHandler> 
+0

genial, gracias Trey. Así que déjame ver si lo entiendo. Estoy un poco confundido. Entonces, si solo envío una consulta de búsqueda, es decir, "solr /? Q = hi vivo en el nodo de contenido" ¿SOLR solo buscará contra un solo campo? Cuando ejecuto el ejemplo de configuración SOLR de vanilla siento que una sola consulta simple busca en todos los campos? ¿Me equivoco? – andy

+1

Como no hay resaltado de sintaxis en los comentarios, aclaré lo anterior con una sugerencia. – Trey

+0

+1 dulce, gracias amigo, lo intentaré y te responderé – andy

1

se asegura de que sus datos se ha cometido antes de intentar buscar en ella, ¿verdad?

Además, si se desea almacenar el HTML puro probablemente lo mejor para eliminar realmente el HTML. Usted puede hacer esto en su aplicación o uso de solr.HTMLStripWhitespaceTokenizerFactory de Solr, como:

<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 

cual se declara en su definición FieldType de "texto". Es posible que desee crear un nuevo tipo de campo sólo para su html, tal vez algo como text_html y se puede usar como tal:

<fieldtype name="text_html" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
      <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
      <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
      <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
    </fieldtype> 

No estoy seguro de lo que entendemos por:

However, when I set the node to PageContent, it works. But if I set it to any other field, it doesn't search in PageContent.

Puede por favor, elabora?

+0

cool cody, el código anterior es realmente útil, definitivamente voy a quitar el html. En cuanto al problema de PageContent, he actualizado mi pregunta anterior. Muchas gracias. – andy

1

fl es la lista de los campos devueltos por la consulta .. qf es la lista que quería referirse a ellos y que no soporta comodines ..

La única forma de buscar en todos los campos sin tener que alistarlos es tener un campo de copia que atrape todo alores (no se almacenan simplemente indexado), a continuación, buscar imitar contra todos los campos mediante la búsqueda en contra de ella

0

En mi schema.xml tengo algo como lo siguiente, que copia el valor de cada campo que termina con _t en el campo de texto.

<defaultSearchField>text</defaultSearchField> 
<copyField source="*_t" dest="text" maxChars="3000"/> 
0

El parámetro fl hace no especificar los campos de consulta contra, pero los campos para volver en la respuesta.

Se podía añadir a schema.xml:

<field name="fieldContainingEverything" type="text" indexed="true" stored="true" multiValued="true" /> 

<defaultSearchField>fieldContainingEverything</defaultSearchField> 

<copyField source="*" dest="fieldContainingEverything" maxChars="3000"/> 

Ahora, cuando la indexación, cada campo se copia a fieldContainingEverything. El problema aquí es que pierde la pista del campo del que proviene el contenido, si desea seguir evaluando con esa información. Me alegraría si alguien tuviera una idea al respecto.


he encontrado una solución un tanto funcional:

Para describir el escenario con un poco más detalles: Tengo una tabla de base de datos MySQL con una gran cantidad de campos de índice, y lo hacen sólo por la importación de todos los campos sin especificar cada campo (SELECT * FROM ...). Quiero consultar el índice en cada campo de la tabla y quiero saber qué campo coincide con la consulta. Esto no es posible de inmediato, ya que el marcador solo le indica que el campo que coincide con la consulta es fieldContainingEverything. Al utilizar Dismax controlador de consultas, descubrí que, aunque se dice que busca en todos los campos, no parece que lo haga para buscar campos que no están especificados en el parámetro qf. La idea ahora es, además, todos los campos de índice añadiendo:

<dynamicField name="*" type="string" indexed="true" stored="true"/> 

a su schema.xml. Ahora, cuando consulta Solr a través de dismax con hl.true&hl.fl=*, agrega qf=fieldContainingEverything^1 a su lista de parámetros. Solr ahora busca en cada campo indexado, pero también resalta cada campo que contiene el término de consulta.La desventaja de estos métodos obviamente es el aumento del tamaño del índice, que no debería ser tan relevante en la mayoría de los casos, supongo.

Cuestiones relacionadas