django 对Elasticsearch ObjectField()中的多个字段进行筛选

j9per5c4  于 2022-12-05  发布在  Go
关注(0)|答案(1)|浏览(165)

我在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 == 3value < 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==3value < 1.5,例如

{
  "product": ...
  "details": [
    {
      "category_id": 3,
      "id": 7,
      "value": 1.0
    },
    ...
]
}

我如何使用django-elasticsearch-dsl正确地格式化这个查询?

zsbz8rwp

zsbz8rwp1#

你可以在Elasticsearch中使用嵌套查询来过滤同一个ObjectField的多个子字段。下面是一个在django-elasticsearch-dsl中实现的例子:

x = ItemDocument.search().query(
    "nested",
    path="details",
    query=Q("match", details__category_id=3) & Q("range", details__value={'lt':1.5})
).execute()

嵌套查询允许您筛选details对象的多个子字段,并且只返回包含category_id==3且value〈1.5的detail对象的文档。
您还可以将inner_hits选项与嵌套查询一起使用,以获取匹配详细信息对象的详细信息:

x = ItemDocument.search().query(
    "nested",
    path="details",
    query=Q("match", details__category_id=3) & Q("range", details__value={'lt':1.5}),
    inner_hits={}
).execute()

这将向每个搜索结果添加一个嵌套字段,其中包含匹配详细信息对象的详细信息。您可以在代码中访问此字段,如下所示:

results = x.to_dict()
for result in results['hits']['hits']:
    nested_results = result['inner_hits']['details']['hits']['hits']
    # do something with nested_results

相关问题