Как стать автором
Обновить

Комментарии 21

Может я не доглядел, но в чём польза использования SortedDictionary заместо Dictionary в данном случае. Какую это может принести пользу?
Все справочники мы заполняем единожды, а обращаемся мы к ним часто. Как следствие это сделано лишь для оптимизации доступа.:)
Имплементация SortedDictionary базируется на бинарном дереве, Dictionary базируется на хеш-таблице. Скорость доступа Dictionary выше. Так что можно ускорить немного алгоритм, заменив структуру данных.:)
Если посмотреть на графики из данной статьи, то можно увидеть, что скорость чтения из SortedDictionary выше
image
image

полная статья

В любом случае это нюансы. И, кстати, да, я не увидел большой разницы при использовании Dictionary и SortedDictionary. Но тут показалось мне более логичным использовать SortedDictionary.
Вы неправильно интерпретируете графики. Лучшие результаты — бо́льше (а не меньше).
Upd.: Упс, извиняюсь, не заметив Ваш комент ниже.
Что-то я фигню сморозил. Перемудрил. Да, Dictionary, будет быстрее спасибо :)
спасибо за стаью!
больше всего смущает ситуацию с производительностью. Вы ее не измеряли? ведь автодолнение должно быть отзывчивым, а Левенштейн достаточно сложен.

И из текста, не очень понятно, как в итоге была решена проблема: (и решена ли вообще)
3) Названия сервисов имеют в своем составе более одного слова, то человек может просто не помнить, в каком именно порядке они идут.


я всегда мечтал, чтобы на сайтах поиск работал по camelhumps, как в ReSharper-е и IntelliJ IDEA :)

Пожалуйста :)
Производительность в консоле при 1000 наименований была в пределах 1 секунды, что меня вполне устроило, а на большее энтузиазма не хватило.


3 часть начинается со слов:


Со словами, как и поисковой единицей, вроде разобрались, теперь переходим к фразам.
а если поисковый запрос будет выглядить как «а а а а а а » повторенное 100 раз?

Не пробовал. Вечером ради интереса посмотрю. Но тут на первый план выходит адекватность данных.
Алгоритм предназначен для поиска по названиям, а не по текстам.
То такие поисковые запросы можно отсекать до попытки поиска на них.


Тут я еще не поднял вопрос о том как отсекать результаты при выводы на странице "со всеми совпадениями". И вот на эту тему можно похолеварить.:)

Вот тут не понял:

А для русского я составлю сам по наитию:

«ыий», «эе», «ая», «оёе», «ую», «шщ», «оа», «йо»


Что за группа «йо»? Тем более, что и «й» и «о» уже входят в другие группы.

Группа "йо" взялась с транскрипций расскоязычных звуков. Буква ё разлогается на звук "йо". Но если подумать, то Вы правы. Перехода "й" в "о" я не смог придумаль или быстро нагуглить.


Одна буквы может входить в несколько груп например sxz и csz.
Просто так проще их обдумывать и править. И поэтому мы и преобразуем эти фонетические группы в новый справочник который и используем потом в коде

НЛО прилетело и опубликовало эту надпись здесь
Почему именно google? Вон недавно Яндекс выступал о нейронных сетях, автоматизации и т.д. и т.п.
Всё бы здорово, но где взять данные в таком объеме? Это все не реально для обычных сайтов.
НЛО прилетело и опубликовало эту надпись здесь
Lucene в качестве решения не рассматривали? У него и .NET обертка есть…
Не-а. Сейчас попробовал про него поискать и воспользоваться для сравнения результатов выборки, но, в полусонном состоянии, особо ничего не вышло. :) Попробую, как время будет. Спасибо)
Попробовал я поработать с Lucene.NET.
С одной стороны — да.
по слову «Кометика» удалось найти «Косметика». Но поиск упорно выдавал только одно слово и всё. Хотя я, по идее, просил не меньше 1000 результатов
indexSearcher.Search(query, 1000)

Дальше больше, когда я сократил слово до «Ком», результатов вообще не было.
Хотя по идее используется именно нечеткий поиск
Term term1 = new Term(«line», term);
Query query = new FuzzyQuery(term1);

Таким образом получается, что — да он позволяет находить слова с ошибками, но не делать поисковый запрос.
Да и те примеры которые я находил относят именно к поиску на тексте, а не по названиям.
В общем штука интересная, но настраивать и разбираться в документации дольше, чем сделать самому с нуля — это не удобно.
Как то так. Но спасибо за библиотеку.
По поводу сделать самому — без всякой иронии поддерживаю и желаю удачи, вдруг у вас выйдет свой продукт, который займет достойное место на рынке полнотекстового поиска ) Другое дело, что бывают такие задачи, когда пилить свой велосипед накладно или нецелесообразно. У меня в свое время была задача в «мешке» из 7 млн адресов — естественно, неструктурированных и со всеми возможными орфографическими ошибками, найти соответствия мешку из 8к адресов, так же в плачевном состоянии. Lucene отбирал подходяшие на первый взгляд варианты, а основная работа была в том, чтобы отбросить ложные срабатывания и просто похожие, но не одинаковые адреса.
Постоянно пользуюсь такими алгоритмами.
В oracle например есть utl_match.jaro_winkler(s1,s2)
>> Но корме ошибок при наборе
)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории