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