Quantcast
Channel: Mattermost Discussion Forums - Latest posts
Viewing all articles
Browse latest Browse all 25517

MySQL and Postgres to support Japanese search

$
0
0

こんばんは!よろしくお願いします。

pg_bigmの方はMattermost本体のSQLをts_queryの方式から普通のLike検索にしないといけない?

現状のクエリから注目すべきWHERE句だけ抜き出して簡単化すると、次のようなSELECT文になるかと思います。

SELECT MESSAGE FROM POSTS WHERE MESSAGE @@ to_tsquery('検索語');

これは、下記引用部の説明により、次のSELECT文と等価です。

SELECT MESSAGE FROM POSTS WHERE to_tsvector(MESSAGE) @@ to_tsquery('検索語');

PostgreSQL9.5.1文書 12.1.2. 基本的なテキスト照合:

@@演算子は、textを入力として受付けるので、簡単に使うときには、明示的にテキスト文字列をtsvectorまたはtsqueryに変換することを省略できます。
[中略]
text @@ tsqueryという形式は、to_tsvector(x) @@ yと同じです。

そしてこのSELECT文は、次の説明にある通りindexが使用されません。

PostgreSQL9.5.1文書 12.2.2. インデックスの作成:

[前略]上記のインデックスでは、2引数バージョンのto_tsvectorが使われているので、同じ設定名の2引数バージョンのto_tsvectorを使う問合わせ参照だけがそのインデックスを使います。すなわち、WHERE to_tsvector('english', body) @@ 'a & b'はインデックスが使えますが、WHERE to_tsvector(body) @@ 'a & b'は使えません。これにより、インデックスエントリを作ったときの設定と、同じ設定のときだけインデックスが使われることが保証されます。

今回使用しようとしているindex idx_posts_message_txt'english'指定で作成されているため、to_tsvector第1引数に同じ'english'を明示することで、Index Scanが行えるようになります。

 SELECT MESSAGE FROM POSTS WHERE to_tsvector('english', MESSAGE) @@ to_tsquery('検索語');

英文検索のみを考えた場合、これでindexが使用され想定通りの動作になると思われます。
ただ、私がやりたいことは日本語検索なので、index作成のところのように'english'決め打ちされると困るなあ、むしろto_tsvector'english'決め打ちされてしまうと、現状textsearch_jadefault_text_search_config設定で実現できている Seq Scan方式すらできなくなってしまうなあ…というのが Issue #2622 の最後で言いたかったことになります。

'english'決め打ちではなく、予めどこかで設定しておいた値を参照するような修正であれば、英語以外の言語でも利用可能になるのではと考えます。

(すみません、文中もうちょっとちゃんと引用先リンクを貼りたかったのですが、新人は2リンクしか駄目なようで…)


Viewing all articles
Browse latest Browse all 25517

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>