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
>