高見 直輝
takam****@orega*****
2016年 1月 18日 (月) 11:49:56 JST
高見です。
> > これに前方一致条件を加えた
> > 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"');
>
> で同じ挙動になるんじゃないかと思います。
残念ながら、改善しませんでした。
どうも、LIKE指定が在ると無条件で結果が0件になって居るような感じです。
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"');
の結果が0件で、
select lower(pathcombine(rootdir::text, path)) as tmp from TEST_TABLE
where
lower(pathcombine(rootdir,path)) %% lower('\st\新しいフォルダー\フォルダ') AND
lower(pathcombine(rootdir,path)) @@ lower('"30"');
では結果が返ってきました。
一つ確認なのですが、1.0.1を適用することで状況が改善する可能性はあります
でしょうか?
現在1.0.0で動かしています。
-----------------------------
高見 直輝 <takam****@orega*****>
株式会社オレガ
TEL:03-3267-0150
FAX:03-3267-0180