2017-06-09 20 views
1

は、私は、この列を持つテーブルpostsを持って言うことができますMySQLのフルテキスト検索右インデックス

私は2つの質問が同じですが、このためのインデックスを作成する最良の方法と、このインデックスを最もよくサポートするためにクエリをフォーマットする方法は何ですか?

インデックスオプション: 私はこのコラムのすべてに組み合わせたフルテキストインデックスを作成するか、このコラムれる好ましい方法である

ごとに別々のインデックスを作成することができますか? オプション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インデックスが必要です(1列に1つ、3列に1つ)。 ORDER BYを繰り返さないでください:

ORDER BY toptitle_score DESC , 
     title_score DESC , 
     subtext_score DESC 

オプション2は、実行可能な候補ではありません。 3つのインデックスしか必要ありません(節約はそれほどありません)が、ORのためにかなり遅くなります。

オプション3 ...(固定としてオプション1、プラス...)

は、使用しているORDER BYはおそらくあなたが望むもののために "間違った" です。たとえば、textを含まない行がリストの最後に移動すると、toptitleになります。おそらく、あなたは、いくつかの「加重」バージョンとします。

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

(9,3,1はかなり任意であるがそれはテキストが "titleに3回以上現れた場合、それが現れてよりも重要であると述べていますtop_titleなどで1回)

関連する問題