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

MySQLのブール全文検索の`〜`(チルダ)演算子は、MySQL開発者のWebサイトに記載されているように動作していません

    私の答えに関する文書はどこにもありませんが、徹底的な実験の結果、この最も論理的な結論に到達しました-

    「+」演算子が存在すると、「〜」演算子の効果は無効になります

    テーブルのfruitsを更新しました 次の値で-

    SELECT * FROM fruits;
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  1 | apple orange watermelon |
    |  2 | apple mango pomegranate |
    |  3 | apple mango banana      |
    |  4 | mango kiwi pomegranate  |
    |  5 | mango guava watermelon  |
    |  6 | apple banana kiwi       |
    +----+-------------------------+
    

    クエリ1:

    SELECT id, name FROM fruits
        -> WHERE MATCH(name) AGAINST
        -> ('apple mango ~pomegranate'
        -> IN BOOLEAN MODE);
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  3 | apple mango banana      |
    |  1 | apple orange watermelon |
    |  5 | mango guava watermelon  |
    |  6 | apple banana kiwi       |
    |  2 | apple mango pomegranate |
    |  4 | mango kiwi pomegranate  |
    +----+-------------------------+
    

    クエリ2:

    SELECT id, name FROM fruits
        -> WHERE MATCH(name) AGAINST
        -> ('apple ~pomegranate'
        -> IN BOOLEAN MODE);
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  1 | apple orange watermelon |
    |  3 | apple mango banana      |
    |  6 | apple banana kiwi       |
    |  2 | apple mango pomegranate |
    +----+-------------------------+
    

    クエリ3:

    SELECT id, name FROM fruits
        -> WHERE MATCH(name) AGAINST
        -> ('mango ~pomegranate'
        -> IN BOOLEAN MODE);
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  3 | apple mango banana      |
    |  5 | mango guava watermelon  |
    |  2 | apple mango pomegranate |
    |  4 | mango kiwi pomegranate  |
    +----+-------------------------+
    

    ここで、クエリ1、2、3では、値の前に演算子はありません apple およびmango および 演算子は値pomegranateの前にあります 。これにより、 pomegranateという単語が含まれる行が確実に表示されます。 他よりもランクが低くなっています。

    クエリ4:

    SELECT id, name FROM fruits
        -> WHERE MATCH(name) AGAINST
        -> ('+apple +mango ~pomegranate'
        -> IN BOOLEAN MODE);
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  2 | apple mango pomegranate |
    |  3 | apple mango banana      |
    +----+-------------------------+
    

    クエリ5:

    SELECT id, name FROM fruits
        -> WHERE MATCH(name) AGAINST
        -> ('+apple ~pomegranate'
        -> IN BOOLEAN MODE);
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  1 | apple orange watermelon |
    |  2 | apple mango pomegranate |
    |  3 | apple mango banana      |
    |  6 | apple banana kiwi       |
    +----+-------------------------+
    

    クエリ6:

    SELECT id, name FROM fruits
        -> WHERE MATCH(name) AGAINST
        -> ('+mango ~pomegranate'
        -> IN BOOLEAN MODE);
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  2 | apple mango pomegranate |
    |  3 | apple mango banana      |
    |  4 | mango kiwi pomegranate  |
    |  5 | mango guava watermelon  |
    +----+-------------------------+
    

    ここで、クエリ4、5、6 + 演算子は値の前にありますapple およびmango および 演算子は値pomegranateの前にあります 。明らかに+の存在 演算子はの効果を無効にします オペレーター。

    クエリ7:

    SELECT id, name FROM fruits
        -> WHERE MATCH(name) AGAINST
        -> ('+apple +mango <pomegranate'
        -> IN BOOLEAN MODE);
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  3 | apple mango banana      |
    |  2 | apple mango pomegranate |
    +----+-------------------------+
    

    クエリ8:

    SELECT id, name FROM fruits
        -> WHERE MATCH(name) AGAINST
        -> ('+apple <pomegranate'
        -> IN BOOLEAN MODE);
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  1 | apple orange watermelon |
    |  3 | apple mango banana      |
    |  6 | apple banana kiwi       |
    |  2 | apple mango pomegranate |
    +----+-------------------------+
    

    クエリ9:

    SELECT id, name FROM fruits
        -> WHERE MATCH(name) AGAINST
        -> ('+mango <pomegranate'
        -> IN BOOLEAN MODE);
    +----+-------------------------+
    | id | name                    |
    +----+-------------------------+
    |  3 | apple mango banana      |
    |  5 | mango guava watermelon  |
    |  2 | apple mango pomegranate |
    |  4 | mango kiwi pomegranate  |
    +----+-------------------------+
    

    ここで、クエリ7、8、9 + 演算子は値の前にありますapple およびmango および< 演算子は値pomegranateの前にあります 。これにより、 pomegranateという単語が含まれる行が確実に表示されます。 他よりもランクが低くなっています。

    したがって、ここから推測できるのは、- if + 演算子が存在する場合は、<を使用してください の代わりに演算子 オペレーター

    更新

    徹底的に計算して、テーブル fruits_score_countを作成しました これはスコアを示しています 各fruit ブールフルテキスト検索が完了したら。

    SELECT * FROM fruits_score_count;
    +----+-------------+---------------------+----------------------+
    | id | fruit_name  | row_numbers_matched | score                |
    +----+-------------+---------------------+----------------------+
    |  1 | apple       |                   4 | 0.031008131802082062 |
    |  2 | banana      |                   2 |  0.22764469683170319 |
    |  3 | guava       |                   1 |   0.6055193543434143 |
    |  4 | kiwi        |                   2 |  0.22764469683170319 |
    |  5 | mango       |                   4 | 0.031008131802082062 |
    |  6 | orange      |                   1 |   0.6055193543434143 |
    |  7 | pomegranate |                   2 |  0.22764469683170319 |
    |  8 | watermelon  |                   2 |  0.22764469683170319 |
    +----+-------------+---------------------+----------------------+
    

    クエリ1:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('apple mango ~pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  3 | apple mango banana      | 0.062016263604164124 |
    |  1 | apple orange watermelon | 0.031008131802082062 |
    |  5 | mango guava watermelon  | 0.031008131802082062 |
    |  6 | apple banana kiwi       | 0.031008131802082062 |
    |  2 | apple mango pomegranate |  -0.7103390693664551 |
    |  4 | mango kiwi pomegranate  |  -0.7413471937179565 |
    +----+-------------------------+----------------------+
    

    クエリ2:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('apple ~pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  1 | apple orange watermelon | 0.031008131802082062 |
    |  3 | apple mango banana      | 0.031008131802082062 |
    |  6 | apple banana kiwi       | 0.031008131802082062 |
    |  2 | apple mango pomegranate |  -0.7413471937179565 |
    +----+-------------------------+----------------------+
    

    クエリ3:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('mango ~pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  3 | apple mango banana      | 0.031008131802082062 |
    |  5 | mango guava watermelon  | 0.031008131802082062 |
    |  2 | apple mango pomegranate |  -0.7413471937179565 |
    |  4 | mango kiwi pomegranate  |  -0.7413471937179565 |
    +----+-------------------------+----------------------+
    

    クエリ4:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('+apple +mango ~pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  2 | apple mango pomegranate | 0.062016263604164124 |
    |  3 | apple mango banana      | 0.062016263604164124 |
    +----+-------------------------+----------------------+
    

    クエリ5:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('+apple ~pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  1 | apple orange watermelon | 0.031008131802082062 |
    |  2 | apple mango pomegranate | 0.031008131802082062 |
    |  3 | apple mango banana      | 0.031008131802082062 |
    |  6 | apple banana kiwi       | 0.031008131802082062 |
    +----+-------------------------+----------------------+
    

    クエリ6:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('+mango ~pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  2 | apple mango pomegranate | 0.031008131802082062 |
    |  3 | apple mango banana      | 0.031008131802082062 |
    |  4 | mango kiwi pomegranate  | 0.031008131802082062 |
    |  5 | mango guava watermelon  | 0.031008131802082062 |
    +----+-------------------------+----------------------+
    

    クエリ7:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('+apple +mango <pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  3 | apple mango banana      | 0.062016263604164124 |
    |  2 | apple mango pomegranate |  -0.7103390693664551 |
    +----+-------------------------+----------------------+
    

    クエリ8:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('+apple <pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  1 | apple orange watermelon | 0.031008131802082062 |
    |  3 | apple mango banana      | 0.031008131802082062 |
    |  6 | apple banana kiwi       | 0.031008131802082062 |
    |  2 | apple mango pomegranate |  -0.7413471937179565 |
    +----+-------------------------+----------------------+
    

    クエリ9:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('+mango <pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  3 | apple mango banana      | 0.031008131802082062 |
    |  5 | mango guava watermelon  | 0.031008131802082062 |
    |  2 | apple mango pomegranate |  -0.7413471937179565 |
    |  4 | mango kiwi pomegranate  |  -0.7413471937179565 |
    +----+-------------------------+----------------------+
    

    ここで、クエリ1、クエリ2、クエリ3、クエリ7、クエリ8、クエリ9は期待どおりに動作します。

    しかし、クエリ4、クエリ5、クエリ6から、-

    +が存在する場合 値の前にを付ける演算子 演算子は基本的に値を非表示にします。

    また、注意深く観察すると、-

    x〜y および+x 同等です

    さらなる実験

    クエリ1:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('+mango apple ~pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  3 | apple mango banana      | 0.062016263604164124 |
    |  4 | mango kiwi pomegranate  | 0.031008131802082062 |
    |  5 | mango guava watermelon  | 0.031008131802082062 |
    |  2 | apple mango pomegranate |  -0.7103390693664551 |
    +----+-------------------------+----------------------+
    
    • id =3の行1 mangoのスコアの合計である最大スコアを取得します およびapple
    • id =4の行2 mangoのスコアである2番目に高いスコアを取得します 。 +の存在 mangoの前の演算子 〜pomegranateを作成します 無関係な検索フレーズの。
    • id =5の行3 行2と同じスコアを取得しますが、スコアが同じ場合、行は主キーの昇順でランク付けされるため、行2よりも低く配置されます。 、ここ id 主キーです 。
    • id =2の4行目 スコアが最も低く、最後になります。ここにappleという単語があるので が存在し、検索フレーズに +がありません appleの前にある演算子 、したがって〜pomegranate 検索フレーズ内が考慮されるため、スコアが大幅に低下します。

    クエリ2:

    SELECT id, name, score FROM
        -> (SELECT id, name, MATCH(name) AGAINST
        -> ('+mango apple <pomegranate' IN BOOLEAN MODE)
        -> AS score FROM fruits ORDER BY score DESC)
        -> AS temp WHERE score != 0;
    +----+-------------------------+----------------------+
    | id | name                    | score                |
    +----+-------------------------+----------------------+
    |  3 | apple mango banana      | 0.062016263604164124 |
    |  5 | mango guava watermelon  | 0.031008131802082062 |
    |  2 | apple mango pomegranate |  -0.7103390693664551 |
    |  4 | mango kiwi pomegranate  |  -0.7413471937179565 |
    +----+-------------------------+----------------------+
    

    これも、<であることを示しています。 演算子は、 +が存在する場合でも有効になります オペレーター。

    これは、私の以前の観察をさらに補強します-

    +の場合 演算子が存在する場合は、<を使用してください の代わりに演算子 オペレーター




    1. セッションをカウントしてオンラインの人数を確認できますか?

    2. ワイドテーブルmysql

    3. mysqlにutf-8mb4文字(ios5の絵文字)を挿入するにはどうすればよいですか?

    4. MySQLにUTF-8を適切に処理させる方法