如何从外部脚本为干草堆更新_索引?

时间:2019-06-29 06:14:59

标签: python django elasticsearch django-haystack pyelasticsearch

我在搜索页面上使用了带有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?
还有其他想法吗?

3 个答案:

答案 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/signal_processors.html#realtime-realtimesignalprocessor

在重新索引可能会花费一些时间的情况下,您应该使用队列来防止请求/响应周期受阻,此处建议使用诸如芹菜之类的可能解决方案:

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")