2010-08-23 21 views
6

Soy principiante total con Solr y tengo un problema con los caracteres no deseados que entran en los resultados de la consulta. Por ejemplo, cuando busco "foo bar" tengo contenido con "'foo' bar", etc. Solo quiero tener coincidencias exactas. Por lo que sé, esto se puede configurar en el archivo schema.xml. Mi contenido tipo de campo:Solr consulta/campo analizador

<fieldtype name="textNoStem" class="solr.TextField" positionIncrementGap="100"> 
<analyzer type="index"> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
</analyzer> 
<analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldtype> 

Por favor, hágamelo saber si conoce la solución. Saludos cordiales.

+0

Para aclarar, "foo bar" no debe coincidir con "'foo' bar" porque el foo está rodeado por comillas simples y "foo bar" no debe coincidir con "foo" porque falta "barra". ¿Es eso lo que quieres decir? –

Respuesta

13

Para ambos analizadores, la primera línea debe ser el tokenizador. El tokenizer se usa para dividir el texto en unidades más pequeñas (palabras, la mayoría de las veces). Para su necesidad, el WhitespaceTokenizerFactory es probablemente la opción correcta.

Si quiere una coincidencia exacta absoluta, no necesita ningún filtro después del tokenizador. Pero si no desea que las búsquedas sean sensibles a las mayúsculas y minúsculas, debe agregar un LowerCaseFilterFactory.

Observe que tiene dos analizadores: uno de tipo 'índice' y otro de tipo 'consulta'. Como los nombres implicados, el primero se usa para indexar el contenido mientras que el otro se usa cuando se realizan consultas. Una regla que casi siempre es buena es tener el mismo conjunto de tokenizadores/filtros para ambos analizadores.

+0

¡gracias, eso ayudó mucho! – Daniel

+0

Sugeriría utilizar PatternReplaceCharFilterFactory para eliminar los caracteres de comillas simples antes de tokenizar. –

+0

¿Quizás sea mejor si el analizador de consultas tiene un filtro de sinónimos adicional además de todo el analizador de índices de cosas? – WoLfPwNeR

0

Si solo quiere coincidencias exactas, utilice KeywordTokenizerFactory en lugar de StandardTokenizerFactory en el momento de la consulta.

+0

Gracias por la respuesta rápida. Sin embargo, al utilizar KeywordTokenizerFactory no obtengo ningún resultado con consultas como "foo bar". Traté de agregar para consultar el analizador, pero todavía no hay cambios. Me estoy quedando sin ideas ... – Daniel

0

Supongo que no obtendrá ningún resultado porque el tokening se realiza de forma diferente en los datos que ya están indexados. Como dijo Pascal, whitespaceTokenizer es la elección correcta en su caso. Úselo tanto en el índice como en el tiempo de consulta y verifique los resultados después de indexar algunos datos, no en los datos previamente indexados.

Sugiero usar la página de análisis para ver los resultados sin indexar realmente. Es bastante útil. Realice cambios en el esquema, actualice el núcleo, vaya a la página de análisis y mire la salida detallada para obtener el análisis paso a paso.