Я хочу написать поисковую систему на основе тегов в MySQL, но я не знаю, как добиться приятного результата.
Я использовал LIKE, но поскольку я хранил более 18 тыс. Ключевых слов в базе данных, это довольно медленно.
У меня есть таблица вроде этого:
id (int, primary key) ключевое слово article_cloud (текст) (varchar (40), FULLTEXT INDEX)
Поэтому я сохраняю одно ключевое слово в строке и сохраняю все ссылочные номера статей в статье_cloud.
Я попробовал материал MATCH () AGAINST (), который отлично работает, пока пользователь вводит ключевое слово целиком. Но я также хочу предложить поиск, так что появляются соответствующие статьи, а пользователь печатает. Поэтому мне все еще нужно подобное заявление LIKE, но быстрее. И я понятия не имею, что я могу сделать.
Возможно, это неправильная концепция поиска на основе тегов. Если вы знаете лучший, пожалуйста, дайте мне знать. Я борюсь с этим в течение нескольких дней и не могу найти удовлетворительное решение. Спасибо за прочтение 🙂
Поиск 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
вывод своих запросов