创建带自定义分析器的Elasticsearch索引时遇illegal_argument_exception
问题分析与解决方案
从错误信息能直接看出问题所在:你使用的Elasticsearch版本应该是7.x或更高,而你的索引配置还在使用ES 6.x及更早版本的废弃/移除特性——_all字段和_parent类型,这才导致了非法参数异常。下面是针对性的修复方案:
1. 替换_all.enabled:用copy_to实现全字段检索
ES 7.x及以后彻底移除了_all字段,如果需要类似的全文检索能力,我们可以通过copy_to把需要聚合检索的字段内容复制到一个自定义的全文字段中(比如命名为all_fields),以此替代_all的功能。
2. 替换_parent:用join字段实现父子文档关系
ES 7+不再支持多文档类型(除了默认的_doc),原来的父子文档关系需要改用join字段来定义,而不能再用旧的_parent设置。
修改后的完整索引配置
下面是适配ES 7+的完整配置,既保留了你需要的西班牙语自定义分析器,又解决了兼容性问题:
{ "index": "ar", "body": { "settings": { "analysis": { "analyzer": { "spanish": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "asciifolding", "spanish_stop", "spanish_stemmer" ] } }, "filter": { "spanish_stemmer": { "type": "stemmer", "language": "light_spanish" }, "spanish_stop": { "type": "stop", "stopwords": "_spanish_" } } } }, "mappings": { "properties": { // 定义join字段实现父子文档关系 "doc_type": { "type": "join", "relations": { "people": ["applications", "resume_details"] } }, // 自定义全文字段,替代原有的_all "all_fields": { "type": "text", "analyzer": "spanish" }, // People类文档字段 "email": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "url": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "created_at": { "type": "date" }, "avatar64": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "description": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "first_name": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "last_name": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "nickname": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "phone": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "state": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "phone2": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "country": { "type": "integer" }, "headline": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "location": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "slug_url": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "zip_code": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "modified_at": { "type": "date" }, // Applications类文档字段 "applicant_name": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "applied_at": { "type": "date" }, "job_id": { "type": "integer" }, "message": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "status": { "type": "boolean" }, // Resume_details类文档字段 "resume_type": { "type": "integer" }, "title": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "grantor": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" }, "resume_message": { "type": "text", "analyzer": "spanish", "search_analyzer": "spanish", "copy_to": "all_fields" } } } } }
关键修改说明
- 分析器优化:我把你定义的
spanish_stop和spanish_stemmer过滤器加到了自定义西班牙语分析器中,这样分词效果会更贴合西班牙语的检索场景,如果你不需要可以直接移除。 - join字段替代_parent:新增
doc_type字段作为join类型,明确people是父文档,applications和resume_details是子文档。 - copy_to替代_all:每个需要参与全文检索的字段都添加了
copy_to: "all_fields",查询all_fields就能实现原_all字段的检索效果。 - 移除多类型:ES 7+仅支持单文档类型(默认
_doc),所以把原来的三个类型合并为一个,用join字段区分文档类别。
数据写入注意事项
写入子文档(applications或resume_details)时,需要指定对应父文档的ID,PHP API示例如下:
$params = [ 'index' => 'ar', 'id' => 'child_app_id', 'body' => [ 'doc_type' => [ 'name' => 'applications', 'parent' => 'parent_people_id' ], 'applicant_name' => 'Juan Perez', // 其他字段... ] ]; $response = $client->index($params);
这样修改后,你就能成功创建索引,同时保留所需的西班牙语分析器和父子文档关系了。
内容的提问来源于stack exchange,提问作者Lautaro Aguirre
相关产品推荐
相关产品推荐

