Поиск по тегам с помощью MySQL

Я хочу написать поисковую систему на основе тегов в MySQL, но я не знаю, как добиться приятного результата.

Я использовал LIKE, но поскольку я хранил более 18 тыс. Ключевых слов в базе данных, это довольно медленно.

У меня есть таблица вроде этого:

id (int, primary key) ключевое слово article_cloud (текст) (varchar (40), FULLTEXT INDEX)

Поэтому я сохраняю одно ключевое слово в строке и сохраняю все ссылочные номера статей в статье_cloud.

Я попробовал материал MATCH () AGAINST (), который отлично работает, пока пользователь вводит ключевое слово целиком. Но я также хочу предложить поиск, так что появляются соответствующие статьи, а пользователь печатает. Поэтому мне все еще нужно подобное заявление LIKE, но быстрее. И я понятия не имею, что я могу сделать.

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

Solutions Collecting From Web of "Поиск по тегам с помощью MySQL"

Поиск MATCH () AGAINST () / FULLTEXT – это быстрое решение проблемы, но ваша схема не имеет никакого смысла – наверняка в каждой статье есть несколько ключевых слов? И использование полнотекстового индекса в столбце, содержащем только одно слово, довольно глупо.

и сохраните все ссылочные номера статей в статье_cloud

Нет! сохранение нескольких значений в одном столбце – ОЧЕНЬ плохая практика. Когда эти значения являются ключами к другой таблице, это смертельный грех!

Похоже, у вас впереди длинное путешествие, чтобы создать что-то, что будет работать эффективно; самый быстрый путь к цели – вероятно, использовать сервисы индексирования Google или Yahoo на ваших собственных данных. Но если вы хотите исправить это сами ….

См. Этот ответ при создании поисковой системы: ключевые слова должны быть в отдельной таблице с отношением N: 1 к вашим статьям, первичным ключом по ключевому слову и идентификатору статьи, например

CREATE TABLE article ( id INTEGER NOT NULL autoincrement, modified TIMESTAMP, content TEXT ... PRIMARY KEY (id) ); CREATE TABLE keyword ( word VARCHAR(20), article_id INTEGER, /* references article.id relevance FLOAT DEFAULT 0.5, /* allow users to record relevance of keyword to article*/ PRIMARY KEY (word, article_id) ); CREATE TEMPORARY TABLE search ( word VARCHAR(20), PRIMARY KEY (word) ); 

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

 SELECT article.id, SUM(keyword.relevance) FROM article, keyword, search WHERE article.id=keyword.article_id AND keyword.word=search.word GROUP BY article_id ORDER BY SUM(keyword.relevance) DESC LIMIT 0,3 

Это будет намного более эффективно, если вы можете поддерживать список слов или правил о словах, которые НЕ использовать в качестве ключевых слов (например, игнорировать любые слова из 3 символов или менее в смешанном или нижнем регистре, будут пропускать такие вещи, как 'a', 'to ',' был ',' и ',' Он '…).

Посмотрите на Сфинкс и Луцен

Я попробовал материал MATCH () AGAINST (), который отлично работает, пока пользователь вводит ключевое слово целиком.

как вы думаете, что означает FULLTEXT?

У меня было 40 000 записей в моем столе, без использования индексов (местное использование), и он искал максимально 0,1 с с помощью LIKE '%SOMETHING%'

Вы можете LIMIT вывод своих запросов