Filter by extension type

This commit is contained in:
Simon 2018-06-26 19:02:46 -04:00
parent a0bd45c829
commit 8ea57967e6
4 changed files with 39 additions and 7 deletions

9
app.py
View File

@ -231,9 +231,13 @@ def search():
per_page = int(per_page) if per_page.isdigit() else "50"
per_page = per_page if per_page in config.RESULTS_PER_PAGE else 50
extensions = request.args.get("ext") if "ext" in request.args else ""
extensions = [ext.strip().strip(".") for ext in extensions.split(",")] if extensions else []
print(extensions)
if len(q) >= 3:
try:
hits = searchEngine.search(q, page, per_page, sort_order)
hits = searchEngine.search(q, page, per_page, sort_order, extensions)
hits = db.join_website_on_search_result(hits)
except InvalidQueryException as e:
flash("<strong>Invalid query:</strong> " + str(e), "warning")
@ -243,7 +247,8 @@ def search():
return render_template("search.html",
results=hits, q=q, p=page, sort_order=sort_order,
per_page=per_page, results_set=config.RESULTS_PER_PAGE)
per_page=per_page, results_set=config.RESULTS_PER_PAGE,
extensions=",".join(extensions))
@app.route("/contribute")

View File

@ -16,7 +16,7 @@ class SearchEngine:
def import_json(self, in_str: str, website_id: int):
raise NotImplementedError
def search(self, query, page, per_page, sort_order) -> {}:
def search(self, query, page, per_page, sort_order, extension) -> {}:
raise NotImplementedError
def reset(self):
@ -142,9 +142,11 @@ class ElasticSearchEngine(SearchEngine):
action_string = '{"index":{}}\n'
return "\n".join("".join([action_string, ujson.dumps(doc)]) for doc in docs)
def search(self, query, page, per_page, sort_order) -> {}:
def search(self, query, page, per_page, sort_order, extensions) -> {}:
filters = []
if extensions:
filters.append({"terms": {"ext": extensions}})
sort_by = ElasticSearchEngine.SORT_ORDERS.get(sort_order, [])
page = self.es.search(body={

View File

@ -169,6 +169,12 @@ a:hover {
color: inherit;
}
.input-group-text {
border: 1px solid #282b30;
background-color: #686d75;
color: #e9ecef;
}
.nav-tabs .nav-link {
border-color: transparent;
}

View File

@ -12,9 +12,12 @@
<form action="/search">
<div class="form-row">
{# Query #}
<div class="form-group col-md-7">
<input class="form-control" name="q" id="q" placeholder="Full-text Query" value="{{ q }}">
<input class="form-control" name="q" id="q" placeholder="Query" value="{{ q }}">
</div>
{# Sort order #}
<div class="form-group col-md-3">
<select class="form-control" name="sort_order" title="Sort order">
<option disabled>Select sort order</option>
@ -26,6 +29,7 @@
<option value="none" {{ "selected" if sort_order == "none" else "" }}>No order (faster)</option>
</select>
</div>
{# Results per page #}
<div class="form-group col-md-2">
<select class="form-control" name="per_page" title="Results per page">
<option disabled>Results per page</option>
@ -35,6 +39,21 @@
</select>
</div>
</div>
{# Filters #}
<span class="text-muted">Filters</span>
<div class="form-row">
{# File extension #}
<div class="form-group col-md-6">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">.</div>
</div>
<input name="ext" placeholder="Extensions, comma-separated" class="form-control" value="{{ extensions }}">
</div>
</div>
</div>
<input class="btn btn-primary btn-shadow" type="submit" value="Search">
@ -88,11 +107,11 @@
</table>
</div>
{% if results["hits"]["total"] > (p + 1) * per_page %}
<a href="/search?q={{ q }}&p={{ p + 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}"
<a href="/search?q={{ q }}&p={{ p + 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}&ext={{ extensions }}"
class="btn btn-primary" style="float: right">Next</a>
{% endif %}
{% if p > 0 %}
<a href="/search?q={{ q }}&p={{ p - 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}"
<a href="/search?q={{ q }}&p={{ p - 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}&ext={{ extensions }}"
class="btn btn-primary">Previous</a>
{% endif %}