From 1e2040ddd9673e5307985cdd12e5ea1ab5be7ca7 Mon Sep 17 00:00:00 2001 From: Sijmen Schoon Date: Fri, 26 Oct 2018 11:10:46 +0200 Subject: [PATCH] Add pagination and some other stuff --- backend/app.py | 132 ++++++++++++++++++------- backend/question.py | 6 +- backend/question_search.py | 12 --- backend/requirements.txt | 1 + frontend/src/assets/pages_active.png | Bin 0 -> 3740 bytes frontend/src/assets/pages_end.png | Bin 0 -> 32058 bytes frontend/src/assets/pages_inactive.png | Bin 0 -> 4754 bytes frontend/src/assets/pages_start.png | Bin 0 -> 5774 bytes frontend/src/components/ResultBody.vue | 80 ++++++++++++--- 9 files changed, 171 insertions(+), 60 deletions(-) delete mode 100644 backend/question_search.py create mode 100644 frontend/src/assets/pages_active.png create mode 100644 frontend/src/assets/pages_end.png create mode 100644 frontend/src/assets/pages_inactive.png create mode 100644 frontend/src/assets/pages_start.png diff --git a/backend/app.py b/backend/app.py index 6cd0d97..39647e9 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1,13 +1,14 @@ from flask import Flask, jsonify, request from elasticsearch_dsl import Search from elasticsearch_dsl.connections import connections +from elasticsearch.exceptions import NotFoundError from tqdm import tqdm from beeprint import pp import csv import click +import requests from .question import Question -from .question_search import QuestionSearch app = Flask(__name__) @@ -22,23 +23,22 @@ def index(): query = request.args.get("q") categories = request.args.get("categories", None) + page = int(request.args.get("page", 1)) - 1 - facets = {} - if categories is not None: - category_list = categories.split(",") - facets["category"] = category_list - - search = Search.from_dict({ + search_dict = { + "from": page * 10, "query": { - "query_string": { - "query": query, - }, + "bool": { + "must": [ + {"query_string": {"query": query}}, + ] + } }, "aggregations": { "category": { "terms": {"field": "category"}, }, - "suggestions": { + "chips": { "significant_terms": { "field": "body", "mutual_information": { @@ -48,19 +48,25 @@ def index(): }, } }, - }) + } + if categories is not None: + category_list = categories.split(",") + search_dict["post_filter"] = { + "terms": {"category": category_list}, + } + + search = Search.from_dict(search_dict) response = search.execute() + pp(response.to_dict()) - #date_facets = [{"timestamp": date.timestamp(), "count": count} - #for date, count, _ in response.facets.date_frequency] category_facets = [ {"category": bucket.key, "count": round_sigfig(bucket.doc_count, 3)} for bucket in response.aggregations.category.buckets ] - suggestions = [{"key": bucket.key, "count": bucket.doc_count} - for bucket in response.aggregations.suggestions.buckets] + chips = [{"key": bucket.key, "count": bucket.doc_count} + for bucket in response.aggregations.chips.buckets] date_facets = [] @@ -69,10 +75,15 @@ def index(): summary = Question.summary(hit) url = Question.url(hit) + try: + dead = hit.dead + except AttributeError: + dead = False + results.append({ "id": hit.meta.id, "score": hit.meta.score, "title": hit.title, "body": summary, "category": hit.category, "date": hit.date, - "url": url, + "url": url, "dead": dead, }) return jsonify( @@ -80,7 +91,7 @@ def index(): "months": date_facets, "categories": category_facets, }, - suggestions=suggestions, + chips=chips, results=results, hits=round_sigfig(response.hits.total, 4), took=response.took / 1000, @@ -90,7 +101,8 @@ def index(): @app.cli.command() @click.argument("questions") @click.argument("categories") -def import_data(questions, categories): +@click.argument("answers") +def import_data(questions, categories, answers): categories_dict = {} num_lines = sum(1 for line in open(categories)) with open(categories, newline="") as csv_file: @@ -101,23 +113,73 @@ def import_data(questions, categories): categories_dict[id_] = category - num_lines = sum(1 for line in open(questions)) - with open(questions, newline="") as csv_file: - reader = csv.reader(csv_file) + if questions != "skip": + num_lines = sum(1 for line in open(questions)) + with open(questions, newline="") as csv_file: + reader = csv.reader(csv_file) - it = tqdm(reader, desc="Reading questions", total=num_lines) - for i, row in enumerate(it): - try: - id_ = int(row[0]) - category_id = int(row[3]) + it = tqdm(reader, desc="Reading questions", total=num_lines) + for i, row in enumerate(it): + try: + id_ = int(row[0]) + category_id = int(row[3]) - question = Question(meta={"id": id_}) + question = Question(meta={"id": id_}) - question.date = row[1] - question.category = categories_dict[category_id] - question.title = row[4] - question.body = "\n".join(row[5:]) + question.date = row[1] + question.category = categories_dict[category_id] + question.title = row[4] + question.body = "\n".join(row[5:]) - question.save() - except (IndexError, ValueError): - continue + question.save() + except (IndexError, ValueError): + continue + + if answers != "skip": + with open(answers, newline="") as csv_file: + reader = csv.reader(csv_file) + + it = tqdm(reader, desc="Reading answers") + for i, row in enumerate(it): + try: + question_id = int(row[3]) + question = Question.get(id=question_id) + if question.answers is None: + question.answers = row[4] + else: + question.answers += "\n\n" + row[4] + question.save() + except (IndexError, ValueError, NotFoundError): + continue + + +@app.cli.command() +def cleanup_database(): + dead_count = 0 + alive_count = 0 + + for question in Question.search().scan(): + if question.dead is not None or question.error: + print(end="_") + dead_count += 1 + continue + + url = question.url() + response = requests.head(url) + + if response.status_code == 404: + dead_count += 1 + question.dead = True + question.save() + print(end=".") + elif response.status_code == 302: + alive_count += 1 + question.dead = False + print(end="#") + elif response.status_code == 500: + question.error = True + print(end="!") + else: + continue + + question.save() diff --git a/backend/question.py b/backend/question.py index 2078350..53b0a0b 100644 --- a/backend/question.py +++ b/backend/question.py @@ -1,4 +1,4 @@ -from elasticsearch_dsl import Document, Date, Keyword, Text +from elasticsearch_dsl import Document, Date, Keyword, Text, Boolean class Question(Document): @@ -9,6 +9,10 @@ class Question(Document): ) category = Keyword() date = Date() + answers = Text(analyzer="snowball") + + dead = Boolean() + error = Boolean() class Index: name = "goeievraag" diff --git a/backend/question_search.py b/backend/question_search.py deleted file mode 100644 index e385e9b..0000000 --- a/backend/question_search.py +++ /dev/null @@ -1,12 +0,0 @@ -from elasticsearch_dsl import FacetedSearch, TermsFacet, DateHistogramFacet -from .question import Question - - -class QuestionSearch(FacetedSearch): - doc_types = Question, - fields = "title", "body" - - facets = { - "date_frequency": DateHistogramFacet(field="date", interval="month"), - "category": TermsFacet(field="category"), - } diff --git a/backend/requirements.txt b/backend/requirements.txt index 5cc2513..52c3fb7 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -2,3 +2,4 @@ elasticsearch-dsl flask tqdm beeprint +requests diff --git a/frontend/src/assets/pages_active.png b/frontend/src/assets/pages_active.png new file mode 100644 index 0000000000000000000000000000000000000000..57072d8abdf8596d2c5ddff23f2616a5f48e9827 GIT binary patch literal 3740 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 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/pages_end.png b/frontend/src/assets/pages_end.png new file mode 100644 index 0000000000000000000000000000000000000000..0989149dc81314912ed8484dc0d3bcb86034071d GIT binary patch literal 32058 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 KY1m-k68Aq>SN+cb literal 0 HcmV?d00001 diff --git a/frontend/src/assets/pages_start.png b/frontend/src/assets/pages_start.png new file mode 100644 index 0000000000000000000000000000000000000000..239ef9a7bee87ccfdf4b6fbd3c491b99b17eff35 GIT binary patch literal 5774 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
-
- - + +
@@ -57,6 +76,13 @@ export default class ResultBody extends Vue { results = []; responseTime = 0; facets = {}; + chips = []; + + currentPage = 1; + + get pages() { + return Math.ceil(this.hits / 10); + } @Watch("value") async onQueryChanged(value) { @@ -83,7 +109,7 @@ export default class ResultBody extends Vue { async search() { const query = encodeURIComponent(this.value); - let queryString = `?q=${query}`; + let queryString = `?q=${query}&page=${this.currentPage}`; if (this.activeCategories.length > 0) { const categories = encodeURIComponent(this.activeCategories.join(",")); @@ -96,15 +122,21 @@ export default class ResultBody extends Vue { let response = await fetch(url); this.json = await response.json(); - this.results = this.json.results; + this.chips = this.json.chips; + this.facets = this.json.facets; this.hits = this.json.hits; this.responseTime = this.json.took; - this.facets = this.json.facets; + this.results = this.json.results; } appendToQuery(value) { this.$emit("input", `${this.value} AND ${value}`) } + + async switchPage(page) { + this.currentPage = page; + await this.search(); + } } @@ -191,7 +223,7 @@ export default class ResultBody extends Vue { text-align: right; } -.suggestions { +.chips { display: flex; flex-flow: row wrap; max-width: 1000px; @@ -201,7 +233,7 @@ export default class ResultBody extends Vue { overflow-y: hidden; } -.suggestion { +.chip { border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 12px; @@ -210,5 +242,29 @@ export default class ResultBody extends Vue { margin: 2px; cursor: pointer; + height: 32px; +} + +.pagination { + display: flex; + margin: 0 0 16px; +} + +.pagination__page { + height: 50px; + text-align: center; + display: flex; + flex-flow: column; +} + +.pagination img { + height: 40px; + margin: 0 1px; +} + +.pagination__page:not(.active) { + text-decoration: underline; + color: blue; + cursor: pointer; }