Python Elasticsearchモジュールの使用

6860 ワード

参考URL:https://es.xiaoleilu.com/054_Query_DSL/70_Important_clauses.html http://www.cnblogs.com/letong/p/4749234.html
背景
最近ある種類のログが毎日数十万を発見して、しかし数百条の紛失があって、原因を探すため、まずデータの対比を得なければならなくて、そこで、ESの中のデータを導いてライブラリの中で原始のデータと対比して、下の小さいプログラムがあって、主に関心を持ついくつかの点は(Elasticsearchモジュールを採用します):
  • ページめくりの問題は、ES自体がクエリーを制限するのは1 w行しかないため、デフォルト値を変更し、一方的に向上すれば、ES自体の性能に大きな影響を及ぼす可能性があります.
  • クエリー構文問題(文章の冒頭の2つの共有urlを参照)
  • ここでライブラリに挿入したり、何かを修正したりすると、いっそファイルに入れるだけで、コードは以下の通りです.
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    # auther : xiaojinsong([email protected])
    
    from elasticsearch import Elasticsearch
    import logging
    import sys
    
    
    class Myesapi():
        def __init__(self, index={}, body={}, doc_type='doc'):
            self.clus_es = ['xxxxxx:9200', 'xxxxxx:9200', 'xxxxxx:9200']
            self.body = body
            self.doc_type = doc_type
            self.index = index
    
        def search(self, scroll='2m'):
            es = Elasticsearch(self.clus_es)
            if self.index:
                try:
                    resp = es.search(index=self.index, doc_type=self.doc_type, body=self.body, scroll=scroll,
                                        size=500)
                    # scroll_id = resp['_scroll_id']
                    resp_docs = resp["hits"]["hits"]
                    total = resp["hits"]["total"]
                    count = len(resp_docs)
                    result = resp_docs
                    while len(resp_docs) > 0:
                        scroll_id = resp['_scroll_id']
                        resp = es.scroll(scroll_id=scroll_id, scroll=scroll)
                        resp_docs = resp["hits"]["hits"]
                        result.extend(resp_docs)
                        count += len(resp_docs)
                        if count >= total:
                            break
                    return result
                except Exception as msg:
                    logging.info(msg)
            else:
                msg = 'you must ensure the correct index'
                sys.exit(1) and logging.info(msg)
    
        def delete_index(self):
            # es = Elasticsearch(self.clus_es)
            pass
    
    def useage():
        pass
    
    
    def main():
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
            datefmt='%a, %d %b %Y %H:%M:%S',
            filename='/tmp/esapi.log',
        )
    
        body1 = {
            "query": {
                "bool": {
                    "must": [
                        {"match_phrase": {"timedate": "2018-08-20"}},
                        {"match_phrase": {"source": "/app/logs/app/app.2018-08-20"}}
                    ],
                    "filter": [
                        {"term": {"appname": "app"}},
                        {"term": {"host": "xxxxxxxx"}}
                    ],
                }
           },
           "_source" : ["timedate",]
        }
    
        body = {
            "query": {
                "match_all": {}
            }
        }
    
        index = 'logstash-xxxxx-2018.08.20'
        esapi = Myesapi(body=body1, index=index)
        result = esapi.search()
        for i in result:
            try:
                with open('timelist.txt', 'a+') as f:
                    f.writelines(i["_source"]["timedate"]+'
    '
    ) except Exception as e: logging.info(e) if __name__ == '__main__': main()