Django-Haystack + Whoosh - rebuild_index 后的空索引
Django-Haystack + Whoosh - empty index after rebuild_index
我正在尝试使用 Haystack 和 Whoosh 在我的应用程序中编制索引和搜索。
当我重建索引时,我得到了这个结果:
All documents removed. Updating backend: default default: Backend
doesn't require rebuild. Skipping
这是我的 SearchIndex Class:
class BlogIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True, template_name="snip_text.txt")
headline = indexes.CharField(model_attr="headline", null=True)
body = indexes.CharField(model_attr="body")
def get_model(self):
return Snip
def index_queryset(self, using=None):
"""Used when the entire index for model is updated."""
return self.get_model().objects.filter(date__lte=timezone.now())
这是我的 blog_text.txt 文件(位于 templates/search/indexes/myapp/):
{{ object.headline }}
{{ object.body }}
我将 haystack 添加到 INSTALLED_APPS 及其在设置文件中的配置。
我的数据库是 sqlite(仅用于开发...)。
我做错了什么?
谢谢!
R
更新
像这样创建管理命令(根据需要命名文件 - 例如 my_update_index.py)
from haystack.management.commands import update_index
class Command(update_index.Command):
pass
对 clear_index 命令执行相同的操作。
rebuild_index 命令调用 clear_index 和 update_index,因此即使您创建一个新的重建命令它也不会工作(因为它正在寻找错误的命令).
如果您想重建索引,只需 运行 这两个命令,否则 运行 您的 update_index 命令。
另外注意:模板 txt 文件的文件夹名称必须与您要索引的模型完全相同(索引中的位置无关紧要 Class你写的显然...)。
当然,感谢@solarissmoke
我打赌你的项目中也安装了 Wagtail - 因为那是 Backend doesn't require rebuild 的来源。
问题是 Wagtail 定义了自己的 update_index
管理命令,这与 Haystack 的管理命令冲突(rebuild_index
调用 update_index
)。当您尝试重建索引时,将调用 Wagtail 命令而不是 Haystack 命令。
快速而肮脏的解决方案是确保 haystack
在 wagtail
之后 在 INSTALLED_APPS
中出现 - 它的命令将最后加载并将取代 Wagtail 的。
或者您需要编写自己的管理命令来包装 Haystack 的 rebuild_index
代码。
我正在尝试使用 Haystack 和 Whoosh 在我的应用程序中编制索引和搜索。 当我重建索引时,我得到了这个结果:
All documents removed. Updating backend: default default: Backend doesn't require rebuild. Skipping
这是我的 SearchIndex Class:
class BlogIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True, template_name="snip_text.txt")
headline = indexes.CharField(model_attr="headline", null=True)
body = indexes.CharField(model_attr="body")
def get_model(self):
return Snip
def index_queryset(self, using=None):
"""Used when the entire index for model is updated."""
return self.get_model().objects.filter(date__lte=timezone.now())
这是我的 blog_text.txt 文件(位于 templates/search/indexes/myapp/):
{{ object.headline }}
{{ object.body }}
我将 haystack 添加到 INSTALLED_APPS 及其在设置文件中的配置。 我的数据库是 sqlite(仅用于开发...)。
我做错了什么?
谢谢!
R
更新
像这样创建管理命令(根据需要命名文件 - 例如 my_update_index.py)
from haystack.management.commands import update_index
class Command(update_index.Command):
pass
对 clear_index 命令执行相同的操作。
rebuild_index 命令调用 clear_index 和 update_index,因此即使您创建一个新的重建命令它也不会工作(因为它正在寻找错误的命令).
如果您想重建索引,只需 运行 这两个命令,否则 运行 您的 update_index 命令。
另外注意:模板 txt 文件的文件夹名称必须与您要索引的模型完全相同(索引中的位置无关紧要 Class你写的显然...)。
当然,感谢@solarissmoke
我打赌你的项目中也安装了 Wagtail - 因为那是 Backend doesn't require rebuild 的来源。
问题是 Wagtail 定义了自己的 update_index
管理命令,这与 Haystack 的管理命令冲突(rebuild_index
调用 update_index
)。当您尝试重建索引时,将调用 Wagtail 命令而不是 Haystack 命令。
快速而肮脏的解决方案是确保 haystack
在 wagtail
之后 在 INSTALLED_APPS
中出现 - 它的命令将最后加载并将取代 Wagtail 的。
或者您需要编写自己的管理命令来包装 Haystack 的 rebuild_index
代码。