2012-02-15 20 views
12

Estamos utilizando Solr versión 3.5 para buscar embargo Tweets, estoy usando WordDelimiterFactory con el siguiente ajuste, para poder buscar @username o #hashtags:Solr búsqueda de hashtag o menciona

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="1" handleAsChar="@#"/> 

vi la siguiente parche, pero esto no parece funcionar como esperaba, ¿me estoy perdiendo algo?

https://issues.apache.org/jira/browse/SOLR-2059

Pero la búsqueda de @username también está generando resultados para Nombre de usuario o simplemente #hashtag se acaban de volver resultado para hastag. ¿Cómo puedo conseguir esto?

Todo Tipo de campo:

<fieldType name="textnostem" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 

<fieldType name="textnostem" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1"/>  
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

<fieldType name="textnostem" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      handleAsChar="@#" 
      /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      handleAsChar="@#" 
      />  
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 
+0

¿Puede mostrar toda la definición fieldType que está utilizando, para que podamos hacerlo si otros filtros o tokenizadores pueden estar influyendo en sus resultados? –

+1

Personalmente, solo agregaría dos campos a su índice, uno para una lista de menciones, uno para las etiquetas. Analice estos de sus tweets cuando los agrega al índice. De esta forma no confía en nuevas funcionalidades. –

Respuesta

15

bien, lo que la lectura a través del parche SOLR-2059 que usted ha mencionado, parece que han sustituido el atributo handleAsChar en el WordDelimiterFactory con el atributo types. Aquí es la especificación para ese atributo a partir de los analizadores, Tokenizers y Token filtros de página Solr Wiki:

tipos = "wdfftypes.txt" permite tokenización personalizada para este filtro. El archivo debe existir en el directorio solr/conf, y las entradas son de la forma (sin comillas) "% => ALPHA" o "\ u002C => DIGIT". Los tipos permitidos son: INFERIOR, SUPERIOR, ALPHA, DIGIT, ALPHANUM, SUBWORD_DELIM.

Entonces, si tomamos esta documentación, más el ejemplo del archivo de SOLR-2059, lo recomiendo lo siguiente:

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="1" types="twittertypes.txt"/>

A continuación, defina el archivo de la siguiente manera y twittertypes.txt colóquelo en la misma carpeta que su archivo schema.xml en su instancia Solr (probablemente la carpeta conf).

# A customized type mapping for WordDelimiterFilterFactory 
# the allowable types are: LOWER, UPPER, ALPHA, DIGIT, ALPHANUM, SUBWORD_DELIM 
#  
# the default for any character without a mapping is always computed from 
# Unicode character properties 

# Map the $, %, '.', and ',' characters to DIGIT 
# This might be useful for financial data. 
@ => ALPHA 
\u0023 => ALPHA 

en cuenta que es necesario utilizar el carácter Unicode (UTF-8) para el símbolo de hash, ya que se trata como comentario en el archivo de texto.

Según toda la documentación, esto debería solucionar su problema y tratar los símbolos # y @ como caracteres alfabéticos, que proporcionarán el comportamiento que está buscando.

+2

Gracias Paige, lo descubrimos anoche, trabajando como lo mencionaste. – sesmic

+0

Hice todo lo anterior y reinicié el servicio de Solr, aún busco #pizza y pizza produce el mismo resultado, ¿alguna pista o algún otro paso que deba seguir? – PepperoniPizza

+0

¿Ha reindexado sus documentos después de hacer los cambios de configuración? Cada vez que realice cambios en el archivo schema.xml que afecten la forma en que se indexan los documentos, debe reindexar los documentos para que los cambios se reflejen en los términos indexados. –

Cuestiones relacionadas