Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
cuimo4183 opened this issue Jul 1, 2021 · 9 comments
Open

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

cuimo4183 opened this issue Jul 1, 2021 · 9 comments

Comments

@cuimo4183
Copy link

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

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

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

@cuimo4183
Copy link
Author

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

@shi-yuan
Copy link
Member

shi-yuan commented Jul 2, 2021

是的,analyzer会被放在ThreadLocal里。

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

@cuimo4183
Copy link
Author

是的,analyzer会被放在ThreadLocal里。

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

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

@shi-yuan
Copy link
Member

shi-yuan commented Jul 8, 2021

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

@cuimo4183
Copy link
Author

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

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

@cuimo4183
Copy link
Author

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

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

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

@shi-yuan
Copy link
Member

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

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

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

@cuimo4183
Copy link
Author

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

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

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

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

@shi-yuan
Copy link
Member

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants