MySQL полнотекстовый поиск по нескольким таблицам

у меня есть ряд таблиц, которые содержат данные, которые мне нужны для полнотекстового поиска. Я пробовал комбинировать таблицы с UNION, но в результате теряет свою fulltext индексируйте, так не может быть полнотекстовый поиск. Я не думаю, что помещать данные во временную таблицу-это путь. Есть ли способ, которым я могу эффективно выполнять полнотекстовый поиск в этих таблицах? Заранее спасибо!

обновление: мой запрос для fulltext был

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")

4 ответов


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

в качестве альтернативы, вы можете либо:

  1. используйте индекс для каждой таблицы и соединение / объединение, чтобы получить строки, соответствующие вашим требованиям.

  2. создайте агрегатную таблицу для применения индекса.

  3. используйте такой инструмент, как lucene или solr, чтобы предоставить индекс поиска. (Если вы идя на любой масштаб, это, вероятно, лучший вариант)


добавьте оценки релевантности вместе:

SELECT ID, Title, Description, Author, 
MATCH (Title) AGAINST ("search terms") +
MATCH (Tags) AGAINST ("search terms") +
MATCH (Body) AGAINST ("search terms") 
AS Relevance

просто:

select * from table a where a.col=myval
union
select * from table b where b.col=myval
..

индексы используются так же, как и при обычном выборе.


С вашей настройкой, которая кажется типом доски объявлений, я предполагаю, что у вас есть три таблицы (исправьте меня, если я ошибаюсь):

  1. Таблица Сообщений (Message_ID, Заголовок, Тело, Описание, Автор)
  2. Таблица Тегов (Tag_ID, Name)
  3. Теги Сообщений (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 (?)
  )