2012-02-15 1 views
12

Мы используем Solr версии 3.5 для поиска хотя твиты, я использую WordDelimiterFactory со следующей настройкой, чтобы иметь возможность искать @username или #hashtags:поиск Solr для хэштегом или упоминает

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

я увидел следующее патч, но это, похоже, не работает, как я и ожидал, я что-то упустил?

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

Но поиски @username также возвращаются результаты только имя пользователя или #hashtag только возвращение результата для hastag. Как я могу это достичь?

Целые поля Тип:

<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

Можете ли вы показать все полевое определение типа, которое вы используете, чтобы мы могли использовать другие фильтры или токенизаторы? –

+1

Лично я бы просто добавил два поля к вашему индексу, один для списка упоминаний, один для тегов. Разбирайте их из своих твитов, когда вы добавляете их в индекс. Таким образом, вы не полагаетесь на новую функциональность. –

ответ

15

OK, поэтому чтение через SOLR-2059 патч, который вы упомянули, это выглядит, как они заменили атрибут на WordDelimiterFactory с атрибутом typeshandleAsChar. Вот спецификация для этого атрибута из анализаторов, Tokenizers и Токен Фильтры Solr Wiki страницы:

типа = «wdfftypes.txt» позволяет настроенную лексемизацию для этого фильтра. Файл должен существовать в каталоге solr/conf, а записи имеют форму (без кавычек) «% => ALPHA» или «\ u002C => DIGIT». Допустимыми типами являются: НИЖНЯЯ, ВЕРХНЯЯ, АЛЬФА, ЦИФРОВАЯ, АЛЬФАНАЯ, SUBWORD_DELIM.

Итак, если мы возьмем эту документацию, а также пример файла из Solr-2059, я бы рекомендовал следующее:

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

Затем определяют файл twittertypes.txt следующим образом и поместите его в ту же папку, что и ваш файл schema.xml в вашем экземпляре Solr (возможно, в папке 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 

Обратите внимание, что вам нужно использовать символ Unicode (UTF-8) для хэш-символа, так как оно трактуется как комментарий в текстовом файле.

Согласно всей документации, это должно исправить вашу проблему и обработать символы # и @ в качестве альфа-символов, что обеспечит поведение, которое вы ищете.

+2

Спасибо, Пейдж, понял это поздно вечером, работая, как упоминалось вами. – sesmic

+0

Я сделал все вышеперечисленное и перезапустил сервис solr, все еще ищут #pizza и pizza, дает тот же результат, любые подсказки или еще один шаг, который я должен выполнить? – PepperoniPizza

+0

Вы повторно проиндексировали свои документы после внесения изменений в конфигурацию? Каждый раз, когда вы вносите изменения в файл schema.xml, который влияет на способ индексирования документов, вы должны повторно проиндексировать документы, чтобы изменения отражались в индексированных терминах. –

Смежные вопросы