97 lines
2.5 KiB
Python
97 lines
2.5 KiB
Python
#!/usr/bin/env python
|
|
from __future__ import print_function
|
|
|
|
import logging
|
|
from dateutil.parser import parse as parse_date
|
|
|
|
from elasticsearch import Elasticsearch
|
|
|
|
|
|
def print_search_stats(results):
|
|
print("=" * 80)
|
|
print(
|
|
"Total %d found in %dms" % (results["hits"]["total"]["value"], results["took"])
|
|
)
|
|
print("-" * 80)
|
|
|
|
|
|
def print_hits(results):
|
|
" Simple utility function to print results of a search query. "
|
|
print_search_stats(results)
|
|
for hit in results["hits"]["hits"]:
|
|
# get created date for a repo and fallback to authored_date for a commit
|
|
created_at = parse_date(
|
|
hit["_source"].get("created_at", hit["_source"]["authored_date"])
|
|
)
|
|
print(
|
|
"/%s/%s/%s (%s): %s"
|
|
% (
|
|
hit["_index"],
|
|
hit["_type"],
|
|
hit["_id"],
|
|
created_at.strftime("%Y-%m-%d"),
|
|
hit["_source"]["description"].split("\n")[0],
|
|
)
|
|
)
|
|
|
|
print("=" * 80)
|
|
print()
|
|
|
|
|
|
# get trace logger and set level
|
|
tracer = logging.getLogger("elasticsearch.trace")
|
|
tracer.setLevel(logging.INFO)
|
|
tracer.addHandler(logging.FileHandler("/tmp/es_trace.log"))
|
|
# instantiate es client, connects to localhost:9200 by default
|
|
es = Elasticsearch()
|
|
|
|
print("Empty search:")
|
|
print_hits(es.search(index="git"))
|
|
|
|
print('Find commits that says "fix" without touching tests:')
|
|
result = es.search(
|
|
index="git",
|
|
body={
|
|
"query": {
|
|
"bool": {
|
|
"must": {"match": {"description": "fix"}},
|
|
"must_not": {"term": {"files": "test_elasticsearch"}},
|
|
}
|
|
}
|
|
},
|
|
)
|
|
print_hits(result)
|
|
|
|
print("Last 8 Commits for elasticsearch-py:")
|
|
result = es.search(
|
|
index="git",
|
|
body={
|
|
"query": {"term": {"repository": "elasticsearch-py"}},
|
|
"sort": [{"committed_date": {"order": "desc"}}],
|
|
"size": 8,
|
|
},
|
|
)
|
|
print_hits(result)
|
|
|
|
print("Stats for top 10 committers:")
|
|
result = es.search(
|
|
index="git",
|
|
body={
|
|
"size": 0,
|
|
"aggs": {
|
|
"committers": {
|
|
"terms": {"field": "committer.name.keyword"},
|
|
"aggs": {"line_stats": {"stats": {"field": "stats.lines"}}},
|
|
}
|
|
},
|
|
},
|
|
)
|
|
|
|
print_search_stats(result)
|
|
for committer in result["aggregations"]["committers"]["buckets"]:
|
|
print(
|
|
"%15s: %3d commits changing %6d lines"
|
|
% (committer["key"], committer["doc_count"], committer["line_stats"]["sum"])
|
|
)
|
|
print("=" * 80)
|