冤家路窄:QueryParser对中文分词的要求
而这是CJKAnalyzer、ChineseAnalyzer以及StandardAnalyzer之类简单做法的中文分词不会出现的。
那么现在应该如何解决这个问题:
“如果1个词能够被其他词语覆盖组成,那么它不应该再被建立索引”。只要满足这个条件QueryParser就很好用了,同时索引库更小,搜索精确度也不会有任何损失(应该说是提高了)。
这样的结果便是:
对"中华人民共和国"的分词结果应该是:"中华/华人/人民/共和/共和国"。虽然"中华人民共和国"在词典中存在。
对"北京精神文明建设"的分词结果是"北京/精神/文明/建设/",虽然"精神文明""精神文明建设"本身在词典也存在。
我已经修改paoding来支持上面的做法,但还没马上提交代码,还需要几天。
(这个修改不涉及CJKKnife的变更。而是1、通过加载字典,判断并把“中华人民共和国”之类的可由其他词语组合的词语从词典中去掉,从而使Knife不认识这些组合词 2、通过增强DefaultTokenCollector.java:由DefaultTokenCollector负责根据词语位置关系按照合理的顺序将CJKKnife分词的结果最终呈现给Lucene)
至于“‘精神文明建’这个词也应该能搜索出‘北京精神文明建设’结果”,则是不可能的。
1 楼 抛出异常的爱 2007-10-19 应当把条件也作为长句进行分词, 2 楼 johnnyhg 2007-10-19 抛出异常的爱 写道应当把条件也作为长句进行分词,楼上说的很对,要从根本上解决这个问题,要从对查询条件分词,而不是从TokenCollector入手(那样解决混乱得多也不能从根上解决问题)。
希望对qieqie能有所启发。 3 楼 transist 2007-10-19 建议提供2种策略,即最大匹配分词和匹配最多分词。