Статьи

Поиск имен во всех неправильных местах

Алгоритмы поиска людей

Как вы можете себе представить, поиск имен людей не тривиален. Помимо обычных текстовых выпусков в смешанном регистре, у вас есть варианты имен, псевдонимы и тому подобное. Фонетический поиск очень интересен.

Вы хотите найти Кэтрин, когда вы ищете Кэтрин. И поиск Джеймса должен найти вас, Джим и Джимми.

Существует целый ряд алгоритмов и библиотек, которые помогут вам выполнить более сложное сопоставление имен.

Soundex является стандартом и очень часто используется. Он находится в большинстве основных баз данных и достаточно хорош в поиске совпадений.  Soundex был создан для переписи населения США , поэтому у них был довольно хороший набор тестовых данных.

Для тех , кто повезло достаточно , чтобы иметь ElasticSearch, существует целый ряд сверхмощных вариантов . Примеры, о которых я говорил, были связаны с американскими / английскими именами — очевидно, есть другие языки и страны, которые имеют свои собственные алгоритмы, которые имеют больше смысла для них.

Так как же применить этот крутой поиск на практике? Вот список некоторых распространенных решений Java:

import org.apache.commons.codec.language.Soundex;
import org.apache.commons.codec.language.Nysiis;
import org.apache.commons.codec.language.DoubleMetaphone;

// ...

Soundex soundex = new Soundex();
String soundexEncodedValue = soundex.encode("Timothy");
String soundexEncodedCompareValue = soundex.encode("Tim");
String s3 = soundex.encode("Timmy");

// Timothy = T530 Tim = T500, Timmy = T500

Nysiis n = new Nysiis();

// Timothy = TANATY, Tim =TAN, Timmy = TANY

DoubleMetaphone m = new DoubleMetaphone();
// Timothy = TM0, Tim = TM, Timmy = TM

Расстояние Левенштейна — это еще один вариант или, по крайней мере, усилитель.

Немного лучшей альтернативой является NYSIISNYIIS реализован на Java библиотекой кодеков Apache Commons .

NYIIS также довольно прост в реализации самостоятельно. 

Кроме того, Metaphone очень хорош, а также в швейцарском армейском инструменте поиска текста, Apache Commons Codec .

В моем примере кода, на мое имя, кажется, что двойной метафон является лучшим. Для действительно сложных запросов вам может понадобиться использовать несколько алгоритмов. Поскольку кодек Apache Commons содержит их все и все они используют один и тот же метод кодирования, у вас не должно возникнуть проблем при интеграции этого в код Java 8, Spring, Hadoop или Spark. Было бы действительно легко написать REST-сервис, который ищет имена и похожие имена в Spring Boot, когда Apache Commons Codec работает в экземпляре CloudFoundry.