sql >> データベース >  >> RDS >> Mysql

複数の列に対するMySQL全文検索:結果の混乱

    InnoDBテーブルでは、同じMATCH()内の複数のフルテキストインデックスを検索できないようです。 状態。

    ここでは、フィールドがすべて同じテーブルに属しているわけではないため、異なるインデックスでカバーされています。次のようなテーブルがある場合も、同じ制限が適用されることに注意してください。

    CREATE TABLE t (
      f1 VARCHAR(20),
      f2 VARCHAR(20),
      FULLTEXT(f1), FULLTEXT(f2)
    ) ENGINE=InnoDB;
    
    SELECT * FROM t
    WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row
    

    のように見えます 全文検索では、最初に検出された全文インデックスのみを検索できますが、これは私が差し引くものにすぎませんこの経験から 、これを当然のことと思わないでください。

    つまり、MATCH()ごとに1つのフルテキストインデックスを使用するように検索を分割する必要があります。 条項:

    SELECT * FROM auction, user, gallery, ...
    WHERE
        MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR
        MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR
        MATCH(user.field1, user.field2, user.field3) AGAINST...
    

    これは、auctionに2つの異なるインデックスがある場合に考えられるクエリの例です。 1つはuserにあります 。実際の構造に適合させる必要があります(さらにガイダンスが必要な場合は、テーブルの説明を投稿してください)。

    これはInnoDBテーブルにのみ適用されることに注意してください。興味深いことに、MyISAMテーブルは同じ制限を示していないようです

    更新:これはInnoDBエンジンのバグ であることが判明しました 、5.6.13/5.7.2で修正されました。上記の例は、「列リストに一致するFULLTEXTインデックスが見つかりません」で正しく失敗します。実際、(f1, f2)にはインデックスがありません 、ただし(f1)に1つ もう1つは(f2)にあります 。 変更ログのアドバイスに従って> :

    このようなクエリはMyISAMで正しい結果セットを返しますが、既存のフルテキストインデックスを黙って無視します




    1. MySQLで結果をランク付けするときにタイを処理するにはどうすればよいですか?

    2. EntityFrameworkクエリを最適化する方法

    3. SQLServerの現在のセッションの日付形式を変更する

    4. HDFSの概要| HDFSとは何ですか?どのように機能しますか?