mysql 日本語全文検索 入門
full text search の構文
select * from テーブル名 where match(カラム名) against('キーワード' in boolean mode)
'in boolean mode' は論理演算ができるモードらしい。あとこれを入れてないとなんか
曖昧な検索結果になってしまう。
boolean mode は上記の式のキーワード部分に以下を指定可能
- + AND演算
- ー NOT
- なにもなし OR演算
- @数字 近接演算 (ただしinnoDBのみ)
などなど 詳細はこちら
キーワード部分の例
'apple banana' どちらかのキーワード
'+apple +banana' 両方含む
'+apple machintosh' appleを含むものだが、machintoshを含む方がランク上
'+apple -machintosh' appleを含み、machintoshを含まない
ランクというのは検索結果にスコアがつくのでそのスコアの重みということ。
ランクの計算方法、重み付けについても先のリンクにあるので参考にしたい。
あとここも参考になった
全文検索DB
先日 mroongaのセミナ
Groonga - 「MySQLとPostgreSQLと日本語全文検索3」開催のお知らせ
に参加。ここで知ったのがmysql5.7からmysqlでもインデックスを使った全文検索
が可能ということ。そして google cloud sql の2nd のバージョンが5.7になっていた。
とりあえず公報データを投入して試したら検索できた。ただ気になるのは以下。
- mecabのトークナイザは使えなさそう(mysql では使えるけどgoogleでは使えないという意味で)。インストールできないしね。基本はbi-gram
- innoDB エンジンだとmroongaに比べると遅い。トランザクションはいらないので高速であればよいのだが。
- mroongaは他テーブルの参照にベクターカラムを持てるのだがそれは使えない。この機能は便利そうなのだが。詳しくはこちら
とはいえ、google cloud sql が使えたらサーバー設定も管理も楽なので速度さえでればというところ。まずは数万件データを入れてから速度を見てみようかなと。無駄にならなければよいが。。
整理標準化データの文字コード
特許庁からもらった xml ファイルの文字コードはeuc-jp、
こちらの環境はmac , python(2.7) でうまく処理できない。
原因はxml処理ライブラリがeuc-jpを処理しないことにあった。
以下の方法で解決。効率よいのかはわからんけど。
import xml.etree.ElementTree as ET
import codecs
xmlstr = ""
for line in f:
xmlstr += line.encode('utf-8')
xmlstr = xml_string.replace("encoding=\"EUC-JP\"", "encoding=\"utf-8\"")
tree = ET.fromstring(xmlstr)
ファイルを読み込んでラインごとに文字コード変換。それだけではだめで、
xmlのヘッダのエンコーディングの記載を書き換えてやったらうまくいった。
とりあえず最初の一歩はクリア。