Solr: результаты сопоставления с пробелами и без них

Данные в нашем поле 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>

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

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

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

Например:

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

Вот как задается тип поля:

<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 ГБ).

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

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


person leovrf    schedule 27.09.2011    source источник


Ответы (2)


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

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

№ 2 — лучшее решение, но для этого потребуется написать код java. Я бы рекомендовал просто расширить WordDeliminterFilter; вы можете увидеть источник SynonymTokenFilter для того, как создавать синонимы.

person Xodarap    schedule 27.09.2011
comment
Решение для копирования поля было нашим первым вариантом, но затем нам нужно было бы повторно проиндексировать все документы продуктов, чтобы появилось новое поле. Поскольку наш каталог огромен, это нецелесообразно. Что касается синонима, мы могли бы поработать над этим подходом, но это потребует некоторых усилий, которые мы сейчас не можем себе позволить. Но это действительно одно из возможных решений. - person leovrf; 27.09.2011
comment
Извините, боюсь, я потерял счет времени. Лучше поздно, чем когда-либо, я в конечном итоге использовал ваше решение: иметь два поля для хранения данных, каждое из которых токенизировано по-разному (с использованием поля копирования). Мы решили переиндексировать одну категорию продуктов (отдел) за раз, что в конечном итоге становится жизнеспособным. Спасибо! - person leovrf; 25.10.2012
comment
@leovrf Я пытаюсь решить аналогичную проблему в Hibernate Search. Проблема в том, что я использую StandardTokenizerFactory для токенизации. В этот момент такое слово, как «320 ГБ», будет размечено как «320 и «ГБ». Знаете ли вы, как сделать так, чтобы токены стали «320», «ГБ» И «320 ГБ»? - person Glide; 06.11.2013

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

<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 ГБ генерируется как токен в анализе и показывает совпадение в индексе.

person Jayendra    schedule 27.09.2011
comment
Пробовал, но, к сожалению, не получилось. Совпали результаты пробелов, но не сцепленные слова (те, которые наиболее важны). Ваше предложение заставило меня понять, что мне нужно изменить анализатор индексов, так что это было полезно :) - person leovrf; 27.09.2011
comment
Можете ли вы проверить анализ администратора, потому что у меня это сработало нормально? проверить выходные данные в подробностях? Какой запрос вы пытаетесь? - person Jayendra; 27.09.2011
comment
Значение поля: 2gb. Три фильтра запросов вернули два термина: 1 - 2 ; 2 - гб. Это большой запрос, включающий отделы продуктов, доступность и так далее. Поля жесткого диска и/или памяти применяются для фильтрации запросов. Это меняет ваш анализ? - person leovrf; 27.09.2011
comment
Обновлено с анализом. Я тестировал как 2 ГБ, так и 2 ГБ в индексе и в поиске, и все проверки совпадают. Используете ли вы поля продукта в поиске? или общее поле с другим типом поля? - person Jayendra; 27.09.2011