Как работает поиск без полных совпадений?

У меня есть запись, она имеет несколько полей, к примеру: город, имя, фамилия, биография и т.д. Как сделать поиск который бы искал не при полном совпадении - когда находим запись полностю введя к примеру Иван, а если еще вводя - ив и похожие показать. Так к примеру ищет Google, как оно работает и сложно ли сделать подобное в обычной программе, запись в C# колекции введите сюда описание изображения


Ответы (1 шт):

Автор решения: aepot

Допустим у вас есть набор строк, содержащих фразы или предложения.

Нужно заранее знать, сколько минимум результатов вы хотите получить, например 10.

  1. Самое простое решение для вас - это поиск по вхождению, то есть если в строке найден фрагмент, введенный в поисковом запросе, то строку можно считать найденной
  2. Найденные выше строки можно отсортировать по следующим весам, если вхождение в начале строки +2 балла, если вхождение в начале слова +1 балл, опционально можно сложить все вхождения, но тогда по поисковому запросу ив - строка Иванов Иван Иванович из деревни Ивантеевка всегда будет на первом месте
  3. Если количество выше найденных результатов меньше 10, то отрезаем от поискового запроса символ справа и повторяем шаги 0 и 1.
  4. Если количество выше найденных результатов меньше 10, то отрезаем символ слева и повторяем шаги 0, 1 и 2
  5. Повторяем шаги 0-3, пока: количество результатов выдачи не достигнет 10 ИЛИ поисковый запрос стал содержать 1 символ ИЛИ количество результатов выдачи равно общему количеству записей в базе, но меньше 10.

Усложняющие алгоритмы:

  1. Разбить поисковый запрос на слова, повторять выше показанный алгоритм для каждого слова, по одному шагу от последнего слова к первому.
  2. Дополнительное ранжирование по суммарному количеству вхождений и вхождению полной фразы улучшит качество поисковой выдачи.

Чтобы сделать красиво, можно подсвечивать вхождения в результирующей выдаче - массив из пар (индекс символа, длина).

Собственно, дальше это всё можно развивать столько, насколько фантазии хватит, но никаких космических секретов я вам не раскрыл, и понятия не имею, как оно там в Гугле или Яндексе работает.
(но это не точно)

Кстати, всю эту красивую историю можно реализовать на базе Stored Procedure прямо в БД, если у вас есть конечно БД.

→ Ссылка