Naoya Murakami
visio****@gmail*****
2014年 1月 17日 (金) 13:38:25 JST
お世話になっております。村上です。
先日、twitterでスニペットAPIのNormalizerAuto以外の適用について、林さんに反応していただきましたが、
Groongaのスニペットにまつわるさらなる要望です。
(要望なので、もしできたら、すごく嬉しいなぁという話です。)
現状、複数のカラムがある場合に、スニペット対象のカラムに対する検索クエリだけでなく、
スニペット対象のカラム以外に対する検索クエリでもスニペットが取得されてしまいます。
たとえば、以下のようなテーブルがあったとして、titleカラムに対して、検索クエリ「database」
で検索し、且つ、tagsカラム(ベクター)に対して、検索クエリ「sql」で検索し、titleカラムの
出力結果に対して、スニペットを取得すると、両検索クエリでスニペットが取得されます。
・テーブル
+----+----------------------+------------------------+
| id | tags | title |
+----+----------------------+------------------------+
| 1 | sql database | mysql is fast database |
| 2 | database performence | mysql performence |
+----+----------------------+------------------------+
・検索クエリ
select Title --match_columns title --output_columns "snippet_html(title)"
--command_version 2 --query "database tags:@sql"
・スニペット結果
"my<span class=\"keyword\">sql</span> is fast <span
class=\"keyword\">database</span>"
この例では、「database」も含まれているのでさほど問題ないですが、titleカラムの後半にしか
「database」が含まれておらず、titleカラムの前半に「sql」が含まれていると、
検索対象の「database」が一つも含まれていないスニペットが取得されてしまいます。
望ましくは、スニペット関数に指定したtitleカラムに対する検索クエリでのみ、
スニペットが取得できるようになると、すごくうれしいです。
なお、この他、近傍検索でスニペットが効かないといった問題もかかえていますが、
近傍検索はメインの機能でないのでそこは別に仕方ないかなぁと思ったりしてます。
・再現SQL
(この問題はMroongaは関係ないですが、Groongaでテーブル定義するのは慣れておらず、ぱっと思いつかなかったので。。)
CREATE TABLE Tags (
name VARCHAR(64) PRIMARY KEY
) ENGINE=mroonga DEFAULT CHARSET=utf8
COLLATE=utf8_bin
COMMENT='default_tokenizer "TokenDelimit"';
CREATE TABLE Title (
id INT UNSIGNED PRIMARY KEY,
tags VARCHAR(40) COMMENT 'type "Tags", flags "COLUMN_VECTOR"',
title TEXT,
FULLTEXT INDEX title_tags_index (tags) COMMENT 'table "Tags"',
FULLTEXT INDEX fullt(title)
) ENGINE=mroonga DEFAULT CHARSET=utf8;
INSERT INTO Title VALUES (1,"sql database","mysql is fast
database"),(2,"database performence","mysql performence");
SELECT mroonga_command('select Title --match_columns title --output_columns
"snippet_html(title)" --command_version 2 --query "database tags:@sql"');
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| mroonga_command('select Title --match_columns title --output_columns
"snippet_html(title)" --command_version 2 --query "database tags:@sql"') |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| [[[1],[["snippet_html","null"]],[["my<span class=\"keyword\">sql</span>
is fast <span class=\"keyword\">database</span>"]]]] |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
以上、よろしくお願いします。