elasticsearch dsl集成python中indices.analyze方法参数analyzer的坑(调用es的analyze接口分析字符串)

本文记录了作者在Python中使用Elasticsearch的indices.analyze接口时遇到的问题及解决过程,详细介绍了如何正确配置IK分词器,并提供了一个有效的示例。

    今天在做elasticsearch的过程中遇上大坑,填坑过程

    在python中调用elasticsearch的indices.analyze接口的过程中,本来看网上的文章是这样写的

result = es.indices.analyze(index=index,body=text,analyzer='ik_max_word' params={'filter':["lowercase"]} )

    调试过程中,WTF,为什么走不动,看错误提示是在这一句,然后就ctrl点进去analyze方法。

    一看就发现,原来源码中没有analyzer这个参数啊,为啥资料有的!?不管了,赶紧看看究竟怎么配置。原来源码中给出了在body这个参数配置分析器和文档类型:

 :arg body: Define analyzer/tokenizer parameters and the text on which
            the analysis should be performed

    这就好办了,但是我试过ABCDEFG种方法,发现都配置不对,而且网上资料为0,是零........,然后看到后面params的方法,突然想到会不会就是按照elasticsearch那样子写字典呢,那么elasticsearch是怎么写分析器的呢?是这样:

GET _analyze
{
    "analyzer" = "ik_max_word",
    "text":需要分析的文档
}

    一看就好办了,照抄一波

