Skip to content

Commit

Permalink
Aggregations section for the search tutorial (#161)
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelgrinberg authored Jan 24, 2024
1 parent bda20cd commit 5264994
Show file tree
Hide file tree
Showing 12 changed files with 326 additions and 134 deletions.
Binary file modified example-apps/search-tutorial/search-tutorial-starter.zip
Binary file not shown.
10 changes: 10 additions & 0 deletions example-apps/search-tutorial/start/search-tutorial/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
"name": "Swe Career Matrix",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EVYuEyRhHh5Aqc3a39sqbGcBkqKIHRWtJBjjUjNs6snpMg?e=nv1mf4",
"created_on": "2018-04-15",
"updated_at": "2018-04-15",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -65,6 +66,7 @@
"name": "Sales Engineering Collaboration",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EW21-KJnfHBFoRiF49_uJMcBfHyPKimuPOFsCcJypQWaBQ?e=mGdIqe",
"created_on": "2019-04-15",
"updated_at": "2019-04-15",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -74,6 +76,7 @@
"name": "Intellectual Property Policy",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EWz3cYEVdzBNsiHsYbKhms4BVYGhravyrUw3T3lzxL4pTg?e=mPIgbO",
"created_on": "2021-06-15",
"updated_at": "2021-06-15",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -84,6 +87,7 @@
"name": "Code Of Conduct",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/ER3xmeKaZ_pAqPeJWyyNR0QBg6QmoWIGPhwfEyCABWHrPA?e=cvzrgV",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -93,6 +97,7 @@
"name": "Office Pet Policy",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/ETf-69wBeaZJpAn3CY7ExRABQWvav-p24VOnB6C0A4l2pQ?e=X72WuK",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -102,6 +107,7 @@
"name": "Performance Management Policy",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/ERsxt9p1uehJqeJu4JlxkakBavbKwcldrYv_hpv3xHikAw?e=pf5R2C",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -112,6 +118,7 @@
"name": "Sales Organization Overview",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EYsr1eqgn9hMslMJFLR-k54BBX-O3iC26bK7xNEBtYIBkg?e=xeAjiT",
"created_on": "2018-01-15",
"updated_at": "2018-01-15",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -121,6 +128,7 @@
"name": "Compensation Framework For It Teams",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EaAFec6004tAg21g4i67rfgBBRqCm1yY7AZLLQyyaMtsEQ?e=wTMb4z",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "sharepoint",
"rolePermissions": ["manager"]
},
Expand All @@ -130,6 +138,7 @@
"name": "Updating Your Tax Elections Forms",
"url": "./github/Updating Your Tax Elections Forms.txt",
"created_on": "2022-12-20",
"updated_at": "2022-12-20",
"category": "github",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -139,6 +148,7 @@
"name": "New Employee Onboarding Guide",
"url": "./github/New Employee Onboarding guide.txt",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "github",
"rolePermissions": ["demo", "manager"]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,43 +3,59 @@
{% block content %}
<form method="POST" action="{{ url_for('handle_search') }}">
<div class="mb-3">
<input type="text" class="form-control" name="query" id="query" placeholder="Enter your search query" autofocus>
<input type="text" class="form-control" name="query" id="query" placeholder="Enter your search query" value="{{ query }}" autofocus>
</div>
</form>
{% if results %}
<div class="row mb-3">
<div class="col-sm-auto my-auto">
Showing results {{ from_ + 1 }}-{{ from_ + results|length }} out of {{ total }}.
<div class="col-2 mt-2">
<p><a href="javascript:history.back(1)">← Back</a></p>
{% for agg in aggs %}
<h6 class="mt-3">{{ agg }}</h6>
{% for key, count in aggs[agg].items() %}
<form method="POST">
<input type="hidden" name="query" value="{{ agg|lower }}:{{key}} {{ query }}">
<button type="submit" class="btn btn-link btn-sm"{% if aggs[agg]|length == 1 %} disabled{% endif %}>{{ key }} ({{ count }})</button>
</form>
{% endfor %}
{% endfor %}
</div>
{% if from_ > 0 %}
<div class="col-sm-auto my-auto">
<a href="javascript:history.back(1)" class="btn btn-primary">← Previous page</a>
</div>
{% endif %}
{% if from_ + results|length < total %}
<div class="col-sm-auto my-auto">
<form method="POST">
<input type="hidden" name="query" value="{{ query }}">
<input type="hidden" name="from_" value="{{ from_ + results|length }}">
<button type="submit" class="btn btn-primary">Next page →</button>
</form>
<div class="col-10">
<div class="row mb-3">
<div class="col-sm-auto my-auto">
Showing results {{ from_ + 1 }}-{{ from_ + results|length }} out of {{ total }}.
</div>
{% if from_ > 0 %}
<div class="col-sm-auto my-auto">
<a href="javascript:history.back(1)" class="btn btn-primary">← Previous page</a>
</div>
{% endif %}
{% if from_ + results|length < total %}
<div class="col-sm-auto my-auto">
<form method="POST">
<input type="hidden" name="query" value="{{ query }}">
<input type="hidden" name="from_" value="{{ from_ + results|length }}">
<button type="submit" class="btn btn-primary">Next page →</button>
</form>
</div>
{% endif %}
<div class="col"></div>
</div>
{% endif %}
<div class="col"></div>
{% for result in results %}
<p>
{{ from_ + loop.index }}. <b><a href="{{ url_for('get_document', id=result._id) }}">{{ result._source.name }}</a></b>
<br>
{{ result._source.summary }}
<br>
<small>
Category: {{ result._source.category }}.
Last updated: {{ result._source.updated_at | default(result._source.created_on) }}.
{% if result._score %}<i>(Score: {{ result._score }})</i>{% endif %}
</small>
</p>
{% endfor %}
</div>
</div>
{% for result in results %}
<p>
{{ from_ + loop.index }}. <b><a href="{{ url_for('get_document', id=result._id) }}">{{ result._source.name }}</a></b>
<br>
{{ result._source.summary }}
<br>
<small>
Category: {{ result._source.category }}.
Last updated: {{ result._source.updated_at | default(result._source.created_on) }}.
{% if result._score %}<i>(Score: {{ result._score }})</i>{% endif %}
</small>
</p>
{% endfor %}
{% elif request.method == 'POST' %}
<p>No results found.</p>
{% endif %}
Expand Down
61 changes: 50 additions & 11 deletions example-apps/search-tutorial/v1/search-tutorial/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,38 @@ def handle_search():
**search_query,
**filters
}
}, size=5, from_=from_
},
aggs={
'category-agg': {
'terms': {
'field': 'category.keyword',
}
},
'year-agg': {
'date_histogram': {
'field': 'updated_at',
'calendar_interval': 'year',
'format': 'yyyy',
},
},
},
size=5,
from_=from_
)
aggs = {
'Category': {
bucket['key']: bucket['doc_count']
for bucket in results['aggregations']['category-agg']['buckets']
},
'Year': {
bucket['key_as_string']: bucket['doc_count']
for bucket in results['aggregations']['year-agg']['buckets']
if bucket['doc_count'] > 0
},
}
return render_template('index.html', results=results['hits']['hits'],
query=query, from_=from_,
total=results['hits']['total']['value'])
total=results['hits']['total']['value'], aggs=aggs)


