Описание проблемы
Я пытаюсь реализовать собственный алгоритм, соответствующий введенному пользователем вводу свободный текст , названию компании, например "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 совершенно различным запросам, чтобы получить окончательное объединение результатов
Спасибо за чтение этого длинного вопроса.Любая помощь / указатели будут с благодарностью.