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件のフィードバック