[groonga-dev,02858] Re: BOOLEAN MODEの+とか-の意味

Back to archive index

Kouhei Sutou kou****@clear*****
2014年 10月 24日 (金) 12:35:42 JST


あ、コピペで動く再現SQLをつけてくれてとても助かりました!
ありがとうございます!

In <5448E****@fdiar*****>
  "[groonga-dev,02854] BOOLEAN MODEの+とか-の意味" on Thu, 23 Oct 2014 13:22:08 +0200,
  Kazuhiko <kazuh****@fdiar*****> wrote:

> こんにちは、かずひこです。
> 
> ドキュメントを書こうとしながら、まだあれこれクエリを試していて気になった
> ので質問します。
> 
> Modifier	Description
> +	A leading plus sign indicates that this word must be present in each
> row that is returned.
> -	A leading minus sign indicates that this word must not be present in
> any of the rows that are returned.
> 
> とありますが、以下の例では+で指定した語がないものもスコアがnon zeroな値
> になります(つまり、WHEREで用いた時にマッチしてしまう)。
> 
> DROP TABLE IF EXISTS books;
> 
> CREATE TABLE books (
>   `id` INTEGER AUTO_INCREMENT,
>   `title` text,
>   PRIMARY KEY(`id`),
>   FULLTEXT INDEX title_index (title)
> ) ENGINE=mroonga default charset utf8;
> 
> INSERT INTO books (title) VALUES (
>   'Quick brown fox jumps over the lazy dog.'
> );
> 
> INSERT INTO books (title) VALUES (
>   'Slow white fox jumps over the diligent dog.'
> );
> 
> SELECT title, MATCH (title) AGAINST('+quick fox dog' IN BOOLEAN MODE) AS
> score FROM books;
> +---------------------------------------------+-------+
> | title                                       | score |
> +---------------------------------------------+-------+
> | Quick brown fox jumps over the lazy dog.    |     3 |
> | Slow white fox jumps over the diligent dog. |     2 |
> +---------------------------------------------+-------+
> 2 rows in set (0.00 sec)
> 
> クエリの+wordの順序を変えると、スコアが微妙に変化します。
> 
> SELECT title, MATCH (title) AGAINST('fox +quick dog' IN BOOLEAN MODE) AS
> score FROM books;
> +---------------------------------------------+-------+
> | title                                       | score |
> +---------------------------------------------+-------+
> | Quick brown fox jumps over the lazy dog.    |     3 |
> | Slow white fox jumps over the diligent dog. |     1 |
> +---------------------------------------------+-------+
> 2 rows in set (0.00 sec)
> 
> SELECT title, MATCH (title) AGAINST('fox dog +quick' IN BOOLEAN MODE) AS
> score FROM books;
> +---------------------------------------------+-------+
> | title                                       | score |
> +---------------------------------------------+-------+
> | Quick brown fox jumps over the lazy dog.    |     3 |
> | Slow white fox jumps over the diligent dog. |     0 |
> +---------------------------------------------+-------+
> 2 rows in set (0.01 sec)
> 
> このように、+wordを指定しても、「wordが無いものも含まれることがある」よ
> うです。ちなみに、MyISAMだと、上記の三通りとも同じ結果で、
> 
> +---------------------------------------------+-------+
> | title                                       | score |
> +---------------------------------------------+-------+
> | Quick brown fox jumps over the lazy dog.    |     1 |
> | Slow white fox jumps over the diligent dog. |     0 |
> +---------------------------------------------+-------+
> 2 rows in set (0.00 sec)
> 
> になりました。
> 
> また、-wordの場合も同様に、「wordがある結果が必ず除外されるわけではな
> い」ようです。
> 
> SELECT title, MATCH (title) AGAINST('fox dog -quick' IN BOOLEAN MODE) AS
> score FROM books;
> +---------------------------------------------+-------+
> | title                                       | score |
> +---------------------------------------------+-------+
> | Quick brown fox jumps over the lazy dog.    |     0 |
> | Slow white fox jumps over the diligent dog. |     2 |
> +---------------------------------------------+-------+
> 2 rows in set (0.00 sec)
> 
> SELECT title, MATCH (title) AGAINST('fox -quick dog' IN BOOLEAN MODE) AS
> score FROM books;
> +---------------------------------------------+-------+
> | title                                       | score |
> +---------------------------------------------+-------+
> | Quick brown fox jumps over the lazy dog.    |     1 |
> | Slow white fox jumps over the diligent dog. |     2 |
> +---------------------------------------------+-------+
> 2 rows in set (0.03 sec)
> 
> SELECT title, MATCH (title) AGAINST('-quick fox dog' IN BOOLEAN MODE) AS
> score FROM books;
> +---------------------------------------------+-------+
> | title                                       | score |
> +---------------------------------------------+-------+
> | Quick brown fox jumps over the lazy dog.    |     2 |
> | Slow white fox jumps over the diligent dog. |     3 |
> +---------------------------------------------+-------+
> 2 rows in set (0.01 sec)
> 
> 環境はMariaDB 10.0.14, Groonga 4.0.6, Mroonga 4.06です。
> 
> 現状の仕様は、検索語を前から順にスコアを足しながら、+や-が来た時点で、そ
> れを満たさないレコードのスコアがゼロになって、それ以降はまた順にスコアを
> 足していく、みたいな感じの挙動に見えます。
> boolean modeと言うからには、+や-は、ドキュメントにも書いてあるように、
> 「絶対に含まれる」「絶対に含まれない」を意味するのが妥当と思いますが、い
> かがでしょうか。
> 
> かずひこ
> 
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev




groonga-dev メーリングリストの案内
Back to archive index