【问题标题】:MySQL full text search across multiple tables跨多个表的 MySQL 全文搜索
【发布时间】:2010-11-10 03:52:13
【问题描述】:

我有一系列表,其中包含我想要全文搜索的数据。我尝试将这些表与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")

【问题讨论】:

  • 您是在不同的表中寻找相同的东西,还是在寻找不同的东西?你包括多少张桌子?

标签: search mysql full-text-search


【解决方案1】:

简单地做:

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

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

【讨论】:

    【解决方案2】:

    MySQL 无法跨多个表创建全文(或任何)索引。所以使用单个索引就不行了。

    作为替代方案,您可以:

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

    2. 创建一个聚合表来应用索引。

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

    【讨论】:

    • 至少在 5.x 分支中,使用索引的连接似乎有不能使用全文索引的副作用。使查询效率相当低。 ://
    • 这很有趣 - 猜猜这是 mysql 每个表只能使用一个索引的副作用。在全文搜索的上下文中从未真正考虑过这一点。
    • 第一个是我想要做的,但是索引在联合后消失了,第二个是我不想做的。感谢您确认我开始了解的内容
    【解决方案3】:

    由于您的设置似乎是一种留言板,我假设您有三个表格(如果我错了,请纠正我):

    1. 消息表(Message_ID、标题、正文、描述、作者)
    2. 标签表(Tag_ID、名称)
    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 (?)
      )
    

    【讨论】:

      【解决方案4】:

      将相关性分数相加:

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

      【讨论】:

        猜你喜欢
        • 2012-02-19
        • 2013-02-15
        • 2012-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        相关资源
        最近更新 更多