跨多个表的MySQL全文搜索

时间:2009-07-12 21:41:21

标签: search mysql full-text-search

我有一系列表格,其中包含我想要全文搜索的数据。我已尝试将表与UNION组合在一起,但结果会丢失其全文索引,因此无法进行全文搜索。我不认为将数据放入临时表是可行的方法。有道理我可以全文搜索这些表吗?提前谢谢!

更新: 我对全文的查询是

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 个答案:

答案 0 :(得分:12)

MySQL无法在多个表中创建全文(或任何)索引。因此,使用单个索引即可。

作为替代方案,您可以:

  1. 在每个表上使用索引,并根据需要使用联接/联合来检索符合您要求的行。

  2. 创建聚合表以将索引应用于。

  3. 使用lucene或solr等工具提供搜索索引。 (如果您选择任何规模,这可能是最好的选择)

答案 1 :(得分:3)

将相关性分数加在一起:

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

答案 2 :(得分:2)

简单地做:

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

索引与普通选择一起使用。

答案 3 :(得分:1)

你的设置似乎是一种留言板,我假设你有三张桌子(如果我错了,请纠正我):

  1. 消息表(Message_ID,标题,正文,描述,作者)
  2. 标记表(Tag_ID,名称)
  3. 消息标记(Message_ID,Tag_ID)
  4. 我将如何做到这一点

    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 (?)
      )