返回信息流分词器用的是SmartChineseAnalyzer。建立索引的时候,下划线会被消除,所以查询的时候有下划线的关键词就不能精确搜索出来。求问各位大佬这个问题应该怎么解决
这是一条镜像帖。来源:北邮人论坛 / java / #58024同步于 2017/11/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
lucene对带有下划线的查询无效的问题
sosayweall
2017/11/12镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
嗯...测试了一下 7.1 版本的SmartChineseAnalyzer,把默认停用词表关了,如果打开下划线会被直接过滤,但是即使关了,也会识别为逗号...
稍微研究了下Lucene7.1 SmartChineseAnalyzer 的源码,然后大概知道原因所在了...简而言之,就是分词器HMMChineseTokenizer 里的SegTokenFilter把下划线识别为定界符了,定界符统一用 逗号表示,详见Lucene 7.1 org.apache.lucene.analysis.cn.smart.hhmm.SegToken类的第27行代码。
貌似分词器没有定义方法去修改定界符定义之类的...
所以我能够想到的方法:
1. 继承SmartChineseAnalyzer,修改定界符定义,让分词器不把下划线识别为定界符,应该重写HHMMSegmenter里的process方法就可以了...
2. 也是继承,然后重写SegToken类的第27行代码,判断一下,如果为下划线就直接返回下划线,而不是逗号,这个方法比较省事儿,就是有点Low...
3. 还有就是写一个代理分词器, 用另一个冷门的汉字替代下划线...这个方法更省事儿,但也更Low,没有从根上解决问题....
嗯,是的,带下划线的词在建立索引的时会被分词器给去掉,所以就没法精确匹配
【 在 a123456789 的大作中提到: 】
: 是查不到带下划线的词吗?
多谢指点~!我用的分词器版本是5.3,不过应该也是下你说的问题,准备研究一下代码然后试着改改。。
再次感谢!
【 在 ymjk8425887 的大作中提到: 】
: 嗯...测试了一下 7.1 版本的SmartChineseAnalyzer,把默认停用词表关了,如果打开下划线会被直接过滤,但是即使关了,也会识别为逗号...
: 稍微研究了下Lucene7.1 SmartChineseAnalyzer 的源码,然后大概知道原因所在了...简而言之,就是分词器HMMChineseTokenizer 里的SegTokenFilter把下划线识别为定界符了,定界符统一用 逗号表示,详见Lucene 7.1 org.apache.lucene.analysis.cn.smart.hhmm.SegToken类的第27行代码。
: 貌似分词器没有定义方法去修改定界符定义之类的...
: ...................