Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port facet.limit, facet.mincount and facet.prefix support to Haystack 2.0 #450

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 40 additions & 2 deletions haystack/backends/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,11 @@ def __init__(self, using=DEFAULT_ALIAS):
self.highlight = False
self.facets = set()
self.date_facets = {}
self.facet_mincount = None
self.facet_limit = None
self.facet_prefix = None
self.facet_sort = None
self.facet_offset = None
self.query_facets = []
self.narrow_queries = set()
self._raw_query = None
Expand Down Expand Up @@ -347,6 +352,21 @@ def build_params(self, spelling_query=None):
if self.query_facets:
kwargs['query_facets'] = self.query_facets

if self.facet_mincount:
kwargs['facet_mincount'] = self.facet_mincount

if self.facet_limit:
kwargs['facet_limit'] = self.facet_limit

if self.facet_prefix:
kwargs['facet_prefix'] = self.facet_prefix

if self.facet_sort:
kwargs['facet_sort'] = self.facet_sort

if self.facet_offset:
kwargs['facet_offset'] = self.facet_offset

if self.narrow_queries:
kwargs['narrow_queries'] = self.narrow_queries

Expand Down Expand Up @@ -481,7 +501,6 @@ def build_query(self):
be sent to the backend.
"""
query = self.query_filter.as_query_string(self.build_query_fragment)

if not query:
# Match all.
query = self.matching_all_fragment()
Expand Down Expand Up @@ -562,7 +581,6 @@ def add_filter(self, query_filter, use_or=False):
subtree = True
else:
subtree = False

for child in query_filter.children:
if isinstance(child, tree.Node):
self.query_filter.start_subtree(connector)
Expand All @@ -584,6 +602,21 @@ def add_order_by(self, field):
"""Orders the search result by a field."""
self.order_by.append(field)

def set_facet_mincount(self, mincount):
self.facet_mincount = mincount

def set_facet_limit(self, limit):
self.facet_limit = limit

def set_facet_prefix(self, prefix):
self.facet_prefix = prefix

def set_facet_sort(self, sort):
self.facet_sort = sort

def set_facet_offset(self, offset):
self.facet_offset = offset

def clear_order_by(self):
"""
Clears out all ordering that has been already added, reverting the
Expand Down Expand Up @@ -746,6 +779,11 @@ def _clone(self, klass=None, using=None):
clone.facets = self.facets.copy()
clone.date_facets = self.date_facets.copy()
clone.query_facets = self.query_facets[:]
clone.facet_mincount = self.facet_mincount
clone.facet_limit = self.facet_limit
clone.facet_prefix = self.facet_prefix
clone.facet_sort = self.facet_sort
clone.facet_offset = self.facet_offset
clone.narrow_queries = self.narrow_queries.copy()
clone.start_offset = self.start_offset
clone.end_offset = self.end_offset
Expand Down
43 changes: 40 additions & 3 deletions haystack/backends/solr_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,11 @@ def clear(self, models=[], commit=True):
self.log.error("Failed to clear Solr index: %s", e)

@log_query
def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
fields='', highlight=False, facets=None, date_facets=None, query_facets=None,
narrow_queries=None, spelling_query=None,
def search(self,query_string, sort_by=None, start_offset=0, end_offset=None,
fields='', highlight=False, facets=None, date_facets=None,
query_facets=None, narrow_queries=None, spelling_query=None,
facet_mincount=None, facet_limit=None, facet_prefix=None,
facet_sort=None, facet_offset=None,
limit_to_registered_models=None, result_class=None, **kwargs):
if len(query_string) == 0:
return {
Expand Down Expand Up @@ -147,6 +149,26 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=None,
kwargs['facet'] = 'on'
kwargs['facet.field'] = facets

if facet_mincount is not None:
kwargs['facet'] = 'on'
kwargs['facet.mincount'] = facet_mincount

if facet_limit is not None:
kwargs['facet'] = 'on'
kwargs['facet.limit'] = facet_limit

if facet_prefix is not None:
kwargs['facet'] = 'on'
kwargs['facet.prefix'] = facet_prefix

if facet_sort is not None:
kwargs['facet'] = 'on'
kwargs['facet.sort'] = facet_sort

if facet_offset is not None:
kwargs['facet'] = 'on'
kwargs['facet.offset'] = facet_offset

if date_facets is not None:
kwargs['facet'] = 'on'
kwargs['facet.date'] = date_facets.keys()
Expand Down Expand Up @@ -490,6 +512,21 @@ def run(self, spelling_query=None):
if self.date_facets:
kwargs['date_facets'] = self.date_facets

if self.facet_mincount:
kwargs['facet_mincount'] = self.facet_mincount

if self.facet_limit:
kwargs['facet_limit'] = self.facet_limit

if self.facet_prefix:
kwargs['facet_prefix'] = self.facet_prefix

if self.facet_sort:
kwargs['facet_sort'] = self.facet_sort

if self.facet_offset:
kwargs['facet_offset'] = self.facet_offset

if self.query_facets:
kwargs['query_facets'] = self.query_facets

Expand Down
30 changes: 30 additions & 0 deletions haystack/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,36 @@ def query_facet(self, field, query):
clone.query.add_query_facet(field, query)
return clone

def facet_mincount(self, mincount):
"""Sets mincount for facet result."""
clone = self._clone()
clone.query.set_facet_mincount(mincount)
return clone

def facet_limit(self, limit):
"""Sets limit for facet result."""
clone = self._clone()
clone.query.set_facet_limit(limit)
return clone

def facet_prefix(self, prefix):
"""Sets prefix for facet result."""
clone = self._clone()
clone.query.set_facet_prefix(prefix)
return clone

def facet_offset(self, offset):
"""Sets offset for facet result."""
clone = self._clone()
clone.query.set_facet_offset(offset)
return clone

def facet_sort(self, sort):
"""Sets sort for facet result."""
clone = self._clone()
clone.query.set_facet_sort(sort)
return clone

def narrow(self, query):
"""Pushes existing facet choices into the search."""
clone = self._clone()
Expand Down