Как реализовать поиск в телеграмм боте на Go библиотека telebot

пример реализации Хочу сделать похожий поиск, никакой информации в интернете не нашел, если у кого то опыт с разрабткой такого поиска на Golang и библиотеки telebot. и вожмоно ли вообще такое


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

Автор решения: Дамир Ахметов
bot.Handle(telebot.OnQuery, func(c telebot.Context) error {
        query := c.Query() // Получаем *telebot.Query из контекста
        queryText := strings.TrimSpace(query.Text)
        if queryText == "" {
            return nil
        }

        // Выполняем поиск в базе данных
        results, err := searchItemsInDB(queryText)
        if err != nil {
            log.Println("Ошибка при поиске:", err)
            return nil
        }

        // Создаем результаты для инлайн-режима
        var articles []telebot.Result
        for _, item := range results {
            messageText := fmt.Sprintf("*%s*\nЦена: %d руб.\nКатегория: %s\nГород: %s", item.Name, item.Price, item.Category, item.City)

            article := &telebot.ArticleResult{
                Title:       item.Name,
                Description: fmt.Sprintf("%d руб., %s, %s", item.Price, item.Category, item.City),
                Text:        messageText,
                // Убрано ParseMode, так как его больше нет в ArticleResult
            }
            articles = append(articles, article)
        }

        // Создаем QueryResponse и отправляем через контекст
        response := &telebot.QueryResponse{
            Results:   articles,
            CacheTime: 60, // Время кэширования в секундах, настройте при необходимости
        }
        // Отправляем результаты инлайн-поиска
        return c.Answer(response)
    })
/ Структура для хранения данных о товаре
type Item struct {
    ID          int
    Name        string
    Price       int
    Description string
    City        string
}

// Функция для поиска товаров в базе данных
func searchItemsInDB(query string) ([]Item, error) {
    rows, err := db.Query("SELECT id, name, price, city FROM sales_items WHERE name ILIKE $1 OR description ILIKE $1 LIMIT 10", "%"+query+"%")
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var items []Item
    for rows.Next() {
        var item Item
        if err := rows.Scan(&item.ID, &item.Name, &item.Price, &item.City); err != nil {
            return nil, err
        }
        items = append(items, item)
    }
    return items, nil
}
→ Ссылка