2017-06-09 226 views
1

可以说我有表posts与此列: top_totle,title,sub_title,textMySQL的全文搜索右手食指

我需要所有这列顺序按相关性全文搜索并在TOP_TITLE需要更重要,那么标题等。

所以我有两个问题哪些是相同的,什么是最好的方式为这个索引和如何格式化查询以最好地支持这个索引?

指数期权: 我可以在所有此列的联合创建全文索引或每一本专栏

这是首选的方式创建单独的索引? 选项1:

SELECT 
    title, 
    MATCH (top_title) AGAINST ('text' IN BOOLEAN MODE) as toptitle_score, 
    MATCH (title) AGAINST ('text' IN BOOLEAN MODE) as title_score, 
    MATCH (sub_text) AGAINST ('text' IN BOOLEAN MODE) as sub_text_score, 
FROM 
    `posts` 
WHERE 
    MATCH (top_title,title , sub_text) AGAINST ('text' IN BOOLEAN MODE) 
    and `posts`.`deleted_at` IS NULL 
    AND `published_at` IS NOT NULL 
Order by toptitle_score desc, 
Order by title_score desc , 
Order by subtext_score desc 

选项2:

SELECT 
    title, 
    MATCH (top_title) AGAINST ('text' IN BOOLEAN MODE) as toptitle_score, 
    MATCH (title) AGAINST ('text' IN BOOLEAN MODE) as title_score, 
    MATCH (sub_text) AGAINST ('text' IN BOOLEAN MODE) as sub_text_score, 
FROM 
    `posts` 
WHERE 
    (MATCH (top_title) AGAINST ('text' IN BOOLEAN MODE) 
    or MATCH (title) AGAINST ('text' IN BOOLEAN MODE) 
    or MATCH (sub_text) AGAINST ('text' IN BOOLEAN MODE)) 
    and `posts`.`deleted_at` IS NULL 
    AND `published_at` IS NOT NULL 
Order by toptitle_score desc, 
Order by title_score desc , 
Order by subtext_score desc 

选项3:

is there some smarter way? 

回答

1

选项1是好的。它需要4个FT索引(每列一个,加一个全部3列)。不要重复ORDER BY

ORDER BY toptitle_score DESC , 
     title_score DESC , 
     subtext_score DESC 

方案2是不是一个可行的竞争者。它只需要3个索引(没有太多的节省),但由于OR,速度要慢很多。

选项3 ......(选项1,为固定,再加上...)

ORDER BY您使用的是你想要的东西可能是 “错误的”。例如,它将在toptitle中排在text之后的任何行的末尾。也许你想一些“加权”版本:

ORDER BY 
    9 * top_title_score + 
    3 * title_score  + 
    1 * sub_text_score DESC 

(的9,3,1是相当武断它说,如果“文本”显示了在title 3倍以上,这是不是显示了更重要一次在top_title - 或类似的东西。)