[groonga-dev,02597] Re: [mroonga] asterisk wildcard operator

Back to archive index

yoku ts. yoku0****@gmail*****
2014年 8月 11日 (月) 17:11:44 JST


こんにちは、yoku0825といいます。

> SELECT title, MATCH (title) AGAINST('中国*外国' IN BOOLEAN MODE) AS score
> FROM books;

少なくともMySQLのレイヤーで、
これは「中国(任意の文字列)外国」を表すクエリーではありません。
アスタリスクが使えるのは前方一致検索のみで、
'中国*'であれば、「中国の」を表すことはできますが、間に挟むことはできません。

http://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html


よって'中国*外国'が1件も結果を返さないために、
マッチエスカレーションが発生しているんじゃないでしょうか。

http://mroonga.org/ja/docs/reference/server_variables.html

http://groonga.org/docs/spec/search.html


トークナイズ方法がわからないので推測ですが、
「中国の人口」が /中国/の/人口/ のようにトークナイズされている場合、
'中国*'は/中国/の部分にマッチするので、'中国'と'中国*'は同じ結果を返すと思います。
たとえば「中国地方」や「中国大陸」が
/中国地方/や/中国大陸/として1トークンに収まっていれば、
2つのクエリーは違った結果セットを返すのではないでしょうか。


[Q3]はmroonga_snippetで可能です。

mysql56> SHOW CREATE TABLE snippet_test\G
*************************** 1. row ***************************
       Table: snippet_test
Create Table: CREATE TABLE `snippet_test` (
  `id` int(11) NOT NULL,
  `text` text,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `text` (`text`) COMMENT 'parser
"TokenBigramSplitSymbolAlphaDigit"'
) ENGINE=mroonga DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql56> SELECT * FROM snippet_test;
+----+-------------------------------------------------------------------------------------------------+
| id | text
                           |
+----+-------------------------------------------------------------------------------------------------+
|  1 | An open-source fulltext search engine and column store.
                            |
|  2 | An open-source storage engine for fast fulltext search with MySQL.
                           |
|  3 | Tritonn is a patched version of MySQL that supports better fulltext
search function with Senna. |
+----+-------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

mysql56> SELECT id, text, mroonga_snippet(text, 8, 1, 'ascii_general_ci',
1, 1, '', '', 'fulltext', '', '') FROM snippet_test WHERE MATCH(text)
AGAINST ('full*');
+----+-------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
| id | text
                           | mroonga_snippet(text, 8, 1,
'ascii_general_ci', 1, 1, '', '', 'fulltext', '', '') |
+----+-------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
|  1 | An open-source fulltext search engine and column store.
                            | fulltext
                                     |
|  2 | An open-source storage engine for fast fulltext search with MySQL.
                           | fulltext
                                   |
|  3 | Tritonn is a patched version of MySQL that supports better fulltext
search function with Senna. | fulltext
                                     |
+----+-------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
3 rows in set (0.01 sec)


どうでしょうか?


yoku0825,











2014年8月11日 14:48 warp kawada <warp.****@gmail*****>:

> 河田です。
>
> いつも、お世話になっております。質問です。
> 「*」が使えるらしいので、適当なfulltext dbにてクエリを試してみました。
>
> SELECT title, MATCH (title) AGAINST('中国*' IN BOOLEAN MODE) AS score FROM
> books;
>
> の結果と、
>
> SELECT title, MATCH (title) AGAINST('中国' IN BOOLEAN MODE) AS score FROM
> books;
>
> は同じでした。
>
>
> SELECT title, MATCH (title) AGAINST('中国*外国' IN BOOLEAN MODE) AS score
> FROM books;
>
> とすると、
>
> SELECT title, MATCH (title) AGAINST('*DOR 中国 外国' IN BOOLEAN MODE) AS
> score FROM books;
>
> と同じみたいです。
> [Q1]これで正しい動きでしょうか?
>
> [Q2]たとえば、
> 「中国の外国」や「中国人と外国」を含むものだけをヒットさせるようなことは
> 可能でしょうか?
>
> [Q3]ヒットした「*」を含む文字列を取得することは可能でしょうか?
> たとえば[Q2]が'中国*外国'のように出来たとすると、「中国人と外国」の文字列を
> 取得するということです。
>
> 以上、よろしくお願いします。
>
> --
> ===
> Yukihiro KAWADA
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>



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