2012-04-02 2 views
2

Для этого требуется небольшое объяснение, но я думаю, что это обсуждение может помочь любому, у кого есть важные фразы в индексе Solr.Результаты проверки орфографии в 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» возвращается в качестве предложения. Отлично.

Предположим, что запрос включает в себя фирменное наименование и тип продукта, например «enre casual dining table set». Мы хотели бы найти исправление орфографии для названия бренда и заменить весь бренд с ошибкой, чтобы вернуть предложение «set_set_casual_dining table set». Я понял, что функция Solr's collate справится с этим хорошо. Когда я ввожу этот поиск, хотя, 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> 

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

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

ответ

0

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

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

+0

Это правда, есть некоторые неожиданное поведение. Считаете ли вы, что в моем поле spellcheckquery есть те же маркеры фирменного знака, в то время как остальные термины в этом поле являются пронумерованными символами?Не могли бы вы показать пример Solr, сопоставляющий ключевые слова с несколькими словами? Спасибо за ваш ответ! –

1

Я хотел бы рассмотреть вопрос об изменении вашего анализатора выглядеть следующим образом:

<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.

Смежные вопросы