索引文档遇错误:only value lists are allowed in serialized settings 求排查
问题分析与解决方案
看起来你在给Elasticsearch索引文档时踩了个端点混淆的坑——错误提示里的only value lists are allowed in serialized settings和Failed to load settings from [...]已经把问题点得很清楚了:你误把要索引的文档数据当成了索引的settings配置来提交,导致ES无法解析。
为什么会出现这个错误?
Elasticsearch对不同操作的请求端点和请求体格式有严格区分:
- 如果你要修改索引的settings或mapping,需要请求
/_settings或/{index}/_mapping这类端点,且请求体必须是ES认可的settings格式(比如参数值大多是列表类型)。 - 但你现在要做的是索引文档,应该用
POST /{index}/_doc(自动生成文档ID)或PUT /{index}/_doc/{id}(指定ID)这类端点,请求体就是你要存储的原始JSON文档。
你的请求被ES当成了settings配置来解析,但文档里的classes、methods等字段根本不是settings的合法参数,自然就抛出了“仅允许值列表”的错误。
一步一步解决问题
1. 用对索引文档的端点
先确认你的请求URL是正确的文档索引端点,比如:
- 自动生成文档ID:
POST /your_index_name/_doc - 手动指定文档ID(比如ID设为1):
PUT /your_index_name/_doc/1
把your_index_name换成你想用的索引名(比如java_code_snippets)。
2. 直接提交你的JSON文档作为请求体
不需要修改你提供的JSON结构,直接把它作为请求体发送给上面的端点就行。这里给你一个curl的示例:
curl -X POST "http://your_es_host:9200/java_code_snippets/_doc" -H "Content-Type: application/json" -d ' { "branch": "master", "classes": [ { "content_count": 2, "documentation": "", "extends": [], "generic": "", "implements": [], "line": 10, "line_count": 36, "modifiers": [ "public" ], "name": "removeDuplicateFromString" } ], "commit_hash": "e53249ba2381d2f20f3d4493ad70e2da0abb3b05", "contributors": [ { "id": "7676016", "name": "varunu28", "url": "https://github.com/varunu28" } ], "enums": [], "fields": [], "filename": "removeDuplicateFromString.java", "imports": [ { "name": "java.io.BufferedReader", "wildcard": false }, { "name": "java.io.InputStreamReader", "wildcard": false } ], "interfaces": [], "license": "", "methods": [ { "cyclomatic_complexity": 1, "documentation": "", "generic": "", "line": 11, "line_count": 9, "modifiers": [ "public", "static" ], "name": "main", "params": [ { "name": "args", "type": "String[]" } ], "parent": "removeDuplicateFromString", "type_": "void" }, { "cyclomatic_complexity": 5, "documentation": "", "generic": "", "line": 29, "line_count": 16, "modifiers": [ "public", "static" ], "name": "removeDuplicate", "params": [ { "name": "s", "type": "String" } ], "parent": "removeDuplicateFromString", "type_": "String" } ], "number_forks": 1695, "number_stars": 4000, "number_watchs": 394, "package": "", "path": "Others", "repository": "TheAlgorithms/Java" } '
记得把your_es_host换成你的ES服务地址(比如localhost:9200)。
3. 可选:预先创建索引(自定义mapping)
如果你想给字段指定特定的类型(比如把commit_hash设为keyword类型方便精确查询),可以先创建索引再索引文档:
# 创建带自定义mapping的索引 PUT /java_code_snippets { "mappings": { "properties": { "branch": {"type": "keyword"}, "commit_hash": {"type": "keyword"}, "filename": {"type": "text"}, "number_stars": {"type": "integer"}, # 其他字段可以按需定义类型,ES也会自动推断类型 } } }
创建完成后,再用上面的POST请求提交文档即可。
验证结果
索引成功后,你可以用下面的命令查询文档,确认数据是否正确存储:
GET /java_code_snippets/_search { "query": { "match": { "filename": "removeDuplicateFromString.java" } } }
内容的提问来源于stack exchange,提问作者thomasvakili
相关产品推荐
相关产品推荐

