まちBBS の スレッドリストをElasticsearch に突っ込んでみる

Elasticsearch をDockerで動かしてみたんですが、データを入れないと
全然面白くなくてつまらないですね。

せっかくなので大量のデータを流し込んでみたいっ!
というわけで 差しあたってデータ量の多そうな 掲示板のデータを突っ込んでみることにしました。

全文検索を行うためのプラグインを導入します
以下のページを参考に kuromoji を入れます。
http://qiita.com/mserizawa/items/8335d39cacb87f12b678

簡単。

■まちBBS のスレッドリストを取得します。
Python で まちBBS のスレッドリストJSONで取得してみました。

python を実行する環境ももちろんDockerで用意します

docker run -dP --name pyhost moremagic/ubuntu-sshd

ssh -p <フォワードされた22ポート> root@localhost
apt-get update && apt-get upgrade -y && apt-get install -y python curl wget vim

上記環境でスクリプトを作ります。
Python 2.7.9 で作っています。
JSON 構造は適当。

subback-get.py

#!/usr/bin/python
# coding: UTF-8

import contextlib
import urllib2
import sys

reload(sys)
sys.setdefaultencoding('utf-8')

def getSubBack(url):
    ret = ''
    with contextlib.closing(urllib2.urlopen(url)) as resp:
        html = resp.read()

    for line in html.split('\n'):
        if line.strip().startswith('<a href='):
            link = line[line.index('="')+2:line.rindex('"')]
            title = line[line.index('>')+1:line.rindex('<')]
            ret += '{"index": {} }\n{ "name": "' + title + '", "link":"http://machi.to/bbs/read.cgi/' + url[url.index('to/')+3: url.rindex('/')] + '/' + link + '"}\n'
    return ret


# 参考; http://qiita.com/zarchis/items/3258562ebc9570fa05a3
def conv_encoding(data):
    lookup = ('utf_8', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213',
            'shift_jis', 'shift_jis_2004','shift_jisx0213',
            'iso2022jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_3',
            'iso2022_jp_ext','latin_1', 'ascii')
    encode = None
    for encoding in lookup:
      try:
        data = data.decode(encoding)
        encode = encoding
        break
      except:
        pass
    if isinstance(data, unicode):
        return data,encode
    else:
        raise LookupErrorconv_encoding


url = 'http://machi.to/@@@/subback.html'
locale = ['hokkaidou', 'tohoku', 'kousinetu', 'kanto', 'tokyo', 'tama', 'kana', 'tokai', 'kinki', 'osaka', 'cyugoku', 'sikoku', 'kyusyu', 'okinawa' ]

for l in locale:
    #print url.replace('@@@', l)
    #print conv_encoding(ret)[1]
    ret =  getSubBack( url.replace('@@@', l ) )
    print ret.decode( conv_encoding(ret)[1] ).encode('utf-8')

UTF-8JSONが取得できます。

■Elasticsearch に突っ込んでみます
先ほど作った Docker Elasticsearchに JSONデータを突っ込みます。

python ./subback-get.py > subback.json
curl -X POST http://192.168.1.6:9201/machibbs/subback/_bulk --data-binary @subback.json

■Elasticsearch を確認してみます。


おぉぉぉ!入ってますね!