我正在尝试使用elasticsearch为电子商务网站构建方面导航。
商店产品可以有多种变体。我想到的文档结构如下所示:
PUT /products_test/product/1
{
"id": "1",
"manufacturer": "foobar",
"categories": [
"28554568",
"28554577",
"28554578"
],
"variants": [
{
"id": "1_a",
"color": "blue",
"size": "L"
"price": "67.99"
},
{
"id": "1_b",
"color": "red",
"size": "L"
"price": "69.99"
}
]
}
我将变体定义为嵌套类型。这样,以下查询将返回包含与过滤器匹配的变体的所有文档:
POST /products_test/product/_search
{
"query": {
"filtered": {
"query": {"match_all": {}},
"filter": {
"and": [
{"term": {"categories": "28554568"}},
{"terms": {
"variants.color": [
"red"
]
}}
]
}
}
}
}
现在,我真的想获得与过滤器匹配的变体的ID,以便在类别页面上显示该产品的变体。因此,在示例的情况下,我希望返回第二个变量(1_b)的id。我只获取结果集中返回的文档的id。有没有办法从嵌套对象中定义一个值也可以返回?
答案 0 :(得分:1)
目前无法获取与查询匹配的嵌套文档。这是一个known issue,并且已经给予修复它的工作/思考。该问题的当前状态是需要重构Elasticsearch的获取阶段以支持此功能。
这很重要并且会发生,因为重构也会使弹性搜索的其他部分受益,但它是一个主要的重构。当它可用时,目前没有ETA。
我会考虑对数据进行非规范化,以便每个变体包含“根对象”数据,然后在客户端内进行分组。
或者,您可以调查父/子映射但是类似的限制适用(无法确定哪个子项与has_child
查询匹配),但它确实提供了更多的灵活性,因为子项是可以搜索的独立文档