我在搜索页面上使用了带有ElasticSearch后端的Django Haystack。
我正在使用MongoDB作为数据库。
我的搜索页上的所有内容都正常运行。
问题
我的Web应用程序使用外部脚本通过pymongo
来更改后端数据库中的字段。
我的数据库有2个字段(“文件”,“分析”)。
第三方脚本运行,并将“分析”字段更改为True或False。
运行脚本后,当 我搜索文件名 时,它会 显示更新后的Analysis 结果中的。
但是当 我搜索Analysis字段 时(例如我搜索True / False),这是 未列出当前更新的Analysis ,尽管已更新。
例如
搜索:文件名
结果:文件名True
搜索:True
结果:未找到结果
仅在我更新索引后才可以使用
我尝试过的事情
所以我发现我必须要update_index。但是我不知道如何从外部python脚本进行更新。
我尝试运行
os.system("python /myapp/manage.py update_index")
我得到了错误
Unknown command: 'update_index'
当我检查了外部脚本中可用的管理命令时,它没有列出干草堆命令。
os.system("python /myapp/manage.py")
Available subcommands:
[auth]
#Things under [auth]
[contenttypes]
#Things under [contenttypes]
[django]
#Things under [django]
[sessions]
#Things under [sessions]
[staticfiles]
#Things under [staticfiles]
这里没有显示haystack子命令,与我在终端中运行的相反。
如果我在终端上运行
#other subcommands
[haystack]
build_solr_schema
clear_index
haystack_info
rebuild_index
update_index
所以我希望得到结果
搜索:True
结果:文件名True
如何实现?
如何通过外部脚本进行update_index?
还有其他想法吗?
答案 0 :(得分:0)
这是从代码内执行管理命令的方式:
from django.core.management import call_command
call_command('update_index', *args, **options) # args and opions are optional.
在Django文档中了解更多信息:https://docs.djangoproject.com/en/dev/ref/django-admin/#running-management-commands-from-your-code
答案 1 :(得分:0)
您可以通过将其添加到settings.py来启用实时更新:
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
它将与毁坏update
命令类似,如果映射索引中有任何更新,则会自动触发。
更多详细信息在这里:
在重新索引可能会花费一些时间的情况下,您应该使用队列来防止请求/响应周期受阻,此处建议使用诸如芹菜之类的可能解决方案:
http://django-haystack.readthedocs.io/en/v2.4.1/other_apps.html#ref-other-apps
答案 2 :(得分:0)
最可能的情况是您试图调用命令而不是从 django 所在的虚拟环境中调用。 下面的答案是正确的。但是如果你想以自己的方式调用命令,你应该运行如下:
os.system("/path/to/your/venv/bin/python /myapp/manage.py")