Как настроить Solr / Lucene для выполнения поиска расстояния редактирования Левенштейна? - PullRequest
3 голосов
/ 01 сентября 2010

У меня есть длинный список слов, которые я положил в очень простую базу данных SOLR / Lucene. моя цель - найти «похожие» слова из списка для односоставных запросов, где «сходство» определенно понимается как (damerau) levensthein расстояние редактирования. я понимаю, что SOLR обеспечивает такое расстояние для орфографических предложений.

в моем SOLR schema.xml, я настроил тип поля string:

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>

который я использую для определения поля

<field name='term' type='string' indexed='true' stored='true' required='true'/>

Я хочу найти это поле и получить результаты, возвращаемые в соответствии с их расстоянием редактирования Левенштейна. тем не менее, когда я запускаю запрос типа webspace~0.1 к SOLR с отладкой и пояснениями, отчет показывает, что при подсчете баллов был использован целый ряд соображений, например: * 10101 *

"1582":"
1.1353534 = (MATCH) sum of:
  1.1353534 = (MATCH) weight(term:webpage^0.8148148 in 1581), product of:
    0.08618848 = queryWeight(term:webpage^0.8148148), product of:
      0.8148148 = boost
      13.172914 = idf(docFreq=1, maxDocs=386954)
      0.008029869 = queryNorm
    13.172914 = (MATCH) fieldWeight(term:webpage in 1581), product of:
      1.0 = tf(termFreq(term:webpage)=1)
      13.172914 = idf(docFreq=1, maxDocs=386954)
      1.0 = fieldNorm(field=term, doc=1581)

ясно, для моего приложения термины частоты, idf s и т. Д. Не имеют смысла, так как каждый документ содержит только один термин. Я пытался использовать компонент предложений правописания, но не смог заставить его возвращать фактические оценки сходства.

может кто-нибудь дать подсказки, как настроить SOLR для выполнения поиска levensthein / jaro-winkler / n-грамм с возвращенными результатами и без выполнения дополнительных действий, таких как tf, idf, boost и так включено? где-нибудь есть пример конфигурации для SOLR? я нахожу количество вариантов действительно пугающим.

Ответы [ 3 ]

6 голосов
/ 01 сентября 2010

Если вы используете ночную сборку, то вы можете отсортировать результаты на основе расстояния Левенштейна, используя функцию strdist:

q=term:webspace~0.1&sort=strdist("webspace", term, edit) desc

Подробнее здесь и здесь

1 голос
/ 24 ноября 2014

как настроить SOLR для выполнения поиска levensthein / jaro-winkler / n-грамм с возвращенными результатами и без дополнительных действий, таких как tf, idf, boost и т. Д.?

У нас есть некоторые решения о том, как получить желаемые результаты, но никто не отвечает на ваш вопрос.

q={!func}strdist("webspace",term,edit) перезапишет оценку документа по умолчанию с расстоянием Левенштейна, а q={!func}strdist("webspace",term,jw) сделает то же самое для Jaro-Winkler.

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

Чтобы увидеть, какие из них подойдут лучше всего, &debugQuery=true может быть достаточно.

1 голос
/ 02 сентября 2010

Solr / Lucene не подходит для этого приложения. Вы, вероятно, лучше. с библиотекой SimMetrics . Он предлагает полный набор калькуляторов расстояния строки, вкл. Яро-Винклер, Левенштейн и др.

...