result= es.indices.analyze(index=index,body={'text':text,'analyzer':"ik_max_word"}, params={'filter':["lowercase"]} )
    成功了,这里注意,text是我之前就传进来的参数,所以不要写成“text ”
{"类型": "服务器", "时间戳": "2025-08-26T14:17:52,022Z", "级别": "警告", "组件": "r.suppressed", "集群名称": "docker-cluster", "节点名称": "eb381a9b7fb1", "消息": "路径:/_analyze参数:{pretty=true}", "集群UUID": "NWxgy8T0SrmZf-idm0rmjg", "节点ID": "GASFU1S6RKSSSR8M3qkUqQ" , "堆栈跟踪": ["org.elasticsearch.transport.RemoteTransportException: [eb381a9b7fb1][172.19.0.3:9300][indices:admin/analyze[s]]", "原因:java.lang.NullPointerException(空指针异常):无法调用 \"org.wltea.analyzer.dic.DictSegment.match(char[], int, int)\" 方法,因为 \"org.wltea.analyzer.dic.Dictionary.singleton._StopWords\" 为 null(空值)", "在 org.wltea.analyzer.dic.Dictionary.isStopWord(Dictionary.java:377) 位置 ~[?:?]", "在 org.wltea.analyzer.core.AnalyzeContext.getNextLexeme(AnalyzeContext.java:325) 位置 ~[?:?]", "在 org.wltea.analyzer.core.IKSegmenter.next(IKSegmenter.java:95) 位置 ~[?:?]", "在 org.wltea.analyzer.lucene.IKTokenizer.incrementToken(IKTokenizer.java:88) 位置 ~[?:?]", "在 org.elasticsearch.action.admin.indices.analyze.TransportAnalyzeAction.simpleAnalyze(TransportAnalyzeAction.java:222) 位置 ~[elasticsearch-7.12.1.jar:7.12.1]", "在 org.elasticsearch.action.admin.indices.analyze.TransportAnalyzeAction.analyze(TransportAnalyzeAction.java:204) 位置 ~[elasticsearch-7.12.1.jar:7.12.1]", "在 org.elasticsearch.action.admin.indices.analyze.TransportAnalyzeAction.analyze(TransportAnalyzeAction.java:127) 位置 ~[elasticsearch-7.12.1.jar:7.12.1]", "在 org.elasticsearch.action.admin.indices.analyze.TransportAnalyzeAction.shardOperation(TransportAnalyzeAction.java:110) 位置 ~[elasticsearch-7.12.1.jar:7.12.1]", "在 org.elasticsearch.action.admin.indices.analyze.TransportAnalyzeAction.shardOperation(TransportAnalyzeAction.java:62) 位置 ~[elasticsearch-7.12.1.jar:7.12.1]", "在 org.elasticsearch.action.support.single.shard.TransportSingleShardAction.lambda$asyncShardOperation$0(TransportSingleShardAction.java:99) 位置 ~[elasticsearch-7.12.1.jar:7.12.1]", "在 org.elasticsearch.action.ActionRunnable.lambda$supply$0(ActionRunnable.java:47) 位置 [elasticsearch-7.12.1.jar:7.12.1]", "在 org.elasticsearch.action.ActionRunnable$2.doRun(ActionRunnable.java:62) 位置 ~[elasticsearch-7.12.1.jar:7.12.1]", "在 org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:732) 位置 [elasticsearch-7.12.1.jar:7.12.1]", "在 org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26) 位置 [elasticsearch-7.12.1.jar:7.12.1]", "在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) 位置 [?:?]", "在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) 位置 [?:?]", "在 java.lang.Thread.run(Thread.java:831) 位置 [?:?]"] }
最新发布
08-27
Elasticsearch 7.12.1 中调用 IKAnalyzer 的分析接口 `/_analyze` 时出现 `NullPointerException`,错误堆栈指向 `Dictionary.singleton._StopWords` 为 null,通常与 IK 分词器的初始化过程有关。IKAnalyzer 在加载停用词(stopwords)或用户自定义词典时未能正确初始化,导致某些字段访问时抛出空指针异常。 ### 原因分析 1. **词典文件路径配置错误** IKAnalyzer 在启动时会尝试加载配置的停用词文件和用户自定义词典文件。如果文件路径配置错误、文件缺失或权限不足,可能导致 `_StopWords` 等内部变量未能正确初始化为非空对象,从而引发空指针异常[^1]。 2. **词典未正确加载** Elasticsearch 插件机制中,IKAnalyzer 作为插件加载时,其词典资源的加载依赖于插件的初始化流程。若在插件初始化阶段未能正确读取词典文件内容,可能导致全局单例 `Dictionary.singleton` 中的 `_StopWords` 等字段为 null。 3. **版本兼容性问题** Elasticsearch 7.12.1 是一个较老的长期支持版本,而 IKAnalyzer 插件可能存在与该版本不完全兼容的情况,尤其是在插件更新或升级过程中未正确迁移词典配置。 ### 解决方案 1. **检查词典文件路径配置** 确保 `IKAnalyzer.cfg.xml` 中配置的 `stopwords` 和 `ext_dict` 路径正确,并且 Elasticsearch 有权限读取这些文件。例如: ```xml <entry key="stopwords">/path/to/elasticsearch/plugins/ik-analyzer/config/stopwords.dic</entry> <entry key="ext_dict">/path/to/elasticsearch/plugins/ik-analyzer/config/custom.dic</entry> ``` 检查文件是否存在,并确保路径为 Elasticsearch 插件目录下的相对路径或绝对路径。 2. **确保词典文件存在且格式正确** 停用词文件 `stopwords.dic` 应为 UTF-8 编码的文本文件,每行一个停用词。若文件为空或格式错误,可能导致加载失败,进而 `_StopWords` 为 null。 3. **重新安装 IKAnalyzer 插件** 如果怀疑插件加载异常,可以尝试卸载并重新安装 IKAnalyzer 插件: ```bash bin/elasticsearch-plugin remove ik bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip ``` 安装完成后重启 Elasticsearch 服务。 4. **检查插件日志与堆栈跟踪** 查看 Elasticsearch 日志中关于 IKAnalyzer 插件加载的详细信息,确认词典加载阶段是否出现警告或错误。例如: ``` [ERROR][c.j.d.a.i.IKDictionary] Failed to load stop words file: /path/to/stopwords.dic ``` 这类日志可以帮助定位词典加载失败的具体原因。 5. **升级至兼容版本或补丁** 如果使用的是第三方构建的 IKAnalyzer 插件,建议切换至官方维护的版本,或查看是否存在针对 Elasticsearch 7.12.1 的修复补丁。 ### 示例:验证 IKAnalyzer 配置是否生效 调用 `/_analyze` 接口测试配置是否正常: ```json POST /_analyze { "analyzer": "ik_max_word", "text": "测试文本" } ``` 如果返回分词结果且无异常,则配置已修复。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值