トモロログ

仕事や趣味でのメモや記録など

insert ignore 〜の問題

insert ignore 〜 の構文でインサートしたときには重複行がある場合にはインサートを実行しないのだがちょっと問題点が。。

 

プライマリキー(たとえば id) をauto_increment で設定していて かつ それ以外のカラムにUNIQUE KEYを設定している場合に問題があるよう。 insert ignore 〜でインサートが実行されないときにもauto_incrementが実行されるのでプライマリキーにギャップ(空番)が出てしまい、現状存在するプライマリキーの番号とシーケンスの番号の差異が一定以上(たしか10000)になるとエラーになってしまう。

 

これはmysql5.1.22 のinnoDBの仕様らしく設定を変えるしかないので断念。。

バルクインサートで便利かと思ったのだが、1データずつ存在チェック+インサートしかなさそう。パフォーマンスはわるそうだが仕方ないかな。。

整理標準化データの追加

整理標準化データはデータの更新があったときに該当する公報のマスタデータが

配布される形式になっている。

 

たとえばある出願 2000-123XXX にIPCの更新があったときにはそれについてのすべての整理標準化データの出願マスタ1レコード分が配信される。つまり更新があるときには全カラム更新となるのでdelete, insertの方が処理が楽なのかもしれない。

 

その場合最新の情報が正となるのでデータ作成の時には 旧->新の場合と 新->旧の場合の処理が異なる。新たなデータの挿入の際にユニークキー(四法+出願番号)が重複するとき、旧->新の時は delete , insert  、 新->旧の時は単に無視となる。

 

そんなときの insert の構文

 

旧->新:delete + insert

   
   replace into 〜

 

 ユニークキーに重複があればdelete + insert,  なければ insert 

ただし、id などのカラムは書き換えてしまう。

 

新->旧:無視

   
   insert ignore into 〜

 

 ユニークキーに重複があればなにもしない。  なければ insert 

 

 ちなみに整理標準化データの出願マスタはDVD一回配布分だけで10万件分ある。。

 全回分処理したら何件になるのだろうか。。。

mysql 日本語全文検索 入門

Oracle 山崎氏作成のこの資料を見ればとりあえず始められた。

とってもありがたいです。何度も見ようっと。下記に引用させていただきます。

 

www.slideshare.net

 

www.slideshare.net

 

www.slideshare.net

 

 

full text search の構文

mysql全文検索の構文

 


 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を含まない

 

 ランクというのは検索結果にスコアがつくのでそのスコアの重みということ。

 ランクの計算方法、重み付けについても先のリンクにあるので参考にしたい。

 あとここも参考になった 

MySQLで全文検索 - FULLTEXTインデックスの基礎知識|blog|たたみラボ

全文検索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のヘッダのエンコーディングの記載を書き換えてやったらうまくいった。

 

 とりあえず最初の一歩はクリア。

やってみよう

最近プログラミングを趣味として再開してふと特許データベースを自分で作れないかと思いついた。
 
フルスケールでできるのか、速度はそもそも完成するのかなど?な点は多いがとりあえずここをメモ代わりにしながら進めてみることに。
だれかの参考になればと思うし、もし協力したいという稀有の方がいらしたら是非連絡ください。
 
ただ数年前から考えると環境は大きく変わり、コスト面やハード・ソフト面からみてもかなり現実的になっているとは思う。
 
■特許データ
 一昔前はDVDを購入してとかなりの費用と手間がかかったのが、現状ではダウンロードサービスにより無償で入手できる。
 
 私は人づてでたどりついたのだが、google で「特許庁 ダウンロード データ」としてもいまいち情報があまりない。。(たどり着けなかった方は
 
 特許庁情報室までお問い合わせください。私に聞いてもらってもよいですが、紹介するだけです・・)
 
 ただし利用についての目的や計画について説明する必要があるのでただほしいだけという人はもらえなさそう。
 
 
 データベース・webサーバーもハードウェアを用意することなくクラウド上に構築できるようになっているので割と気が楽。
 導入コストは格段に下がってはいるがある程度のランニングコストは必要ではある。
 
■構成
 単なる現状での妄想ではあるが以下の構成で進めてみる
 
  データベース: MySQL + 全文検索システム(調査中)
 サーバー: google cloud
 
いまのところの疑問としては 既データベースがあれだけ膨大なデータをどうやってキーワード検索しているのかということ。
多分キーワードインデックスを作成しているとは思うのだが中身を知る由はない。
 
一応今のところ目をつけているのはGroonga, Mroonga
 
まあとにかくコツコツとやってみます。