SolR: Как сделать проверку орфографии не чувствительной к регистру, но которая возвращает оригинальное слово заглавными буквами? - PullRequest
4 голосов
/ 11 августа 2011

Я работаю над проектом SolR, чтобы создать заклинание

Почему, если я набираю "britne", он автоматически заполняет "britney", но когда я набираю "Britne", он не находит никакого результата?Вот мое поле для проверки орфографии:

<fieldType name="suggestText" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" ignoreCase="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" ignoreCase="true"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory" ignoreCase="true"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" ignoreCase="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" ignoreCase="true"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory" ignoreCase="true"/>
  </analyzer>
</fieldType>

У него есть LowerCaseFilterFactory в части запроса И в части индекса, поэтому я предположил, что он преобразует мой запрос в lowerCase и сравнивает слова, хранящиеся в нижнем регистре, ноочевидно, нет.

Более того, я хотел бы получить, когда я набираю «Britne», «Britne» или «BriTnE», результат «Britney» (а не «britney»).Как я могу сделать свою проверку орфографии не чувствительной к регистру , но возвращающей "чувствительные к регистру слова"?

Ответы [ 2 ]

0 голосов
/ 02 июля 2013

Вы путаете несколько вещей об индексах и хранилище здесь.

О хранилище, когда вы устанавливаете хранимую = true, значение сохраняется «как есть» и не отражает того, что в индексе exple:<field name="FIELDNAME" type="text" indexed="false" **stored="true"** multiValued="false" required="true" /> Чтобы проверить, что было сохранено, просто выполните простой запрос : , отображающий все поля.

Далее, индексы.Здесь вы обрабатываете (анализируете и фильтруете) свои значения, чтобы сделать их доступными для поиска.Для одного и того же значения вам может потребоваться создать несколько индексов, чтобы иметь возможность выполнять различный вид поиска.Считайте это серьезно, это часто лучший вариант.Для индексов используйте «Браузер схемы» для проверки ваших индексированных значений (откройте консоль администратора, выберите свой экземпляр и выберите браузер схемы, затем выберите поле, которое вы хотите проверить, и откройте «Загрузить информацию о термине»).Для этого сделано copyField, и вы должны сохранить значение только один раз.Там вы увидите, как это было проанализировано и, если вы действительно думаете, что в нижнем регистре: у меня уже был какой-то сюрприз.Если вы не индексируете, вы можете попробовать этот tonkenizer <tokenizer class="solr.StandardTokenizerFactory"/> в сочетании с LowerCaseFilterFactory, это сработало для меня.

Последнее, ваш запрос тоже важен и , вероятно, решение вашей проблемы .Когда вы ищете Britne, вы должны создать поиск с помощью функции сходства (нечеткий поиск) или указать, что вы хотите найти ее из поиска по умолчанию.Вы можете попробовать поискать Britne ~ (то же самое, что Britne ~ 0.5) или Britne ~ или Britne ~ 0.8 или что-то еще.Вам придется настроить его под свои нужды и контекст.

0 голосов
/ 11 августа 2011

Я не уверен, что это работает, но, возможно, вы могли бы использовать для этого поля копирования:

Не используйте LowerCaseFilterFactory в вашем поле offerText, но используйте LowerCaseFilterFactory во 2-м поле (давайте назовем это) offerText_lower. Затем скопируйте это поле в поле offerText.

Таким образом, «BriTnE» будет сопоставляться путем ввода «britne» без нижнего регистра поля «offerText».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...