我在django-elasticsearch-dsl中搞不清楚ObjectFields()的过滤语法。特别是,当我尝试对同一个ObjectField()的多个子字段进行过滤时,得到的结果不正确。
例如,请考虑以下文档
class ItemDocument(Document):
product = fields.ObjectField(properties={
'id': fields.IntegerField(),
'name': fields.TextField(),
'description': fields.TextField()
})
details = fields.ObjectField(properties={
'category_id': fields.IntegerField(),
'id': fields.IntegerField(),
'value': fields.FloatField()
})
description = fields.TextField()
我想查找一个包含详细信息对象的Item,该对象同时包含category_id == 3
和value < 1.5
,因此我创建了以下查询
x = ItemDocument.search().filter(Q("match",details__category_id=3) & Q("range",details__value={'lt':1.5})).execute()
不幸的是,这将返回所有包含category_id==3
详细信息对象和value < 1.5
单独详细信息对象的项目,例如
{
"product": ...
"details": [
{
"category_id": 3,
"id": 7,
"value": 20.0
},
{
"category_id": 4,
"id": 7,
"value": 1.0
},
...
]
}
而不是我想要的所有项目的结果,这些项目的详细信息对象同时具有category_id==3
和value < 1.5
,例如
{
"product": ...
"details": [
{
"category_id": 3,
"id": 7,
"value": 1.0
},
...
]
}
我如何使用django-elasticsearch-dsl正确地格式化这个查询?
1条答案
按热度按时间zsbz8rwp1#
你可以在Elasticsearch中使用嵌套查询来过滤同一个ObjectField的多个子字段。下面是一个在django-elasticsearch-dsl中实现的例子:
嵌套查询允许您筛选details对象的多个子字段,并且只返回包含category_id==3且value〈1.5的detail对象的文档。
您还可以将inner_hits选项与嵌套查询一起使用,以获取匹配详细信息对象的详细信息:
这将向每个搜索结果添加一个嵌套字段,其中包含匹配详细信息对象的详细信息。您可以在代码中访问此字段,如下所示: