我们要索引和查询的文档类型包含变量键,但按如下方式分组到一个公共根密钥中:
{
"articles": {
"0000000000000000000000000000000000000001": {
"crawled_at": "2016-05-18T19:26:47Z",
"language": "en",
"tags": [
"a",
"b",
"d"
]
},
"0000000000000000000000000000000000000002": {
"crawled_at": "2016-05-18T19:26:47Z",
"language": "en",
"tags": [
"b",
"c",
"d"
]
}
},
"articles_count": 2
}
我们想要问:哪些文件包含带有标签“b”和“d”的文章,语言为“en”。
我们不使用文章列表的原因是,elasticsearch可以有效地自动将文档与部分更新合并。然而,挑战是将变量键下的对象索引。我们尝试的一种可能方法是使用dynamic_templates,如下所示:
{
"sources": {
"dynamic": "strict",
"dynamic_templates": [
{
"article_template": {
"mapping": {
"fields": {
"crawled_at": {
"format": "dateOptionalTime",
"type": "date"
},
"language": {
"index": "not_analyzed",
"type": "string"
},
"tags": {
"index": "not_analyzed",
"type": "string"
}
}
},
"path_match": "articles.*"
}
}
],
"properties": {
"articles": {
"dynamic": false,
"type": "object"
},
"articles_count": {
"type": "integer"
}
}
}
}
但是,此动态模板失败,因为插入文档时,可以在日志中找到以下内容:
[2016-05-30 17:44:45,424] [WARN] [index.codec] [node] [main]找不到字段的索引映射器: [articles.000000000000000000000000000000000000000000001.language]返回 默认发布格式
同样适用于其他两个领域。当我试图查询某篇文章的存在时,甚至文章都没有返回任何文档(没有错误但是空命中):
curl -LsS -XGET'localhost:9200 / main / sources / _search'-d'{“query”:{“exists”:{“field”:“articles”}}}'
当我查询articles_count的存在时,它会返回所有内容。我们试图实现的目标是否存在轻微错误,例如在架构中:文章作为属性和动态模板的定义?类型和动态错误怎么样?路径似乎是正确的。也许这不可能在变量键中定义对象的模板,但它应该根据文档。
否则,如果可能的话,可以在不更改文档的情况下使用哪些替代方法?
备注:我们在同一个索引main
中有其他类型也有这些字段,如语言,我会忽略它是否会影响。我们使用的ES版本是1.7.5(我们现在无法升级到2.X)。