Полнотекстовый поиск 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 (?)
  )