Solr: результаты поиска с пробелами и без них - PullRequest
2 голосов
/ 27 сентября 2011

Данные в нашем поле solr выглядят так:

<str name="property_Info_Hd">320 GB SATA 7200RPM</str>
<str name="property_Info_Hd">320GB SATA</str>

<str name="property_Info_Memory">4 GB of DDR2</str>
<str name="property_Info_Memory">2GB of DDR3</str>

Поле является динамическим ("property_ *"), поэтому в обоих случаях используется один и тот же анализатор.

В настоящее время, когдапри поиске «2 ГБ» он возвращает документы с «2 ГБ», но пропускает «2 ГБ» (пробел).

Вопрос: как установить этот тип поля в схеме, чтобы совпал с результатами ибез пробелов ?

Например:

Поиск + (property_Info_Memory :( "320gb")) должен вернуть обе первые строки выше, соответствующие "320GB" AND"320 ГБ".

Вот как устанавливается тип поля:

<fieldType name="textFilter" class="solr.TextField" 
        positionIncrementGap="100">
       <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory" 
                splitOnCaseChange="0" 
                splitOnNumerics="0" 
                stemEnglishPossessive="0" 
                catenateWords="1" 
                catenateNumbers="1" 
                catenateAll="1" 
                preserveOriginal="1" 
                generateWordParts="1" 
                generateNumberParts="1"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ISOLatin1AccentFilterFactory" />
       </analyzer>
    </fieldType>

Я пытался использовать варианты splitOnCase и splitOnNumerics, но ни один из них не удался.Затем результаты будут соответствовать полученным с пробелами (320 ГБ) и пропущены без пробелов (320 ГБ).

Большинство документов содержат данные без пробелов, поэтому текущая настройка.

Заранее спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

Работает с помощью инструмента анализа.Вы можете попробовать: -

<fieldType name="textFilter" class="solr.TextField" 
        positionIncrementGap="100">
       <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory" 
                catenateWords="1" 
                catenateNumbers="1" 
                catenateAll="1" 
                preserveOriginal="1" 
                generateWordParts="1" 
                generateNumberParts="1"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
       </analyzer>  
       <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory" 
                splitOnNumerics="1" 
                preserveOriginal="1"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
       </analyzer>  
 </fieldType>

Анализ -

Время индекса - 2 ГБ данных

Время запроса - 2 ГБ Токены - 2 ГБ, 2 ГБ

2 ГБ генерируется как токен в анализе и показывает совпадение в индексе.

0 голосов
/ 27 сентября 2011

Я знаю два способа сделать это:

  1. Имеют два поля для хранения данных, каждое из которых по-разному токенизировано (т. Е. Используется поле для копирования)
  2. Имеют одно полес пользовательским фильтром синонимов

# 2 - лучшее решение, но потребует написания некоторых Java.Я бы порекомендовал просто расширить WordDeliminterFilter;Вы можете увидеть источник SynonymTokenFilter для того, как создать синонимы.

...