Django-haystack: 如何索引 postgres 的 JSONField?

创建于 2016-06-28  ·  3评论  ·  资料来源: django-haystack/django-haystack

嗨,我不确定这是我未能从文档中找到/理解的内容,还是一个全新的功能。

基本上我有一个项目,其中模型具有由 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?
谢谢!

indexes question

最有用的评论

嗨,有关于 JSONField 索引的任何更新吗? 是否有任何新的好方法来实现这一目标?

所有3条评论

这是一个相对较新的功能,我们还没有特别支持。 如果你只是使用,比如说,标签或其他简单的字段值,你可以简单地使用一个多值字段来放置数据,但 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/

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

isaacpeka picture isaacpeka  ·  3评论

clairempr picture clairempr  ·  3评论

simonsmiley picture simonsmiley  ·  10评论

jpatel3 picture jpatel3  ·  4评论

SteveByerly picture SteveByerly  ·  8评论