我是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" }
}
}
}
}
但实际上它返回一个空结果。我究竟做错了什么 ?也许我应该直接索引我的“页面”而不是书籍?我错过了什么?
提前谢谢!
答案 0 :(得分:1)
可悲的是,你不能只回到文件的一部分。如果文档与查询匹配,您将获得整个事情;根和所有嵌套文档。如果您只想获得部件,那么您可以查看使用父/子文档。
由于嵌套查询中的语法错误很少,因此您没有看到任何匹配。仔细查看字段名称:
{
"from": 0,
"size": 10,
"query" : {
"nested" : {
"path" : "pages",
"score_mode" : "avg",
"query" : {
"term" : { "pages.tags.name" : "japonese" }
}
}
}
}
如果您需要有关父母的帮助文档,请随时提出! (如果您进行谷歌搜索,应该有例子)
祝你好运!