Как реализовать сложный алгоритм сопоставления токенов в SOLR - PullRequest
3 голосов
/ 07 января 2012

Описание проблемы

Я пытаюсь реализовать собственный алгоритм, соответствующий введенному пользователем вводу свободный текст , названию компании, например "Ford Motor"против справочного источника данных, состоящего из 1,4 миллиона названий компаний.

Алгоритм выполняет следующие шаги:

Шаг 1) Выполняет «Точное совпадение», затем «Начинает совпадение» и, наконец, «Содержит совпадение» поиска, предоставленного пользователемвход.Результаты этого этапа также сортируются в том же порядке.

Шаг 2) Выполняет сопоставление токена с токеном поискового ввода со справочным названием компании.

Каждый токен сопоставляется в следующем порядке: Точное, Начинается, Содержит, Расстояние Левенштейна (<0,2) и Уточненный Soundex.</p>

Например, если пользователь вводит «Foord Motur Holding» и сравнивается с «Ford Motor Holdings Company», тогда первый токен «Foord» будет соответствовать «Ford» на основе совпадения Soundex, второй токен «Motur» будетсовпадение с «Мотором» на основе значения «Изменить расстояние» и последний жетон «Удержание» будет совпадать с «Удерживанием» в начале матча.

Подсчет очков: Каждый матч с токеном сначала оценивается по шкале, которая оценивает технику сопоставления, при этом точное совпадение является лучшим, а Soundex - худшим.

Общий счетрассчитывается по шкале от 0 до 100% путем вычисления средневзвешенного значения отдельных баллов совпадения токенов.Веса назначаются на основе индекса порядка токена, т.е. первый токен имеет наибольший вес, а последний токен - наименьший.

Мое частичное решение

Я реализовал простую схему в solr для хранения названий ссылочной компании.Поле String (называемое companyName), простое текстовое поле (называемое companyText), скопированное из строки, и другое текстовое поле (называемое companySoundex), скопированное из строки и использующее PhoneticFilterFactory для сопоставления на основе уточненного Soundex.

Я былвозможность повторить шаг 1) в одном запросе solr.

Для шага 2) я планирую запустить 3 параллельных запроса к серверу solr.Первый запрос, выполняющий простой текстовый поиск в поле companyText, второй запрос, выполняющий нечеткое совпадение с использованием оператора ~ в поле companyText, и третий запрос, выполняющий сопоставление soundex в поле companySoundex.Я планирую как-то объединить результаты этих 3-х параллельных запросов, чтобы получить желаемый конечный результат.

Вопросы:

1) Есть ли лучший способ повторить шаг 2)оригинального алгоритма?

2) Даже если я использую подход «три параллельных запроса», то как получить «правильный» порядок сортировки, как в исходном алгоритме?Я полагаю, что основная проблема заключается в том, как сравнить оценки Solr по этим 3 совершенно различным запросам, чтобы получить окончательное объединение результатов

Спасибо за чтение этого длинного вопроса.Любая помощь / указатели будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2013

ИМХО, эта функциональность не может быть достигнута в готовых обработчиках, которые предоставляет Solr.Вам лучше написать собственный обработчик запросов, который обрабатывает и оценивает результаты таким образом.

0 голосов
/ 07 января 2012

Посмотрите на анализатор запросов DisMax. http://wiki.apache.org/solr/DisMaxRequestHandler

Для каждого отдельного запроса вы фактически создадите отдельные поля в индексе для сопоставления. Затем используйте DisMax для взвешивания запросов.

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

...