[groonga-dev,03856] Re: PGROONGAの@@コマンドでの前方一致検索

Back to archive index

Kouhei Sutou kou****@clear*****
2016年 1月 17日 (日) 19:24:16 JST


須藤です。

In <20160****@orega*****>
  "[groonga-dev,03855] PGROONGAの@@コマンドでの前方一致検索" on Fri, 15 Jan 2016 16:37:34 +0900,
  高見 直輝 <takam****@orega*****> wrote:

> これに前方一致条件を加えた
> select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE where 
>  lower(pathcombine(rootdir,path)) @@ lower('"\\st\\新しいフォルダー\\フォルダ"*+"30"')
> を実行したところ、今度はレコードが1件もヒットしませんでした。
> 
> これは@@の構文が間違っているのでしょうか?
> それとも、関数を使用したインデックスでは前方一致に対応していないのでしょうか?

どちらも違っていて、

  「"XXX"*」というのは「XXX」から始まるトークンがあれば真と
  いう条件だから

が理由になります。

今回の例だと

  \st\新しいフォルダー\フォルダ

から始まるトークンがあれば真、ということです。

今回の例のインデックスではトークナイザーとして
TokenBigramSplitSymbolAlphaDigitを使っているので、トークンは

  \s
  st
  t\
  \新
  ...

のようになっています。つまり、

  \st\新しいフォルダー\フォルダ

から始まるトークンはありません。よって、ヒットしないのは意図
通りの挙動です。


ただ、近い将来、キーワードがどこにマッチしたかを指定できる機
能を実装する予定で、それを使えば「"..."*」を

  「\st\新しいフォルダー\フォルダ」というフレーズが含まれて
  いて、それが先頭にマッチしている

という条件とみなすように解釈できるようにすることができます。
(ただし、互換性が壊れるので実際にこうするかどうかはちゃんと
検討する必要があります。)


現時点での代替案ですが、

select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE
 where
   lower(pathcombine(rootdir,path)) LIKE lower('\st\新しいフォルダー\フォルダ%') AND
   lower(pathcombine(rootdir,path)) @@ lower('"30"');

で同じ挙動になるんじゃないかと思います。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
リーダブルコードワークショップ:
  http://www.clear-code.com/services/code-reader/readable-code-workshop.html




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