Elasticsearch索引动态键下的同源对象

时间:2016-05-31 09:39:41

标签: elasticsearch

我们要索引和查询的文档类型包含变量键,但按如下方式分组到一个公共根密钥中:

{
    "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)。

0 个答案:

没有答案