嗨,我不确定这是我未能从文档中找到/理解的内容,还是一个全新的功能。
基本上我有一个项目,其中模型具有由 Postgres 的 JSONField 提供支持的“自定义属性”系统。 这允许用户将 json 文档添加到每个对象的属性集。
我希望能够搜索(通过 ES)这些字段,就像它们是任何其他属性一样。
举个例子:
# models.py
class MyModel(models.Model):
name = models.CharField()
attrs = postgres.fields.JSONField(default=dict)
# how I'd expect ES documents to look like:
{
...,
"name": "banana",
"attrs" : { "fruitColor": "yellow", "growsOnTrees": true}
},
{
...,
"name": "samuel",
"attrs" : { "friends": ["mark", "francesca", "luke"], "birthday": "10/10/1990"}
}
我应该使用什么类型的 SearchField?
谢谢!
这是一个相对较新的功能,我们还没有特别支持。 如果你只是使用,比如说,标签或其他简单的字段值,你可以简单地使用一个多值字段来放置数据,但 Haystack 往往不支持不能跨搜索后端移植的东西,比如 ElasticSearch 的嵌套对象。
您肯定需要一个自定义的prepare_
方法(http://django-haystack.readthedocs.io/en/v2.4.1/searchindex_api.html#advanced-data-preparation)来打包数据但嵌套JSON 的能力将使这变得复杂。
这样的事情应该适用于将数据放入 ElasticSearch 或 Solr 动态字段:
def prepare(self, obj):
prepared_data = super(…)
# Add fields from your JSON data
return prepared_data
(对于类似于friends
列表的内容,只要您将该字段定义为多值字段,它就会起作用)
Haystack 不会尝试验证查询中的字段名称,因此只要您知道键值,您就应该能够进行过滤。 我认为将是棘手的 - 可能最好通过获取 ES 连接对象(例如使用searchqueryset.query.backend.conn
Solr )来解决,这需要变得更容易 - 将是更复杂的嵌套查询。
嗨,有关于 JSONField 索引的任何更新吗? 是否有任何新的好方法来实现这一目标?
@kristoff-it @cacarrara说到为嵌套字段数据类型,这对于动态增加相同类型的字段可能很有用。
如果您使用的是 Elasticsearch,您可以自定义 haystack 后端,您可以参考这里
http://www.stamkracht.com/blog/extending-haystacks-elasticsearch-backend/
最有用的评论
嗨,有关于 JSONField 索引的任何更新吗? 是否有任何新的好方法来实现这一目标?