Полнотекстовый поиск MySQL по нескольким таблицам
У меня есть серия таблиц, содержащих данные, которые я хочу для полнотекстового поиска. Я пробовал комбинировать таблицы с UNION
, но результат теряет свой полнотекстовый индекс, поэтому поиск в полнотекстовом поиске невозможен. Я не думаю, что перенос данных в временную таблицу - это путь. Возможно ли, что я могу полнотекстовый поиск этих таблиц эффективно? Спасибо заранее!
UPDATE:
мой запрос для полного текста был
SELECT ID, Title, Description, Author, MATCH (Title,Tags,Body) AGAINST ("search terms") AS Relevance
FROM [combination of tables goes here]
WHERE MATCH (Title,Tags,Body) AGAINST ("search terms")
Ответы
Ответ 1
MySQL не может создавать полнотекстовый (или любой) индекс по нескольким таблицам. Таким образом, использование одного индекса отсутствует.
В качестве альтернативы вы можете либо:
-
Используйте индекс для каждой таблицы и соединение/объединение, чтобы получить строки, соответствующие вашим требованиям.
-
Создайте таблицу агрегатов, чтобы применить индекс к.
-
Используйте инструмент, например lucene или solr, чтобы указать индекс поиска. (Если вы собираетесь использовать какой-либо масштаб, это, скорее всего, лучший вариант)
Ответ 2
Добавьте оценки релевантности вместе:
SELECT ID, Title, Description, Author,
MATCH (Title) AGAINST ("search terms") +
MATCH (Tags) AGAINST ("search terms") +
MATCH (Body) AGAINST ("search terms")
AS Relevance
Ответ 3
просто выполните:
select * from table a where a.col=myval
union
select * from table b where b.col=myval
..
используются индексы с обычным выбором.
Ответ 4
Когда ваша настройка является тем, что кажется типом доски объявлений, я предполагаю, что у вас есть три таблицы (исправьте меня, если я ошибаюсь):
- Таблица сообщений (Message_ID, Название, Тело, Описание, Автор)
- Таблица тегов (Tag_ID, Name)
- Теги сообщения (Message_ID, Tag_ID)
Вот как я это сделаю
SELECT Message.Message_ID, Message.Title, Message.Description, Message.Author,
IFNULL(
MATCH (Name)
AGAINST (?)
,
IFNULL(
MATCH (Message.Title)
AGAINST (?)
,
MATCH (Message.Body)
AGAINST (?)
)
) AS Relevance
FROM Message, Tag, Message_Tag
WHERE Message.Message_ID = Message_Tag.Message_ID AND Message_Tag.Tag_ID = Tag.Tag_ID
AND (
MATCH (Name)
AGAINST (?)
OR
MATCH (Message.Title)
AGAINST (?)
OR
MATCH (Message.Body)
AGAINST (?)
)