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

Ищем быстро, еще быстрее

Время на прочтение3 мин
Количество просмотров22K
Натолкнулся в разделе QA на интересный вопрос. Ответ на него заставил написать эту статью как бОлее полный ответ на вопрос «как организовать поиск по множеству параметров, как в Яндекс-маркете, например».

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

Итак, что имеем в «ДАНО»
  • Имеем 120 чекбоксов — вариант 1/0
  • Имеем 30 «радио» с выбором «да/нет/не важно»
  • Имеем 2-3 слайдера для указания диапазона цен/размера чего нить
  • Имеем самое главное: 12 млн записей в БД.
  • Имеем Select * From tovar Where (wifi=true) and (led=false) and (type=3) and ….остальные параметры …; со временем выполнения близкому к истерике клиента.

Читать дальше →
Всего голосов 184: ↑180 и ↓4+176
Комментарии117

Быстрый поиск по всем пользователям ВК

Время на прочтение8 мин
Количество просмотров18K

Задача:

Нужно пройтись по 650 000 000 пользователям ВК и вытащить только тех, кто живет в Москве. Затем отдельно обработать уже полученные айдишники.

Решение:

- генерация токенов для вк api

- асинхронные запросы

- код проекта в Google Colab (Python)

Читать далее
Всего голосов 13: ↑11 и ↓2+9
Комментарии6

Эффективное геометрическое хеширование пространства признаков для быстрого точного поиска наиболее близких дескрипторов

Время на прочтение11 мин
Количество просмотров2.7K

При решении задачи распознавания лиц в компании Оксаджайл (Oxagile) был разработан новый алгоритм эффективного геометрического хеширования пространства лицевых признаков с целью быстрого поиска двух наиболее близких по косинусному расстоянию лицевых дескрипторов. Разработанный алгоритм обладает той же точностью, что и метод простого перебора и, в то же время, он приблизительно в сто раз быстрее. С более подробным описанием алгоритма можно познакомиться в англоязычном оригинале настоящей статьи.

Читать далее
Всего голосов 6: ↑6 и ↓0+6
Комментарии4

Как я написал свою поисковую систему для быстрого поиска личной информации

Время на прочтение6 мин
Количество просмотров7.9K

Предыстория

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

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

Поиск по содержанию файла даёт не самый релевантный результат. Может выдать бесполезные результаты с содержанием содержащие ключевые слова, но не относящиеся к тому, что действительно необходимо найти.

Более того по содержанию можно искать только текстовые файлы.

Структура содержания информации

Структура папок представляется собой в виде дерева. Мне это не нравится, потому что каждая папка может содержать только определенные файлы, если не учитывать копирование и ссылки.

Так же это можно представить с примером из реальной жизни, для того, чтобы найти зелёное свежее яблоко сорт "девственный". Необходимо найти отдел с фруктами, затем отдел с яблоками, затем ищем зеленные, затем сорт, ну там ещё их на свежие, не свежие фасуют в этом воображаемом примере и наконец найти нужное apple.

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

Читать далее
Всего голосов 4: ↑4 и ↓0+4
Комментарии28

«Быстрый» и «медленный» поиск: два различных подхода для поиска на сайте

Время на прочтение3 мин
Количество просмотров1.7K
Добрый день, друзья.

Сегодня я хотел бы рассказать о двух подходах к поиску информации, которые я использую на своем сайте. Условно я их называю «быстрый» и «медленный» поиск (хотя можно придумать и другие термины, но мне нравятся эти). В целом, идея довольно проста: «быстрый» поиск – это тот, который выдает информацию «здесь и сейчас», а «медленный» — растянутую во времени, например, ежедневно, еженедельно и т.д. Каждый подход имеет своих целевых пользователей, и оба весьма органично дополняют друг другу.

Читать дальше →
Всего голосов 8: ↑6 и ↓2+4
Комментарии12

Анализ возможностей массового аудита на основе утечки хешей из LinkedIn

Время на прочтение6 мин
Количество просмотров4.5K
Неделю назад утекла база хешей с LinkedIn, для других это событие может быть примечательным само по себе, но для меня, в первую очередь, это означает возможность провести анализ современных возможностей взлома паролей. И я не собираюсь рассказывать о том сколько раз слово «password» было встречено среди паролей и о том, сколько времени занимает перебор шестисимвольных комбинаций. Скорее буду пугать пользователей тем, насколько сложные пароли можно «взломать» за несколько часов. А программистам расскажу как это возможно эффективно реализовать, и в качестве небольшого подарка приложу программу, которую я написал для массового аудита. Присутствует и некоторый ликбез по использованию радужных таблиц с простыми выводами.

И так, за час удалось «восстановить» около 2.5 миллионов паролей на средней рабочей конфигурации, без специальных словарей и радужных таблиц. Среди найденных паролей присутствуют 16-символьные алфавитно-цифровые комбинации, и далеко не в единственном экземпляре.
Читать дальше →
Всего голосов 120: ↑116 и ↓4+112
Комментарии123

Алгоритм быстрого поиска при помощи хэширования

Время на прочтение5 мин
Количество просмотров3K

В этой статье я хочу представить мой алгоритм оптимизации суммирования ряда чисел в массиве (на примере контейнера map). 

Итак, дано задание

Есть некая электронная книга, которую одновременно читает неограниченное количество читателей. Нужно сделать так, чтобы любой читатель в любой момент мог проверить, сколько еще читателей читают ту же страницу, что и он. Предложена наивное решение хранить в map<int,int> в качестве ключа номера страниц, в качестве значения- количество прочитавших их пользователей. Конечно, при таком подходе программа медленно работает с большими тестами потому, что количество итераций по контейнеру map равняется числу прочитанных пользователем страниц. То есть, если пользователь прочел 1000 страниц из 1000 возможных, то в цикле нужно будет сделать 1000 итераций, и это сильно замедляет программу.  

Чтобы уменьшить время работы программы, нужно упростить алгоритм подсчета пользователей. В этом алгоритме я отдельно считаю, сколько пользователей прочли столько же полных сотен страниц, как и искомый читатель, и затем уже постранично суммирую всех, кто прочел столько же страниц из той сотни, на которой сейчас находится читатель. Такой алгоритм позволяет вместо 999 итераций (если пользователь читает 999-ю страницу) сделать всего 108 (9 итераций сотням и 99 по единичным страницам). 

 Это вкратце, теперь перейдем к подробному описанию и для начала приведу код.

больше информации
Всего голосов 3: ↑0 и ↓3-3
Комментарии12