Python 如果选择了facet,如何禁用-Django Haystack进行搜索
我在奥斯卡CMS项目中使用Django Haystack,我对它从搜索返回所选方面数据的方式有问题 当我没有在菜单中选择任何产品时,solr中面(项目类)的顺序是 但当我选择经典产品时,solr会将选定的方面移动到列表中的第一个位置,就像这样 所以它的变化顺序,这是一个问题-是否有可能阻止haystack改变初始数据-当没有选择查询/方面时,它们都是静态的!或者也许有其他的解决方法-请帮帮我 代码示例(首先是其HTML上下文数据处理程序):Python 如果选择了facet,如何禁用-Django Haystack进行搜索,python,django,solr,Python,Django,Solr,我在奥斯卡CMS项目中使用Django Haystack,我对它从搜索返回所选方面数据的方式有问题 当我没有在菜单中选择任何产品时,solr中面(项目类)的顺序是 但当我选择经典产品时,solr会将选定的方面移动到列表中的第一个位置,就像这样 所以它的变化顺序,这是一个问题-是否有可能阻止haystack改变初始数据-当没有选择查询/方面时,它们都是静态的!或者也许有其他的解决方法-请帮帮我 代码示例(首先是其HTML上下文数据处理程序): 代码示例(SearchForm本身) 类搜索表单(
代码示例(SearchForm本身)
类搜索表单(FacetedSearchForm): CodeSample(Haystack查询,到init facets搜索)
CodeSample(Haystack后端,用于获取方面) 代码示例(Solr_后端,acctual search):
请注意,-facet_counts-是一个实际的facet-当被选中时,数据将被重新排序
如果需要提供任何其他数据-请让我知道,我希望有人能在这方面帮助我,我坚持它-超过一个星期 您可以为没有当前方面的SearchQuerySet创建附加过滤器您可以为没有当前方面的SearchQuerySet创建附加过滤器
T-Shirt
Classic
Classic
T-Shirt
def get_search_context_data(self, context_object_name=None):
context = {'form': self.search_form,
'paginator':self.paginator,
'page_obj': self.page}
BrowseCategoryForm = get_class('search.forms', 'SearchForm')
def __init__(self, request_data, full_path):
self.choice_form = self.get_choice_form(request_data, search_queryset)
def get_choice_form(self,request_data,search_queryset):
form_class = BrowseCategoryForm
data = self.results.facet_counts()['fields']['product_class']
kwargs = {
'data': request_data,
'selected_facets': request_data.getlist("selected_facets"),
'searchqueryset': search_queryset,
'facet_counts':data
}
return form_class(**kwargs)
def __init__(self, *args, **kwargs):
self.facet_counts = kwargs.pop("facet_counts",[])
super(SearchForm, self).__init__(*args, **kwargs)
for field_value, count in self.facet_counts:
choices=[]
field_url = 'product_class_exact:%s' % field_value
choices.append((field_url,field_value))
self.fields['selected_facets'] = forms.ChoiceField(
label=_("Sort by"), choices=choices,
widget=forms.Select(), required=False)
def facet_counts(self):
"""
Returns the facet counts found by the query.
This will cause the query to execute and should generally be used when
presenting the data.
"""
if self.query.has_run():
return self.query.get_facet_counts()
else:
clone = self._clone()
return clone.query.get_facet_counts()
def get_facet_counts(self):
"""
Returns the facet counts received from the backend.
If the query has not been run, this will execute the query and store
the results.
"""
if self._facet_counts is None:
self.run()
return self._facet_counts
def run(self, spelling_query=None, **kwargs):
"""Builds and executes the query. Returns a list of search results."""
final_query = self.build_query()
search_kwargs = self.build_params(spelling_query=spelling_query)
if kwargs:
search_kwargs.update(kwargs)
results = self.backend.search(final_query, **search_kwargs)
print("results Run",results)
self._results = results.get('results', [])
self._hit_count = results.get('hits', 0)
self._facet_counts = self.post_process_facets(results)
self._spelling_suggestion = results.get('spelling_suggestion', None)
def search(self, query_string, **kwargs):
if len(query_string) == 0:
return {
'results': [],
'hits': 0,
}
search_kwargs = self.build_search_kwargs(query_string, **kwargs)
try:
raw_results = self.conn.search(query_string, **search_kwargs)
except (IOError, SolrError) as e:
if not self.silently_fail:
raise
self.log.error("Failed to query Solr using '%s': %s", query_string, e, exc_info=True)
raw_results = EmptyResults()
return self._process_results(raw_results, highlight=kwargs.get('highlight'), result_class=kwargs.get('result_class', SearchResult), distance_point=kwargs.get('distance_point'))