MySQL полнотекстовый поиск по нескольким таблицам - PullRequest
13 голосов
/ 13 июля 2009

У меня есть ряд таблиц, которые содержат данные, которые я хочу для полнотекстового поиска. Я попытался объединить таблицы с 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")

Ответы [ 4 ]

12 голосов
/ 13 июля 2009

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

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

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

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

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

4 голосов
/ 26 июня 2015

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

SELECT ID, Title, Description, Author, 
MATCH (Title) AGAINST ("search terms") +
MATCH (Tags) AGAINST ("search terms") +
MATCH (Body) AGAINST ("search terms") 
AS Relevance
2 голосов
/ 13 июля 2009

просто сделайте:

select * from table a where a.col=myval
union
select * from table b where b.col=myval
..
Индексы

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

1 голос
/ 13 июля 2009

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

  1. Таблица сообщений (Message_ID, Title, Body, Description, Author)
  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 (?)
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...