Полнотекстовый поиск в Android
В мобильных приложениях очень востребована функция поиска. И если в небольших продуктах ею можно пренебречь, то в приложениях, которые предоставляют доступ к большому количеству информации, без поиска не обойтись. Сегодня я расскажу, как правильно реализовать эту функцию в программах под Android.
Подходы к реализации поиска в мобильном приложении
- Поиск как фильтр данных
Обычно это выглядит как строка поиска над каким-нибудь списком. То есть мы просто фильтруем уже готовые данные.
Серверный поиск
В этом случае мы отдаём всю реализацию на откуп серверу, а приложение выступает в роли тонкого клиента, от которого требуется лишь показать данные в нужном виде.
Комплексный поиск
- приложение содержит в себе большое количество данных разного типа;
- приложение работает оффлайн;
- поиск нужен как единая точка доступа к разделам/контенту приложения.
В последнем случае на помощь приходит встроенный в SQLite полнотекстовый поиск (Full-text search). С его помощью можно очень быстро находить совпадения в большом объёме информации, что позволяет нам делать несколько запросов в разные таблицы без снижения производительности.
Рассмотрим реализацию такого поиска на конкретном примере.
Подготовка данных
Допустим, нам необходимо реализовать приложение, которое показывает список фильмов с сайта themoviedb.org. Для упрощения (чтобы не ходить в сеть), возьмём список фильмов и сформируем из него JSON-файл, положим его в assets и локально будем наполнять нашу базу данных.
Пример структуры JSON-файла:
Наполнение базы данных
Для реализации полнотекстового поиска в SQLite используются виртуальные таблицы. Внешне они выглядят как обычные таблицы SQLite, но при любом обращении к ним выполняется некая закулисная работа.
Виртуальные таблицы позволяют нам ускорить поиск. Но, помимо преимуществ, у них есть и недостатки:
- нельзя создать триггер на виртуальной таблице;
- нельзя выполнять команды ALTER TABLE и ADD COLUMN для виртуальной таблицы;
- каждый столбец в виртуальной таблице индексируется, а это значит, что могут впустую тратиться ресурсы на индексацию столбцов, которые не должны участвовать в поиске.
Для решения последней проблемы можно использовать дополнительные таблицы, которые будут содержать часть информации, а в виртуальной таблице хранить ссылки на элементы обычной таблицы.
Создание таблицы немного отличается от стандартного, у нас появились ключевые слова VIRTUAL и fts4 :
Наполнение же ничем не отличается от обычного:
Базовый вариант
При выполнении запроса используется ключевое слово MATCH вместо LIKE :
Для реализация обработки ввода текста в интерфейсе будем использовать RxJava :
Получился базовый вариант поиска. В первом элементе нужное слово нашлось в описании, а во втором элементе — и в заголовке, и в описании. Очевидно, что в таком виде не совсем понятно, что мы нашли. Давайте это исправим.
Добавляем акценты
Для улучшения очевидности поиска воспользуемся вспомогательной функцией SNIPPET . Она используется для отображения отформатированного фрагмента текста, в котором найдено совпадение.
- movies — название таблицы;
- Алгоритм Портера
После этого преобразования фраза «дворы и призраки» выглядит как «двор* OR призрак*».
Символ «*» означает, что поиск будет вестись по вхождению данного слова в другие слова. Оператор «OR» означает, что будут показаны результаты, которые содержат хотя бы одно слово из поисковой фразы. Смотрим:
Резюме
Полнотекстовый поиск не такой сложный, как может показаться с первого взгляда. Мы разобрали конкретный пример, который вы быстро и легко сможете реализовать у себя в проекте. Если вам нужно что-то сложнее, то стоит обратиться к документации, благо она есть и довольно хорошо написана.
Источник
Android поиск по всем предметам
Бухгалтер известного магната Хэдли Стрэнджа пытается раскрыть тайну века.
Приквел классической головоломки ISOLAND.
v1.0.15 + Мод: много денег
Помогите потерявшейся девочке Норе найти путь обратно домой.
Увлекательная головоломка на андроид, где вы будете решать задачи в мрачной обстановке.
Приключенческая игра где вы будете расследовать исчезновение известного писателя.
Приключенческая игра где вы с главной героиней отправитесь в прошлое и попробуете разгадать все тайны и загадки.
Изучайте одинаковые картинки и находите различия.
Управляйте детективном и помогите ей найти серийного убийцу.
Фантастическое приключение с поиском предметов!
Сможешь ли ты отгадать все загадки и тайны в детективной игре?
Разгадайте тайну удивительной легенды о Кровавой луне.
Исследуйте запертый бункер и отыщите все ключи для того чтобы покинуть его.
Отличная головоломка где вы будете разгадывать тайны странного острова.
v1.0.35 + Мод: много денег
Квест где вы будете исследовать таинственный остров и огромный особняк.
Увлекательное путешествие в древний затерянный город который поведает вам много тайн.
Захватывающий квест где вы будете путешествовать по пяти королевствам.
Погрузитесь в мир сказок и раскройте все тайны и загадки этой игры.
Отличное приключение Петьки и ВИЧ в Америке.
Увлекательный квест где вы будете помогать главной героине выиграть супер приз.
Исследуйте студенческое общежитие и старайтесь как можно быстрее покинуть его.
Источник
Android поиск по всем предметам
Отправляйтесь в космос вместе с гномом, как в старые добрые времена.
Оригинальная игра головоломка с элементами квеста и побега из комнаты.
Отличная игра про талантливую художницу.
Бухгалтер известного магната Хэдли Стрэнджа пытается раскрыть тайну века.
Напрягите не мозг, а глаза!
Отправляйтесь с блогером Анжело в ад и соберите ценный репортаж.
Третья часть приключений Питера.
Прошлое всегда возвращается.
Помогите маленькой девочке выжить в особняке, полном опасностей и найти выход из него.
Продолжение одной из самых высоко оценённых хоррор игр.
Вторая часть завоевавшей популярность игры с сотнями сюжетных линий и головоломок.
Присоединись к продолжению амбициозной игры от Amanita Design.
Веселая игра где вы будете помогать забавному герою Чучело заполучить черешню.
Забавный поиск предметов.
Узнайте, с чего начиналась серия Samorost.
Толковый, нуарный детективчик.
Жуткая головоломка для двоих игроков.
Приключенческая игра с сотнями сюжетных линий и головоломок.
Раскройте тайны игрового мира вплоть до момента побега из хирургической клиники полковника Макмиллана.
Занимательный квест где вы будете выявлять следы незаконных экспериментов с биологическим оружием.
Источник
Android поиск по всем предметам
Выживайте в бункере со своей семьей после ядерного взрыва.
v1.3.121 + Мод: бесконечные ресурсы
Веселая игра где вы будете помогать забавному герою Чучело заполучить черешню.
Помогите маленькой девочке выжить в особняке, полном опасностей и найти выход из него.
Продолжение всеми известной головоломки The Room.
v1.06 Full + Мод: бесконечные пропуски
Присоединись к продолжению амбициозной игры от Amanita Design.
Столкнитесь со своими самыми глубокими страхами и разгадайте леденящую кровь тайну лечебницы.
Увлекательная игра где вы будете разгадывать тайну исчезновения семьи.
Приключения «чумного» доктора.
Управляйте демоном Сидом и помогите ему справится с наемными убийцами.
Ухаживайте за животными и примите участие в веселых играх.
Оригинальная игра головоломка с элементами квеста и побега из комнаты.
Приключенческая игра где вы будете помогать Люси путешествовать по фантастическому миру.
Разгадайте тайны научно-исследовательского здания и найдите все улики и спрятанные предметы.
Отличное приключение Петьки и ВИЧ в Америке.
Жуткая головоломка для двоих игроков.
Продолжение одной из самых высоко оценённых хоррор игр.
Откройте для себя удивительный трехмерный мир игры и раскрой все его тайны.
v1.054 + Мод: без рекламы
Приключенческий хоррор на андроид, со сложными головоломками.
Приключенческая игра где вы будете помогать главному герою ходить на свидания.
Выживайте в ужасном доме в компании монстров и постарайтесь покинуть его как можно быстрее.
Источник