22

我对 ES 文档感到困惑,实际上他们在这里声明索引必须放在映射目录(和 indexname 子目录)中:

映射可以在名为 [mapping_name].json 的文件中定义,并放置在 config/mappings/_default 位置或 config/mappings/[index_name] 下(对于应该仅与特定索引关联的映射)。

但是“配置”部分中,它指出:

索引模板也可以放置在模板目录下的配置位置 (path.conf) 中(注意,确保将它们放置在所有符合条件的主节点上)。例如,一个名为 template_1.json 的文件可以放在 config/templates 下,如果它与索引匹配,它将被添加。

我把我的映射/config/mappings/myindexname/mappinfile.json,它就像:

{
    "template": "maincontentindex",
    "settings": {
        "index": {
            "analysis": {
                "analyzer": {
                    "htmlStrippingAnalyzer": {
                        "tokenizer": "standard",
                        "filter": ["standard", "lowercase"],
                        "char_filter": "html_strip"
                    }
                }
            }
        }
    },

    "mappings": {
        "rendition": {
            "_timestamp": {
                "enabled": true,
                "store" : true
            },
            "properties": {
                "key": {
                    "type": "string",
                    "store": "yes",
                    "analyzer": "keyword"
                },
                "parentPage": {
                    "type": "string",
                    "store": "yes",
                    "analyzer": "keyword"
                },
                "type": {
                    "type": "string",
                    "store": "yes",
                    "analyzer": "keyword"
                },
                "language": {
                    "type": "string",
                    "store": "yes",
                    "analyzer": "keyword"
                },
                "device": {
                    "type": "string",
                    "store": "yes",
                    "analyzer": "keyword"
                },
                "territory": {
                    "type": "string",
                    "store": "yes",
                    "analyzer": "keyword"
                },
                "channel": {
                    "type": "string",
                    "store": "yes",
                    "analyzer": "keyword"
                },
                "template": {
                    "type": "string",
                    "store": "yes",
                    "analyzer": "keyword"
                },
                "meta": {
                    "properties": {
                        "content": {
                            "type": "string",
                            "store": "yes"
                        }
                    }
                }       
            }
        }
    }
}

如果我使用 REST Api 将它放在服务器中,它可以正常工作,如果我调用 /maincontentindex/rendition/_mapping 我只会得到上述结构(即使没有数据)。

但是对于目录,我只得到一个 404,如果我插入任何东西,它只是通常的动态映射。

4

1 回答 1

32

映射和模板之间是有区别的。

映射包含您的字段以及您希望如何在弹性搜索中索引/存储它们。它们指的是特定的索引和类型(或使用_default_特殊类型时同一索引中的多个类型)。您可以在创建索引时通过create index api提交映射,也可以通过put mapping api修改现有索引的映射。

索引模板是一种自动将映射和索引设置应用于将在未来创建的索引的方法,这些索引的名称与指定的模式匹配。假设映射是索引模板的一部分。索引模板也可以包含多种类型的映射和索引设置。

如果你有一个索引模板,你可以把它放在templates参考文献中提到的下面。如果你有一个类型的映射,你需要把它放在mappings目录下。

您粘贴到问题中的json是一个索引模板,它需要放在templates文件夹下,而不是文件夹下mappings。您使用所描述的 get mapping api 返回的不是您所说的模板本身,而是您在 url 中指定的索引/类型的当前映射(仅模板的映射部分)。

另外,我建议您使用 elasticsearch 提供的 REST api。在文件系统上使用文件看起来并不像 elasticsearch 的做事方式。

于 2013-09-17T17:10:43.690 回答