【问题标题】:Create fulltext index on a VIEW在 VIEW 上创建全文索引
【发布时间】:2011-03-15 03:12:02
【问题描述】:

是否可以在 VIEW 上创建全文索引?

如果是这样,给定 VIEW 上的两列 column1column2,完成此操作的 SQL 是什么?

我想这样做的原因是我有两个非常大的表,我需要在每个表上对单个列进行 FULLTEXT 搜索并组合结果。结果需要作为一个单元进行排序。

建议?

编辑:这是我尝试创建 UNION 并按每个语句评分排序。

(SELECT a_name AS name, MATCH(a_name) AGAINST('$keyword') as ascore 
     FROM a WHERE MATCH a_name AGAINST('$keyword'))
UNION  
(SELECT s_name AS name,MATCH(s_name) AGAINST('$keyword') as sscore 
     FROM s WHERE MATCH s_name AGAINST('$keyword'))
ORDER BY (ascore + sscore) ASC

sscore 未被识别。

【问题讨论】:

    标签: mysql view full-text-search multiple-tables


    【解决方案1】:

    MySQL 不允许在视图上使用任何形式的索引,仅在其基础表上。这样做的原因是因为 MySQL 仅在您从中选择视图时才具体化视图,因为基础表可能一直在更改数据。如果您有一个返回 1000 万行的视图,那么每次您都必须对其应用全文索引,这需要很长时间。

    如果您想要完整的索引功能,那么您最好坚持使用您发布的 SQL 脚本,并手动(或 cronjob 脚本)每晚(或每小时更新一次)更新两个表的全文索引'在那个高流量市场)。

    【讨论】:

      【解决方案2】:

      一种可能效率低下但可以完成工作的丑陋解决方法是将视图与基础表连接以访问全文列:

      /* join the view with the underlying table, that is used in the view: */
      select item.* from items_view as item
      left join items as raw_item on raw_item.id = item.id
      /* use the `item` from the view as usual: */
      where item.foo = 'bar'
      /* but use `raw_item` when you need the fulltext index: */
      where match (raw_item.content) against ('foo bar')
      

      当然,如果您需要在视图中创建一个新列并为其提供全文索引,这不是一个相关的解决方案,但是如果您只需要以这种方式访问​​原始数据并且您只需要视图对于其他不相关的操作,那么这可能是要走的路。

      【讨论】:

        猜你喜欢
        • 2011-03-20
        • 1970-01-01
        • 2017-07-12
        • 2012-04-15
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        相关资源
        最近更新 更多