Результаты проверки орфографии в сопоставлении фраз в Solr - PullRequest
2 голосов
/ 03 апреля 2012

Это требует небольшого объяснения, но я думаю, что это обсуждение могло бы помочь любому с важными фразами в их индексе Solr.

Я использую Solr для расширенного поиска в контексте электронной коммерции и пытаюсь улучшить предложения по проверке орфографии для названий брендов. По умолчанию Solr проверяет каждое слово отдельно, независимо от того, имеет ли смысл полученная фраза. Например, поиск «paula dean» возвращает «Вы имели в виду: paula bean?», В то время как торговая марка на самом деле «Paula Deen». В настоящее время мой орфографический словарь представляет собой поле с пробелами, называемое spellField. Чтобы проиндексировать полные названия брендов для проверки орфографии, мой импорт Solr заменяет пробелы в названиях брендов из моей базы данных подчеркиваниями, то есть Entree Casual Dining -> Entree_Casual_Dining. Вот схема для fieldType для spellField:

<fieldType name="spellcheckquery" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.PatternReplaceFilterFactory" pattern="(\s[0-9]+\s)|(^[0-9]+\s)|(\s[0-9]+$)|(^[0-9]+$)" replacement="" replace="all"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.PatternReplaceFilterFactory" pattern="(\s[0-9]+\s)|(^[0-9]+\s)|(\s[0-9]+$)|(^[0-9]+$)" replacement="" replace="all"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="4" outputUnigrams="true"/>
  </analyzer>
</fieldType>

Размещение подчеркивания в названии бренда было лучшим способом сохранить имена из нескольких слов в качестве единичных токенов в поле с пробелами. Я могу легко удалить возвращенное предложение орфографии после подчеркивания после его возвращения. Итак, теперь, когда приходит запрос, Solr обрабатывает запрос и ищет подсказку правописания для каждой черепицы, то есть ищет бренд с ошибкой правописания: "entre casual Dining" -> "entre", "casual", " обедать »,« entre casual »,« обычное питание »,« entre casual Dining ». Галька «entre casual Dining» похожа на то, что находится в индексе («Entree_Casual_Dining»), поэтому «entree_casual_dining» возвращается в качестве предложения. Отлично.

Предположим, что запрос включает в себя название бренда и тип продукта, например "набор обеденных столов entre casual". Мы хотели бы найти исправление орфографии для названия бренда и заменить весь бренд с ошибками, чтобы вернуть предложение «набор таблиц entree_casual_dining». Я полагал, что функциональность сопоставления Solr справится с этим хорошо. Когда я вхожу в этот поиск, Solr находит правильное предложение бренда, но не сопоставляет его с результатом:

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">48</int> 
  </lst>
  <result name="response" numFound="100" start="0"/>
  <lst name="spellcheck">
    <lst name="suggestions">
      **<lst name="entre casual dining">**
        <int name="numFound">1</int>
        <int name="startOffset">0</int>
        <int name="endOffset">19</int>
        <int name="origFreq">0</int>
        <arr name="suggestion">
          <lst>
            **<str name="word">entree_casual_dining</str>**
            <int name="freq">21</int>
          </lst>
        </arr>
      </lst>
      <bool name="correctlySpelled">false</bool>
      **<str name="collation">entre casual dining table set</str>**
    </lst>
  </lst>
</response>

Нет проблем с сопоставлением, когда исправление было получено из одного слова с ошибкой в ​​запросе. Например, если вы неправильно написали «таблица», она вернет его обратно в запрос.

Что может пойти не так, когда он пытается сопоставить предложение из гальки из нескольких слов?

Ответы [ 2 ]

1 голос
/ 24 апреля 2012

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

 <analyzer type="index">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
  <filter class="solr.LowerCaseFilterFactory"/>
 </analyzer>
 <analyzer type="query">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="0" />
  <filter class="solr.LowerCaseFilterFactory"/>
 </analyzer>     

Если для параметра preserveOriginal установлено значение 1, оно будет маркировать название бренда как отдельные слова и как один большой токен. Кроме того, я считаю, что материал Shingle устарел и планируется удалить в 4.0.

0 голосов
/ 03 апреля 2012

я видел, что solr успешно сопоставлял предложения по ключевым словам без каких-либо проблем.Я использовал Solr 3.1, хотя.Единственная проблема, с которой я столкнулся, заключалась в том, что несколько слов в ключевом слове из нескольких слов были написаны с ошибками, и есть предложения от solr, тогда есть несколько комбинаций, представленных средством проверки орфографии, когда вы включили «сортировка» - так будет, когда это становится сложнее.

Даже при использовании «_» в вашем сценарии, я предполагаю, что это может усложниться в зависимости от того, насколько плохо слово написано неправильно, потому что оно будет рассматривать «_» как часть слова и использовать его длярасчеты.Просто интересно, работает ли он так, как вы ожидаете, поскольку фабрика по производству черепицы также производит дробленую черепицу.

...