Возвращайте только те результаты, которые соответствуют достаточному количеству NGram с помощью Solr.

Чтобы добиться некоторой степени отказоустойчивости с Solr, я начал использовать NGramFilterFactory. Вот интересные моменты из schema.xml:

<field name="text" type="text" indexed="true" stored="true"/>
<copyField source="text" dest="text_ngram" />
<field name="text_ngram" type="text_ngram" indexed="true" stored="false"/>

<fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="3" />
    </analyzer>
</fieldType>

Я использую обработчик запросов EDisMax практически со стандартной конфигурацией. Вот интересные строки из solrconfig.xml:

  <requestHandler name="/browse" class="solr.SearchHandler">
    <lst name="defaults">
      <!-- Query settings -->
      <str name="defType">edismax</str>
      <str name="qf">
        name name_ngram^0.001
      </str>
      <str name="mm">100%</str>
      <str name="q.op">AND</str>
      ...

Это отлично работает, однако дает мне много нерелевантных результатов. Используя возможности анализа Solr, я думаю, что отследил проблему по следующей причине:

Запрос разбит на NGrams. Затем Solr ищет токенизированный запрос в поле text или один из NGrams в поле text_ngram. Использование debug=query приведет к выводу следующего parsedquery при поиске "что-то":

(+DisjunctionMaxQuery(((text_ngram:som text_ngram:ome text_ngram:met text_ngram:eth text_ngram:thi text_ngram:hin text_ngram:ing) | text:something)))/no_coord

Если я правильно прочитал, это означает, что либо

  1. Один из NGrams должен соответствовать или
  2. Исходный запрос (токенизированный) должен соответствовать

Теперь он также найдет такие элементы, как «ethernet», поскольку один из NGrams (eth) одинаков.

Мой вопрос: как я могу установить более высокий порог для совпадений NGram? Есть ли способ сказать «возврат элемента только в том случае, если не менее 90% NGrams из запроса совпадают»? Убедиться, что 100% совпадений NGrams не имеет смысла, поскольку это фактически убьет отказоустойчивость.

Еще один способ, о котором я подумал, заключался в том, чтобы возвращать только результаты, которые выше определенного порогового значения по отношению к лучшему результату. Это связано с тем, что элемент «что-то» будет иметь очень высокую релевантность по сравнению с «ethernet». Итак, есть ли способ подключиться к Solr, чтобы возвращать только результаты, которые имеют, например. не менее 1/100 балла лучшего результата? Я читал, что есть способ предоставить пользовательский HitCollector, но я не смог найти никакой информации об этом.

Спасибо!


person Georg M. Sorst    schedule 01.07.2013    source источник
comment
почему вы используете ngrams во время запроса? каков вариант использования для сопоставления частей условий поиска? Обычно ngrams используется для сопоставления префиксов/более быстрого сопоставления подстановочных знаков.   -  person Jayendra    schedule 01.07.2013
comment
Существует минимальный параметр совпадения, который вы оставили как есть . Пожалуйста, прочтите предупреждение: желтый {!}   -  person Jesvin Jose    schedule 01.07.2013
comment
@Jayendra: Идея заключалась в том, чтобы добиться отказоустойчивого поиска. Когда кто-то что-то ищет, он должен что-то найти. Я полагаю, что это должно быть возможно с NGrams. Я знаю, что существует нечеткий поиск (~), но я не нашел способа реализовать это с помощью обработчика запросов EDisMax, поскольку мне пришлось бы добавлять ~ к каждому слову. Любые указатели?   -  person Georg M. Sorst    schedule 01.07.2013
comment
Вы также можете проверить фонетические фильтры, которые смогут сопоставить орфографические ошибки, которые звучат похоже   -  person Jayendra    schedule 01.07.2013
comment
Любое обновление здесь о том, как вы это исправили? Я сталкиваюсь с той же проблемой.   -  person Krunal    schedule 15.10.2013
comment
К сожалению, нет, извините. Мы решили не использовать NGrams.   -  person Georg M. Sorst    schedule 20.10.2013


Ответы (1)


Идея заключалась в том, чтобы добиться некоего отказоустойчивого поиска. Когда кто-то ищет «что-то», он должен найти «что-то».

SpellChecker от Solr выполняет нечеткий поиск, и вы можете установить для него пороговые значения http://wiki.apache.org/solr/SpellCheckComponent .

person ilinca    schedule 04.09.2014