Статьи

Новая проверка орфографии в Solr 4.0

Одна из новых функций, которая будет представлена ​​в Solr 4.0, — это новая реализация SpellChecker, которая не требует своего собственного индекса. Я решил быстро взглянуть на это и поделиться своими мыслями.

Что мы имеем сегодня

На сегодняшний день ( Solr 3.6 ) мы можем использовать следующие реализации SpellChecker:

  • org.apache.solr.spelling.IndexBasedSpellChecker
  • org.apache.solr.spelling.FileBasedSpellChecker

С выходом Solr 4.0 мы получим новую реализацию:

  • org.apache.solr.spelling.DirectSolrSpellChecker

Текущие проблемы

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

конфигурация

Конфигурация DirectSolrSpellChecker аналогична той, которую вы используете сегодня в Solr 3. Конечно, есть некоторые дополнительные параметры. Ниже вы можете найти образец конфигурации:

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
  <str name="queryAnalyzerFieldType">textTitle</str>
  <lst name="spellchecker">
    <str name="name">default</str>
    <str name="field">title</str>
    <str name="classname">solr.DirectSolrSpellChecker</str>
    <str name="distanceMeasure">internal</str>
    <float name="accuracy">0.7</float>
    <int name="maxEdits">2</int>
    <int name="minPrefix">1</int>
    <int name="maxInspections">5</int>
    <int name="minQueryLength">4</int>
    <float name="maxQueryFrequency">0.01</float>
    <float name="thresholdTokenFrequency">.01</float>
  </lst>
</searchComponent>

И значение для каждого из параметров:

  • queryAnalyzerFieldType — имя типа, на основе которого будет анализироваться запрос SpellChecker.
  • field — поле, содержимое которого будет использоваться для построения результатов SpellChecker.
  • classname — класс реализации SpellChecker.
  • distanceMeasure — алгоритм, который будет использоваться для вычисления терминов дистанции, в нашем случае мы будем использовать стандартные (Levensthein’s).
  • точность — точность, которая должна быть достигнута, чтобы предложение считалось правильным.
  • maxEdits — максимальное количество изменений во время перечисления терминов. Это свойство может быть установлено в 1 или 2 .
  • minPrefix — минимальный, общий префикс при перечислении терминов.
  • maxInspections — максимальное количество проверок для каждого предложения.
  • minQueryLength — минимальная длина предложения для работы, которая будет принята за правильное предложение.
  • maxQueryFrequency — максимальный процент документов, в которых слово может отображаться для слова, которое следует рассматривать как исправляемое ( значение 0,01 означает 1% ).
  • thresholdTokenFrequency — минимальный процент документов, в которых предложение должно появляться, чтобы оно считалось правильным ( .01 значение означает 1% ).

Приведенные выше атрибуты конфигурации показывают, что DirectSolrSpellChecker дает нам большую степень конфигурации поведения.

использование

DirectSolrSpellChecker ничем не отличается от других реализаций SpellChecker, когда дело доходит до его использования. Как и в предыдущих реализациях, вы можете настроить Solr для добавления результатов SpellChecker к каждому результату запроса или просто настроить новый обработчик и решить, когда запрашивать его для результатов. Мы писали о том, как использовать SpellChecker в прошлом — в примере « Приложение для продажи автомобиля ».

Что мы можем ожидать?

Согласно информации, которую мы видим в выпуске JIRA, LUCENE-2507 DirectSolrSpellChecker не только устранит необходимость в отдельном индексе, но также улучшит качество предложений. Из того, что вы видите в упомянутой проблеме JIRA, DirectSolrSpellChecker работает лучше по сравнению с предыдущими реализациями, хотя он немного медленнее, но я думаю, что это не будет проблемой, если вы не используете SpellChecker с каждым запросом.