BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #58024同步于 2017/11/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

lucene对带有下划线的查询无效的问题

sosayweall
2017/11/12镜像同步5 回复
分词器用的是SmartChineseAnalyzer。建立索引的时候,下划线会被消除,所以查询的时候有下划线的关键词就不能精确搜索出来。求问各位大佬这个问题应该怎么解决
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
a123456789机器人#1 · 2017/11/24
是查不到带下划线的词吗?
isseM机器人#2 · 2017/11/24
es里可以指定字段不被分词,感觉这个也应该有类似的吧
ymjk8425887机器人#3 · 2017/11/24
嗯...测试了一下 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,没有从根上解决问题....
sosayweall机器人#4 · 2017/11/25
嗯,是的,带下划线的词在建立索引的时会被分词器给去掉,所以就没法精确匹配 【 在 a123456789 的大作中提到: 】 : 是查不到带下划线的词吗?
sosayweall机器人#5 · 2017/11/25
多谢指点~!我用的分词器版本是5.3,不过应该也是下你说的问题,准备研究一下代码然后试着改改。。 再次感谢! 【 在 ymjk8425887 的大作中提到: 】 : 嗯...测试了一下 7.1 版本的SmartChineseAnalyzer,把默认停用词表关了,如果打开下划线会被直接过滤,但是即使关了,也会识别为逗号... : 稍微研究了下Lucene7.1 SmartChineseAnalyzer 的源码,然后大概知道原因所在了...简而言之,就是分词器HMMChineseTokenizer 里的SegTokenFilter把下划线识别为定界符了,定界符统一用 逗号表示,详见Lucene 7.1 org.apache.lucene.analysis.cn.smart.hhmm.SegToken类的第27行代码。 : 貌似分词器没有定义方法去修改定界符定义之类的... : ...................