安装Linkedin WhereHows时Elasticsearch索引创建失败求助
我来帮你一步步搞定这两个问题,其实都是Elasticsearch 6.x版本的特性限制导致的,咱们逐个解决:
第一个问题:Content-Type header不支持的错误
Elasticsearch从6.x版本开始,要求所有带请求体的POST/PUT请求必须明确指定Content-Type: application/json请求头,而默认的curl请求会用application/x-www-form-urlencoded,这就触发了406错误。你已经尝试添加这个请求头是对的,这一步没问题,接下来的错误才是核心问题。
第二个问题:多Mapping Type被拒绝的错误
这个错误的原因很明确:Elasticsearch 6.x不允许单个索引存在多个Mapping Type(比如你这里的field、comment、dataset三个type)。这是ES 6.x的重要更新限制(到7.x直接移除了Type概念),而WhereHows的官方文档大概率是基于ES 5.x及以前版本编写的,所以默认配置会把多个type放到同一个索引下,这在6.x里就会报错。
最稳妥的解决方案:拆分索引
既然一个索引不能有多个type,那我们就给每个type单独创建对应的索引,然后修改WhereHows的配置指向这些新索引:
分别创建独立索引
针对每个type创建单独的索引,每个索引只包含对应的mapping。比如:- 创建
wherehows_dataset索引:curl -XPUT 'http://localhost:9200/wherehows_dataset' -H "Content-Type: application/json" -d '{ "mappings": { "dataset": { "properties": { // 这里粘贴原配置中dataset对应的mapping属性 } } } }' - 同理创建
wherehows_field和wherehows_comment索引,分别对应各自的mapping内容。
- 创建
修改WhereHows的配置文件
找到WhereHows配置目录下的elasticsearch相关配置(一般是application.conf或者单独的elasticsearch.conf),找到类似下面的配置项:elasticsearch.index.dataset = "wherehows" elasticsearch.index.field = "wherehows" elasticsearch.index.comment = "wherehows"修改为每个type对应的新索引名:
elasticsearch.index.dataset = "wherehows_dataset" elasticsearch.index.field = "wherehows_field" elasticsearch.index.comment = "wherehows_comment"验证配置
重启WhereHows服务后,尝试触发数据同步,或者用curl验证索引是否正常读写,比如:curl 'http://localhost:9200/wherehows_dataset/_search?pretty'
备选方案:合并为单个Type(不推荐)
如果你不想拆分索引,可以把所有type合并成ES 6.x允许的单个type(比如统一用_doc),但这种方法需要修改所有mapping的type名称,同时调整WhereHows代码或配置中对应的type参数,容易引发其他兼容性问题,所以更推荐拆分索引的方案。
内容的提问来源于stack exchange,提问作者lampShadesDrifter

