WikipediaをElasticsearchに取り込むの続き。
いろいろと試していくためには、Elasticsearchに取り込んだWikipediaのデータにアクセスできるようになる必要がある。Elasticsearchで全データにアクセスするためには、ScrollScanでアクセスする。
というわけで、今回はPythonで全データにアクセスしてみる。
事前にpip install ElasticsearchなどでPythonモジュールを利用可能な状況にしておく必要があるが、以下のような.pyを作成する。
# coding: utf-8
from optparse import OptionParser
import sys
from elasticsearch import Elasticsearch
import json
from elasticsearch.exceptions import NotFoundError
def main(argv=sys.argv):
parser = OptionParser(prog="main.py")
parser.add_option("--elasticsearch", dest="elasticsearch",
help="Elasticsearch", metavar="ES",
default="localhost:9200")
parser.add_option("--index", dest="index",
help="Index", metavar="INDEX",
default="_all")
parser.add_option("--source", dest="source",
help="Source", metavar="SOURCE",
default="{\"query\":{\"match_all\":{}}}")
(options, args) = parser.parse_args()
source = json.loads(options.source)
es = Elasticsearch(hosts=options.elasticsearch)
response = es.search(index=options.index,
scroll='1m',
search_type='scan',
size=100,
body=source)
scroll_id = response['_scroll_id']
counter = 0
while (True):
try:
response = es.scroll(scroll_id=scroll_id, scroll='1m')
if len(response['hits']['hits']) == 0:
break
for hit in response['hits']['hits']:
counter = counter + 1
if "_source" in hit:
if "title" in hit['_source']:
print hit['_source']['title']
except NotFoundError:
print u"Finished ({0}) documents.".format(counter)
break
except:
print u"Unexpected error: {0}".format(sys.exc_info()[0])
break
return 0
if __name__ == "__main__":
sys.exit(main())
上記の例ではスクロールで_sourceのtitleデータを出力している。
NotFoundErrorのエラーで止めるのも微妙だけど、何か良い方法があるのかしら…。
実行は
$ python title.py --index jawiki-pages-articles
という感じで実行すれば、タイトルが出力されていく。
というわけで、そのあたりのコードをいじればいろいろできる感じかな。
「Wikipediaのデータをスクロールスキャンする」への1件のフィードバック