2012-02-15 14 views
12

Używamy Solr w wersji 3.5, aby szukać choć Tweety używam WordDelimiterFactory z następującym ustawieniu, aby móc szukać @username lub #hashtags:wyszukiwania Solr dla hashtag lub wymienia

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

widziałem następujące łatka, ale to nie działa tak, jak się spodziewałem, czy czegoś brakuje?

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

Ale szukając @username jest również powrót wyników dla tylko nazwa użytkownika lub #hashtag właśnie powrocie wynik dla hastag. Jak mogę to osiągnąć?

Cały Pole Typ:

<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

Czy można wyświetlić całą definicję FieldType, której używamy, abyśmy mogli, jeśli inne filtry lub tokenizery mogą wpływać na wyniki? –

+1

Osobiście wystarczy dodać dwa pola do indeksu, jeden do listy wzmianek, a drugi do tagów. Po dodaniu ich do indeksu usuń je ze swoich tweetów. W ten sposób nie polegasz na nowej funkcjonalności. –

Odpowiedz

15

OK, więc czytanie przez SOLR-2059 plaster że pan wspomniał, wygląda na to, że nie otrzymuje atrybut handleAsChar na WordDelimiterFactory z atrybutem types. Oto specyfikacja dla tego atrybutu z analizatorów, Tokenizers i Token Filtry stronę Solr Wiki:

typy = „wdfftypes.txt” umożliwia dostosowane tokenizacja dla tego filtra. Plik powinien istnieć w katalogu solr/conf, a wpisy są w formie (bez cudzysłowu) "% => ALPHA" lub "\ u002C => DIGIT". Dopuszczalne typy to: LOWER, UPPER, ALFA, DIGIT, ALPHANUM, SUBWORD_DELIM.

Więc jeśli weźmiemy tę dokumentację, a także przykład pliku z Solr-2059, polecam następujące:

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

Następnie określić plik twittertypes.txt w następujący sposób i umieść go w tym samym folderze, co plik schema.xml w instancji Solr (prawdopodobnie w folderze 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 

Zauważ, że trzeba użyć znaku Unicode (UTF-8) dla symbolu hash, ponieważ jest on traktowany jako komentarz w pliku tekstowym.

Zgodnie z całą dokumentacją, powinno to rozwiązać problem i traktować symbole # i @ jako znaki alfanumeryczne, które zapewnią zachowanie, którego szukasz.

+2

Dzięki Paige, wymyśliłem to późno w nocy, pracując jak wspomniano. – sesmic

+0

Zrobiłem wszystkie powyższe i zrestartowałem usługę solr, wciąż szukam # pizzy i pizzy daje ten sam wynik, jakieś wskazówki czy jakikolwiek krok, który powinienem wykonać? – PepperoniPizza

+0

Czy ponownie wyindeksowałeś swoje dokumenty po wprowadzeniu zmian w konfiguracji? Za każdym razem, gdy wprowadzasz zmiany w pliku schema.xml, które mają wpływ na sposób indeksowania dokumentów, musisz ponownie zindeksować dokumenty, aby zmiany znalazły odzwierciedlenie w indeksowanych terminach. –