2012-06-14 3 views
1

Я индексирую некоторые URI в SOLR с помощью токенизатора UAX29URLEmailTokenizerFactory. Проблема в том, что некоторые из моих URI содержат символы плюс, которые SOLR интерпретирует как пробелы и разделяет URI. Может ли эта проблема быть решена путем какого-то умного выхода из символа «+»? Я попробовал «+» в анализаторе, но получил те же результаты. Вот моя точная конфигурация поля:Индекс плюс символ в SOLR

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

ответ

0

Решение, которое я придумал, наконец использует CharacterFilter, как было предложено выше. Хитрость заключалась в том, чтобы заменить его закодированным символом '% 2B'. Это привело к тому, что URI был единственным символом и возвратил его в мое приложение в правильном состоянии - как «+». Вот определение типа поля, которое я придумал:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/> 
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/> 
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 
3

Вы можете использовать CharacterFilter (например, PatternReplaceCharFilterFactory.) Перед анализатором. У этого link есть хорошая информация. Одно из решений, о котором я могу думать, - это заменить символ + другим персонажем, а затем, когда вы используете эту ссылку, не забудьте заменить ее.

Еще одна вещь для исследования - заменить его значением URL-адреса для плюса (% 2B) и посмотреть, рассматривает ли анализатор его как пространство.

+0

Благодарим за идею, она отлично поработала, заменив символ «+» экранированием «% 2B», – kpentchev

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