2012-02-15 14 views
12

Stiamo usando solr versione 3.5 per la ricerca però Tweets, io sto usando WordDelimiterFactory con la seguente impostazione, per essere in grado di ricercare @username o #hashtags:Solr ricerca di hashtag o menzioni

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

ho visto il seguente patch, ma questo non sembra funzionare come mi aspettavo, mi manca qualcosa?

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

Ma la ricerca di @username è anche alla ricerca solo utente o #hashtag è solo frutto di tornare per HASTAG. Come posso raggiungere questo obiettivo?

Tutto il tipo di 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

si può mostrare l'intera definizione fieldType che si sta utilizzando, in modo che possiamo se altri filtri o tokenizers potresti essere tu che influenzano i risultati? –

+1

Personalmente, aggiungerei solo due campi all'indice, uno per un elenco di citazioni, uno per i tag. Analizza questi dei tuoi tweet quando li aggiungi all'indice. In questo modo non stai facendo affidamento su nuove funzionalità. –

risposta

15

OK, quindi la lettura attraverso la patch SOLR-2059 che lei ha citato, sembra che hanno sostituito l'attributo handleAsChar sul WordDelimiterFactory con l'attributo types. Qui è la specifica per quell'attributo dagli analizzatori, tokenizers e Token Filtri pagina Solr Wiki:

tipi = "wdfftypes.txt" permette tokenization personalizzato per questo filtro. Il file deve esistere nella directory solr/conf e le voci sono del formato (senza virgolette) "% => ALPHA" o "\ u002C => DIGIT". I tipi consentiti sono: INFERIORE, SUPERIORE, ALPHA, DIGIT, ALPHANUM, SUBWORD_DELIM.

Allora se prendiamo questa documentazione, oltre l'esempio del file da SOLR-2059, consiglio il seguente:

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

Poi definire il file come segue twittertypes.txt e posizionarlo nella stessa cartella del file schema.xml nell'istanza Solr (probabilmente la cartella 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 

Si noti che è necessario utilizzare il carattere Unicode (UTF-8) per il simbolo cancelletto, dal momento che viene trattato come commento nel file di testo.

Secondo tutta la documentazione, questo dovrebbe risolvere il problema e curare le # @ e simboli come caratteri alfabetici, che vi fornirà il comportamento che stai cercando.

+2

Grazie Paige, l'ho scoperto ieri sera tardi, lavorando come menzionato da te. – sesmic

+0

Ho fatto tutto quanto sopra e ho riavviato il servizio solr, continuo a cercare #pizza e la pizza produce lo stesso risultato, qualsiasi indizio o altro passo che dovrei seguire? – PepperoniPizza

+0

Hai reindicizzato i tuoi documenti dopo aver modificato la configurazione? Ogni volta che si apportano modifiche nel file schema.xml che influiscono sul modo in cui i documenti vengono indicizzati, è necessario reindicizzare i documenti affinché le modifiche si riflettano nei termini indicizzati. –