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

Back to archive index

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


おっと…。

> [Q2]たとえば、
> 「中国の外国」や「中国人と外国」を含むものだけをヒットさせるようなことは
> 可能でしょうか?

順番の指定は難しかった記憶があります。
ぱっと思い付く感じだと、

MATCH(..) AGAINST ('*D+ 中国 外国' IN BOOLEAN MODE) AND .. LIKE '%中国%外国%'

とか思い浮かびました。

フルテキストで十分行数が絞り込めれば、LIKEでなんとか順番を指定して誤魔化せないかなぁとか思いましたが、
これだとスニペットがつらそうですね。。


yoku0825,



2014年8月11日 17:11 yoku ts. <yoku0****@gmail*****>:

> こんにちは、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