За последние 24 часа нас посетили 17570 программистов и 1653 робота. Сейчас ищут 909 программистов ...

Как сделать выборку релевантных записей из БД по фразам

Тема в разделе "PHP и базы данных", создана пользователем Jeick9, 31 окт 2015.

  1. Jeick9

    Jeick9 Активный пользователь

    С нами с:
    18 янв 2011
    Сообщения:
    20
    Симпатии:
    0
    Доброе время суток, форумчане.
    Пытаюсь сделать на самописном сайте выборку релевантных записей из БД. Проблема состоит в том, что не получается сделать SELECT запрос со сравнением входящей строки (фразы через кому) и списком ключевиков, который хранится в таблице БД для каждой записи (фразы также через кому).
    Например:
    Входная строка: стол, стул, диван, зеркало
    Строка к записи в БД: зеркало, табуретка, мягкий диван, окно
    Нужно собственн определить совпадения "диван". Примеров для выборки поиска по одному ключевику из полей таблицы я нашел, но как решить данную проблему мне пока что не удалось. Понимаю, что нужно каждую входную фразу сравнивать с значением поля в БД, но как сделать правильный и корректный запрос, не нагружая при этом БД, я не знаю. Буду благодарен за любые советы.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Переделать структуру БД под теги.

    Тормозное решение в лоб через mysql like.
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Ты можешь подсмотреть решение в существующих движках. Так например для форумов стандартно поиск делается именно по таблице слов.

    Например fluxbb:
    есть таблицы
    • search_words - "словарь". все [ уникальные ] слова из сообщений.
    • search_matches - таблица-связка "многие ко многим" между словарем и таблицей сообщений
    • search_cache - результат поиска. айдишники найденных сообщений сериализуются и сохраняются здесь, а
    пользователь видит URL с указанием номера поиска (search_id). типа
    http: //example.com/search.php?search_id=2024646596&p=2
    Так используется кеш поиска. Не надо всякий раз искать заново, когда листаешь страницы выдачи.

    Чтобы это работало, нужно при сохранении сообщения проиндексировать, т.е. разбить текст на слова и заполнить словарь и таблицу-связку. А собственно скрипт поиска работает со словарем. Он не ищет фразы, только отдельные слова, но эти слова можно соединять через OR, AND и NOT. Если ничего не указано, то считается, что надо найти упоминание каждого слова, то есть через AND.