date_facet 在 Django Haystack 中未按日期分面
date_facet in Django Haystack not faceting by date
我将 Haystack 2.8.1 与 Django 2.1 和 Solr 6.6.6 一起使用。
我在使用分面方面没有问题,但是日期分面不起作用。
我的指数:
class ConflitoIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
data_inicio = indexes.DateField(model_attr="data_inicio", faceted=True, null=True)
def get_model(self):
return Conflito
def index_queryset(self, using=None):
return self.get_model().objects.all()
shell 上的以下脚本:
from haystack.query import SearchQuerySet
import datetime
sqs = SearchQuerySet().date_facet("data_inicio", start_date=datetime.date(1980, 1, 1), end_date=datetime.date(2019, 1, 1), gap_by="year")
结果:
In [1]: sqs.facet_counts()
Out[1]: {'fields': {}, 'dates': {}, 'queries': {}}
但是,以下脚本会导致:
In [1]: from haystack.query import SearchQuerySet
In [2]: import datetime
In [3]: sqs = SearchQuerySet().facet('data_inicio')
In [4]: sqs.facet_counts()
Out[4]:
{'fields': {'data_inicio': [('1500-01-01T00:00:00Z', 212),
('1986-12-29T00:00:00Z', 148),
('2010-01-01T00:00:00Z', 141),
('1979-12-29T00:00:00Z', 130),
('2018-01-01T00:00:00Z', 104),
('1984-12-29T00:00:00Z', 100),
...
('2013-10-16T00:00:00Z', 17),
('1982-12-02T00:00:00Z', 16),
('1988-02-28T00:00:00Z', 16),
('1996-05-29T00:00:00Z', 16),
('1998-03-29T00:00:00Z', 16),
('2000-01-31T00:00:00Z', 16)]},
'dates': {},
'queries': {}}
因此,分面不适用于日期。我的代码有什么问题?不幸的是,Haystack 文档中的日期分面示例很少。
最好的,
艾伦
这是因为 facet.date API 在 Solr 6.6 中消失了,取而代之的是 facet.range。在 Solr doc and issue #1572
中找到更多详细信息
要解决,请考虑 PR #1690:
固定后端
在 generic_views 上添加属性 date_facet_fields
接收 date_facet kwargs 列表。例如:
# your views.py
import datetime
...
class YourFacetedSearchView(FacetedSearchView):
date_facet_fields = [
{'field': 'data_inicio',
'start_date': datetime.date(1980, 1, 1),
'end_date': datetime.date.today(),
'gap_by': 'year'},
]
facet_fields = [...]
...
此致,
法比奥
我将 Haystack 2.8.1 与 Django 2.1 和 Solr 6.6.6 一起使用。
我在使用分面方面没有问题,但是日期分面不起作用。
我的指数:
class ConflitoIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
data_inicio = indexes.DateField(model_attr="data_inicio", faceted=True, null=True)
def get_model(self):
return Conflito
def index_queryset(self, using=None):
return self.get_model().objects.all()
shell 上的以下脚本:
from haystack.query import SearchQuerySet
import datetime
sqs = SearchQuerySet().date_facet("data_inicio", start_date=datetime.date(1980, 1, 1), end_date=datetime.date(2019, 1, 1), gap_by="year")
结果:
In [1]: sqs.facet_counts()
Out[1]: {'fields': {}, 'dates': {}, 'queries': {}}
但是,以下脚本会导致:
In [1]: from haystack.query import SearchQuerySet
In [2]: import datetime
In [3]: sqs = SearchQuerySet().facet('data_inicio')
In [4]: sqs.facet_counts()
Out[4]:
{'fields': {'data_inicio': [('1500-01-01T00:00:00Z', 212),
('1986-12-29T00:00:00Z', 148),
('2010-01-01T00:00:00Z', 141),
('1979-12-29T00:00:00Z', 130),
('2018-01-01T00:00:00Z', 104),
('1984-12-29T00:00:00Z', 100),
...
('2013-10-16T00:00:00Z', 17),
('1982-12-02T00:00:00Z', 16),
('1988-02-28T00:00:00Z', 16),
('1996-05-29T00:00:00Z', 16),
('1998-03-29T00:00:00Z', 16),
('2000-01-31T00:00:00Z', 16)]},
'dates': {},
'queries': {}}
因此,分面不适用于日期。我的代码有什么问题?不幸的是,Haystack 文档中的日期分面示例很少。
最好的, 艾伦
这是因为 facet.date API 在 Solr 6.6 中消失了,取而代之的是 facet.range。在 Solr doc and issue #1572
中找到更多详细信息要解决,请考虑 PR #1690:
固定后端
在 generic_views 上添加属性
date_facet_fields
接收 date_facet kwargs 列表。例如:
# your views.py
import datetime
...
class YourFacetedSearchView(FacetedSearchView):
date_facet_fields = [
{'field': 'data_inicio',
'start_date': datetime.date(1980, 1, 1),
'end_date': datetime.date.today(),
'gap_by': 'year'},
]
facet_fields = [...]
...
此致,
法比奥