我是ElasticSearch的新手,在使用嵌套映射/查询时遇到了问题。
我在索引中添加了以下数据结构:
{
"_id": "3",
"_rev": "6-e9e1bc15b39e333bb4186de05ec1b167",
"skuCode": "test",
"name": "Dragon vol. 1",
"pages": [
{
"id": "1",
"tags": [
{
"name": "dragon"
},
{
"name": "japonese"
}
]
},
{
"id": "2",
"tags": [
{
"name": "tagforanotherpage"
}
]
}
]
}
该索引映射定义如下:
{
"metabook" : {
"metabook" : {
"properties" : {
"_rev" : {
"type" : "string"
},
"name" : {
"type" : "string"
},
"pages" : {
"type" : "nested",
"properties" : {
"tags" : {
"properties" : {
"name" : {
"type" : "string"
}
}
}
}
},
"skuCode" : {
"type" : "string"
}
}
}
}
}
我的目标是搜索包含特定标签的所有页面,并返回带有过滤页面列表的图书对象(我希望ES只返回与给定标签匹配的页面)。类似(忽略第二页):
{
"_id": "3",
"_rev": "6-e9e1bc15b39e333bb4186de05ec1b167",
"skuCode": "test",
"name": "Dragon vol. 1",
"pages": [
{
"id": "1",
"tags": [
{
"name": "dragon"
},
{
"name": "japonese"
}
]
}
]
}
以下是我实际使用的查询:
{
"from": 0,
"size": 10,
"query" : {
"nested" : {
"path" : "pages",
"score_mode" : "avg",
"query" : {
"term" : { "tags.name" : "japonese" }
}
}
}
}
但它实际上返回了一个空结果。我做错了什么?也许我应该直接索引我的"页面"而不是书籍?我错过了什么?
提前谢谢!
遗憾的是,您不能只返回文档的一部分。如果文档与查询匹配,您将取回整个文档;根和所有嵌套的文档。如果你只想取回部分,那么你可以考虑使用父/子文档。
此外,由于嵌套查询中有一个小语法错误,因此您没有看到任何命中。仔细查看字段名称:
{
"from": 0,
"size": 10,
"query" : {
"nested" : {
"path" : "pages",
"score_mode" : "avg",
"query" : {
"term" : { "pages.tags.name" : "japonese" }
}
}
}
}
如果您需要亲子文档方面的帮助,请随时询问!(如果你在谷歌上搜索,应该有一些例子)
祝你好运!