NLPchina / elasticsearch-analysis-ansj

Apache License 2.0
638 stars 191 forks source link

2.4.5版本中flush/dic接口奇怪现象 #198

Open cuimo4183 opened 3 years ago

cuimo4183 commented 3 years ago

你好,我在定位问题时发现,本项目提供的刷新辞典接口flush/dic很奇怪,大致描述如下:

1,先调用flush接口,后ES进行查询,此时的结果时正常的 2,在调用flush/dic之前(新词未生效),ES进行了一次该词的搜索(结果肯定“错误”),flush使新词生效,后面的ES搜索,结果时好时坏(单节点环境,指定主分片) 3,如果在步骤2中的flush之前,进行过10次左右的搜索,接着flush使新词生效,后面的ES搜索,结果都是新词之前的“错误”结果

感觉像是ES基于搜索有内部的缓存,由于ES还没有了解到这么深,想在这里得到大佬们的支持,谢谢。

cuimo4183 commented 3 years ago

补充,我调用_cache/clear接口也位解决此问题

shi-yuan commented 3 years ago

是的,analyzer会被放在ThreadLocal里。

热更新问题,在这里修复了:#193

cuimo4183 commented 3 years ago

是的,analyzer会被放在ThreadLocal里。

热更新问题,在这里修复了:#193

谢谢,感谢回复,由于线上ES不方便升级大版本,我准备研究下能否采取其他手段进行解决

shi-yuan commented 3 years ago

可以的,如果需要,这边可以对2.x版本升级 其实插件本身改动不大,核心是nlp-lang的改动

cuimo4183 commented 3 years ago

可以的,如果需要,这边可以对2.x版本升级 其实插件本身改动不大,核心是nlp-lang的改动

你好,我看nlp包中加了volatile关键词,照葫芦画瓢也在我这边低版本改了,然后我在analysis-ansj中的两个类也照着改了。启动没问题,不过没有生效,还是间歇性生效,不知道还有哪里的修改点。

cuimo4183 commented 3 years ago

可以的,如果需要,这边可以对2.x版本升级 其实插件本身改动不大,核心是nlp-lang的改动

你好,我看nlp包中加了volatile关键词,照葫芦画瓢也在我这边低版本改了,然后我在analysis-ansj中的两个类也照着改了。启动没问题,不过没有生效,还是间歇性生效,不知道还有哪里的修改点。

也没有找到threadlocal 的相关修改点

shi-yuan commented 3 years ago

ThreadLocal只能是注册的全局的,能控制。如果不是,es注册的是CustomAnalyzer,控制不了的。

所以只能控制,ThreadLocal的value引用,也就是词典

而且词典不能从ENV里移除,如果有变更,只能先clear,再重新加载,如果删除了,clear掉就行

cuimo4183 commented 3 years ago

ThreadLocal只能是注册的全局的,能控制。如果不是,es注册的是CustomAnalyzer,控制不了的。

所以只能控制,ThreadLocal的value引用,也就是词典

而且词典不能从ENV里移除,如果有变更,只能先clear,再重新加载,如果删除了,clear掉就行

我看你的代码变动好像是把原来的reload 改成reloadLIbrary方法判断分支,执行reload或者是clear,我没理解到怎么就解决bug了

shi-yuan commented 3 years ago

reload内部,会先clear,clear执行的时候,会重新初始化branches

......
public class SmartForest<T> implements Comparable<SmartForest<T>>, Serializable {
    ......
    public void clear() {
        this.branches = new SmartForest[65536];
    }
   ......
}

之后再重新读取并加载词典,把词条放入branches