使用Logstash导入SQL Server数据到Elasticsearch后查询返回Null问题求助
我之前也碰到过一模一样的情况——Logstash控制台能正常打出所有数据,但Elasticsearch里查询全是null,大概率是数据从Logstash流向ES的环节出了问题,咱们一步步来排查:
先把你的配置贴出来方便分析(注意你密码部分没写完,后续要确保是完整的合法字符串):
input { jdbc { jdbc_driver_library => "/home/krishna.shah/Krishna/sqljdbc4-chs-4.0.2206.100.jar" jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver" jdbc_connection_string => "jdbc:sqlserver://localhost:1433;databaseName=master" jdbc_user => "**" jdbc_password => "****@123" statement => "select * FROM ****g" jdbc_paging_enabled => "true" jdbc_page_size => "50000" } } output { elasticsearch{ hosts => "localhost:9200" index => "krishna" document_type => "docc" document_id => "%{id}" sniffing => true user => "**" password =>&... } }
1. 先排查Document ID配置问题
你用了document_id => "%{id}",这里要注意两个关键点:
- 你的SQL Server表中真的存在一个叫
id的字段吗?(Logstash的字段是区分大小写的,但SQL Server默认不区分,比如表中字段是ID,Logstash会解析成ID而非id,此时%{id}会是空值) - 如果字段名不匹配,ES会因为无法生成合法的文档ID导致写入异常,最终查询结果就是null。
解决办法:先把这行注释掉,让ES自动生成文档ID,看看数据能不能正常写入。如果可以,再确认表中的主键字段名,改成对应的%{你的主键字段名}(比如%{ID})。
2. 检查ES版本与document_type的冲突
如果你的Elasticsearch是7.x及以上版本,document_type这个配置已经被官方移除了!保留这行配置会导致Logstash写入ES时出错,数据根本没成功写入,自然查出来是null。直接删掉document_type => "docc"这一行即可。
3. 确认Logstash发送给ES的真实数据结构
控制台能看到数据,但可能Logstash传给ES的字段存在问题(比如字段名带特殊字符、类型不兼容)。你可以在output里新增一个stdout输出,用rubydebug codec更清晰地查看发送给ES的完整数据:
output { stdout { codec => rubydebug } elasticsearch{ # 你的原有ES配置... } }
运行后对比控制台输出的字段和ES索引里的字段,就能快速发现是不是有字段没映射上,或者类型不一致。
4. 字段映射与类型兼容性问题
ES的默认映射可能和SQL Server的字段类型不兼容,比如SQL里的datetime、decimal类型,Logstash解析后的数据类型和ES默认映射不匹配,导致写入时被转成null。
解决办法:
- 手动创建
krishna索引的映射,指定每个字段的正确类型; - 或者在Logstash的filter环节用
mutate插件转换字段类型,比如:
filter { mutate { convert => { "age" => "integer" } convert => { "price" => "float" } } }
5. 其他细节排查
sniffing => true:如果你的ES是单节点部署,这个配置可能会导致Logstash找不到节点,改成sniffing => false试试;- 权限问题:确认你配置的ES用户有写入
krishna索引的权限,用这个用户调用ES的API手动写一条测试数据,验证权限是否正常; - 密码配置:你原来的
password =>&...明显不完整,要确保是完整的密码字符串,比如password => "****@123"。
最后,运行Logstash时加上--debug参数,查看详细日志,里面会记录写入ES时的错误信息(比如字段类型不匹配、权限不足),这是最快定位问题的方法。
内容的提问来源于stack exchange,提问作者Krishna Shah

