Rebuild_index不会更新新项目Haystack Elasticsearch Django

时间:2017-11-11 22:23:38

标签: python django elasticsearch django-haystack

一直在寻找这个解决方案但找不到任何东西。我刚开始使用Haystack == 2.6.1并使用Elasticsearch == 2.4.1和Elasticsearch服务器2.4.6。在干草堆getting started之后,我能够执行搜索并获得结果。我跑完后

python manage.py rebuild_index

这是第一次,因为就像我说的那样我能够进行搜索。但后来我向我的数据库添加了3个条目,并尝试重建和/或更新索引。但现在我明白了:

RuntimeWarning: DateTimeField Order.dateEntered received a naive datetime (2017-11-11 16:07:54.324473) while time zone support is active.
  RuntimeWarning)
Indexing 32 orders
GET /haystack/_mapping [status:404 request:0.004s]

所以当我搜索时,我仍然没有看到我的新条目。我现在有35个订单(它只索引了32个),我看到这个404响应GET / haystack / _mapping。 对不起,我是新人,所以有些问题可能看起来很愚蠢:

  1. 希望获得GET的干草堆是什么;我有一个运行elasticsearch的本地服务器,但是它应该也是干草堆服务器吗?
  2. 由于天真的日期时间警告,haystack会无法索引新项目吗?
  3. 每次向数据库添加新项目时,是否必须重新启动elasticsearch服务器?
  4. 更新:早上我重新启动了elasticsearch服务器并重新python manage.py rebuild_index然后它在索引过程中捕获了所有35个!但我尝试再次添加一个条目并重新运行它仍然只对35个项目编制索引 - 现在我有36个,所以它应该索引36个项目。

1 个答案:

答案 0 :(得分:1)

事实证明:

RuntimeWarning: DateTimeField Order.dateEntered received a naive datetime (2017-11-11 16:07:54.324473) while time zone support is active.
  RuntimeWarning)

是个问题。在search_index.py中,它会根据index_queryset函数进行更新。来自'入门'文档index_queryset应如下所示:

def index_queryset(self, using=None):
    """Used when the entire index for model is updated."""
    return self.get_model().objects.filter(pub_date__lte=datetime.datetime.now())

但由于pub_date不是正确的时区,或者因为它是一种天真的格式rebuild_index并未提取最新的项目。所以我使用了django.utils时区日期:

from django.utils import timezone

def index_queryset(self, using=None):
    """Used when the entire index for model is updated."""
    return self.get_model().objects.filter(pub_date__lte=timezone.now())