From c9345e9e7e184b0ce3c83adc8deb080a1662d33d Mon Sep 17 00:00:00 2001 From: nicola Date: Fri, 11 Apr 2025 15:54:24 +0200 Subject: [PATCH 1/3] Add support for nested fields Updated facets, filters, and aggregations to handle nested fields, enabling more flexible query structures. Adjusted logic to check for "nested" definitions and construct queries accordingly, ensuring compatibility with both standard and nested data structures. --- oscar_elasticsearch/search/api/search.py | 11 ++++++++++- oscar_elasticsearch/search/facets.py | 9 +++++++-- oscar_elasticsearch/search/views/base.py | 24 ++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/oscar_elasticsearch/search/api/search.py b/oscar_elasticsearch/search/api/search.py index 1df10e3..cd51041 100644 --- a/oscar_elasticsearch/search/api/search.py +++ b/oscar_elasticsearch/search/api/search.py @@ -95,13 +95,22 @@ def get_elasticsearch_aggs(aggs_definitions): for facet_definition in aggs_definitions: name = facet_definition["name"] facet_type = facet_definition["type"] + nested = facet_definition.get("nested", None) if facet_type == "term": terms = {"terms": {"field": name, "size": es_settings.FACET_BUCKET_SIZE}} if "order" in facet_definition: terms["terms"]["order"] = {"_key": facet_definition.get("order", "asc")} - aggs[name] = terms + if nested: + aggs[name] = { + "nested": {"path": nested["path"]}, + "aggs": { + name: terms, + }, + } + else: + aggs[name] = terms elif facet_type == "range": ranges_definition = facet_definition["ranges"] if ranges_definition: diff --git a/oscar_elasticsearch/search/facets.py b/oscar_elasticsearch/search/facets.py index eb35e7c..0fce7eb 100644 --- a/oscar_elasticsearch/search/facets.py +++ b/oscar_elasticsearch/search/facets.py @@ -38,8 +38,13 @@ def process_facets(request_full_path, form, facets, facet_definitions=None): if unfiltered_facet is None: continue - unfiltered_buckets = unfiltered_facet.get("buckets", []) - filtered_buckets = filtered_facet.get("buckets", []) + if "nested" in facet_definition: + unfiltered_buckets = unfiltered_facet[facet_name].get("buckets", []) + filtered_buckets = filtered_facet[facet_name].get("buckets", []) + else: + unfiltered_buckets = unfiltered_facet.get("buckets", []) + filtered_buckets = filtered_facet.get("buckets", []) + if len(unfiltered_buckets) >= settings.MIN_NUM_BUCKETS: # range facet buckets are always filled so we need to check if the # doc_counts are non-zero to know if they are useful. diff --git a/oscar_elasticsearch/search/views/base.py b/oscar_elasticsearch/search/views/base.py index 7179443..9156827 100644 --- a/oscar_elasticsearch/search/views/base.py +++ b/oscar_elasticsearch/search/views/base.py @@ -89,9 +89,29 @@ def get_facet_filters(self): {"range": {name: {"from": D(from_), "to": D(to)}}} ) - filters.append({"bool": {"should": ranges}}) + if definition.get("nested", None): + filters.append( + { + "nested": { + "path": definition["nested"]["path"], + "query": {"bool": {"should": ranges}}, + } + } + ) + else: + filters.append({"bool": {"should": ranges}}) else: - filters.append({"terms": {name: value}}) + if definition.get("nested", None): + filters.append( + { + "nested": { + "path": definition["nested"]["path"], + "query": {"terms": {name: value}}, + } + } + ) + else: + filters.append({"terms": {name: value}}) return filters From ae802d992e01e348439737b14c6ee2505529bb34 Mon Sep 17 00:00:00 2001 From: nicola Date: Tue, 15 Apr 2025 17:50:00 +0200 Subject: [PATCH 2/3] Aggiorna dipendenza Elasticsearch con restrizione di versione MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Limita la versione di Elasticsearch supportata a <9 per garantire la compatibilità con le librerie esistenti. Questa modifica previene potenziali problemi con breaking changes nelle versioni future. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 2313b2d..8e810d6 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ "setuptools", "django-oscar>=4.0a1", "purl", - "elasticsearch>=8.0.0", + "elasticsearch>=8.0.0;<9", "uwsgidecorators-fallback", "django-oscar-odin>=0.3.0", "python-dateutil>=2.8.0", From 2b40d30e0d4daff8687521520d677e626121e37a Mon Sep 17 00:00:00 2001 From: nicola Date: Tue, 15 Apr 2025 18:08:41 +0200 Subject: [PATCH 3/3] Aggiorna dipendenze in setup.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corregge la sintassi del requisito per "elasticsearch" utilizzando una virgola anziché un punto e virgola. Garantisce compatibilità con le versioni future mantenendo l'intervallo specificato. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8e810d6..c1d1404 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ "setuptools", "django-oscar>=4.0a1", "purl", - "elasticsearch>=8.0.0;<9", + "elasticsearch>=8.0.0,<9", "uwsgidecorators-fallback", "django-oscar-odin>=0.3.0", "python-dateutil>=2.8.0",