@app.get('/document/<id>')
Expand All @@ -63,19 +90,31 @@ def reindex():


def extract_filters(query):
filters = []

filter_regex = r'category:([^\s]+)\s*'
m = re.search(filter_regex, query)
if m is None:
return {}, query # no filters
filters = {
'filter': [{
if m:
filters.append({
'term': {
'category.keyword': {
'value': m.group(1)
}
}
}]
}
query = re.sub(filter_regex, '', query).strip()
return filters, query
},
})
query = re.sub(filter_regex, '', query).strip()

filter_regex = r'year:([^\s]+)\s*'
m = re.search(filter_regex, query)
if m:
filters.append({
'range': {
'updated_at': {
'gte': f'{m.group(1)}||/y',
'lte': f'{m.group(1)}||/y',
}
},
})
query = re.sub(filter_regex, '', query).strip()

return {'filter': filters}, query
10 changes: 10 additions & 0 deletions example-apps/search-tutorial/v1/search-tutorial/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
"name": "Swe Career Matrix",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EVYuEyRhHh5Aqc3a39sqbGcBkqKIHRWtJBjjUjNs6snpMg?e=nv1mf4",
"created_on": "2018-04-15",
"updated_at": "2018-04-15",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -65,6 +66,7 @@
"name": "Sales Engineering Collaboration",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EW21-KJnfHBFoRiF49_uJMcBfHyPKimuPOFsCcJypQWaBQ?e=mGdIqe",
"created_on": "2019-04-15",
"updated_at": "2019-04-15",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -74,6 +76,7 @@
"name": "Intellectual Property Policy",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EWz3cYEVdzBNsiHsYbKhms4BVYGhravyrUw3T3lzxL4pTg?e=mPIgbO",
"created_on": "2021-06-15",
"updated_at": "2021-06-15",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -84,6 +87,7 @@
"name": "Code Of Conduct",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/ER3xmeKaZ_pAqPeJWyyNR0QBg6QmoWIGPhwfEyCABWHrPA?e=cvzrgV",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -93,6 +97,7 @@
"name": "Office Pet Policy",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/ETf-69wBeaZJpAn3CY7ExRABQWvav-p24VOnB6C0A4l2pQ?e=X72WuK",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -102,6 +107,7 @@
"name": "Performance Management Policy",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/ERsxt9p1uehJqeJu4JlxkakBavbKwcldrYv_hpv3xHikAw?e=pf5R2C",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -112,6 +118,7 @@
"name": "Sales Organization Overview",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EYsr1eqgn9hMslMJFLR-k54BBX-O3iC26bK7xNEBtYIBkg?e=xeAjiT",
"created_on": "2018-01-15",
"updated_at": "2018-01-15",
"category": "sharepoint",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -121,6 +128,7 @@
"name": "Compensation Framework For It Teams",
"url": "https://enterprisesearch.sharepoint.com/:t:/s/MSBuilddemo/EaAFec6004tAg21g4i67rfgBBRqCm1yY7AZLLQyyaMtsEQ?e=wTMb4z",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "sharepoint",
"rolePermissions": ["manager"]
},
Expand All @@ -130,6 +138,7 @@
"name": "Updating Your Tax Elections Forms",
"url": "./github/Updating Your Tax Elections Forms.txt",
"created_on": "2022-12-20",
"updated_at": "2022-12-20",
"category": "github",
"rolePermissions": ["demo", "manager"]
},
Expand All @@ -139,6 +148,7 @@
"name": "New Employee Onboarding Guide",
"url": "./github/New Employee Onboarding guide.txt",
"created_on": "2018-01-12",
"updated_at": "2018-01-12",
"category": "github",
"rolePermissions": ["demo", "manager"]
}
Expand Down
Loading

0 comments on commit 5264994

Please sign in to comment.