@k_f_i

Как реализовать поиск в sqlite на python?

Всем привет, делаю бота в Telegram. Подскажите как реализовать поисковой движок по бд SQLite. Python только начал изучать, поэтому только такое смог придумать

async def sql_search(message):
search_query = message.text
await bot.send_message(message.from_user.id, search_query)
for ret in cur.execute('SELECT description, guide FROM guides WHERE keys LIKE ?', ('%'+search_query+'%',)).fetchall():
await bot.send_message(message.from_user.id, f'{ret[0]}\nРецепт:\n{ret[1]}')

К каждой статье прописал ключи. Например: сделать приготовить яичницу с овощами и колбаской яичница с колбасой
Как вы понимаете возник следующий эффект. При вводе 'приготовить' выдает все статьи с данным ключом. 'яичницу с овощами' ищет, но 'яичница с овощами' уже нет.

Пришлите, пожалуйста, статьи или гайды где можно было бы изучить данный вопрос. И вообще правильно ли я подошел к делу
  • Вопрос задан
  • 2672 просмотра
Решения вопроса 1
@galaxy
LIKE ищет по точному сопадению части строки, т.е. '%яичница с овощами%' найдет только строки, содержащие подстроку 'яичница с овощами' дословно и добуквенно.
Вы, судя по всему, хотите какой-то вариант полнотекстового поиска. В sqlite есть довольно интересный встроенный, попробуйте разобраться и настроить под свои нужды.

Если такой вариант не подойдет, то можно на коленке сделать что-то свое:
1. разбить теги на отдельные слова (и поместить их в отдельную таблицу keywords, связанную с тегами)
2. отфильтровать ненужные слова типа "приготовить"
3. нормализовать слова - тут понадобится стеммер или словарь (думаю, можно найти библиотеку для питона, правда насчет поддержки русского языка не уверен)
4. запрос также пропускать через шаги 1-3
5. дальше искать как-то так:
SELECT tag_id, count(*)
  FROM keywords
 WHERE word IN ('query_word1', 'query_word2' ...)
 GROUP BY tag_id HAVING count(*) = <number of words in query>
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Это называется "нечеткий поиск", и это непростая тема. Как говорится в одном анекдоте, "длина, ширина, высота и глубина - это совсем не то же, что длинка, ширинка, высотка и глубинка".
Ответ написан
InternetMaster
@InternetMaster
Интернет
Следует использовать нейронную сеть.
Ее конечно надо натренировать (вряд ли есть готовые решения в сети "Интернет"), но можно обратиться и на фриланс и куда хочешь, хоть на YouTube по видеороликам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы