最代码官方的gravatar头像
最代码官方 2017-06-02 09:52:32

apache lucene如何将分词结果的中文单个词语过滤并返回其他分词的搜索结果?

最近优化最代码的搜索,分词和搜索通过lucene实现,现在有个问题就是对于比如:“java多数据源”的搜索结果中有“多”的关键词结果,切分后词组是:“java”,“多”,“数据源”,哪位牛牛知道如何去掉这个“多”的单个词语并返回搜索结果。百度和google半天没找到结果。

apache lucene如何将分词结果的中文单个词语过滤并返回其他分词的搜索结果?

所有回答列表(3)
最代码官方的gravatar头像
最代码官方  LV168 2017年6月2日

自问自答吧。

可以通过QueryParser得到分词列表,提供下部分代码片段

QueryParser parser = new QueryParser(Version.LUCENE_4_10_0,
				fieldContent, analyzer);
		BooleanQuery booleanQuery = new BooleanQuery();
		Query query = parser.parse(line);
		Set<Term> terms = new HashSet();
		query.extractTerms(terms);
		for (Term term : terms) {
			System.out.println("分词:" + term);
			if (term.text().length() == 1) {
				continue;
			}
			Query termQuery = new TermQuery(term);
			booleanQuery.add(termQuery, Occur.SHOULD);
		}
		System.out.println("关键词:" + booleanQuery);

运行截图

apache lucene如何将分词结果的中文单个词语过滤并返回其他分词的搜索结果?

解决思路就是Query.extractTerms(terms);得到分词列表,然后遍历该列表过滤掉单个词的结果,并且重新new TermQuery,并且通过Occur.SHOULD的BooleanQuery返回所有分词可能出现的结果

评论(2) 最佳答案
黄飞鸿的gravatar头像
黄飞鸿  LV19 2017年6月2日

我知道IK分词有个 ext_stopwords ,就是不将某个字单独拆分成为一个词,也不对该词进行搜索。

IK分词配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典-->     
    <entry key="ext_dict">/mydict.dic;/single_word_low_freq.dic;main.dic;</entry> 
    <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">/ext_stopword.dic;</entry> 
</properties>

 

ext_stopword.dic 配置,一个字占用一行: 






使
























yongde1990的gravatar头像
yongde1990  LV3 2018年3月23日

搜索使用的是es吗?可以对ik分词器进行改造,过滤掉这个单个分词。

最近浏览
zzctest  LV1 2021年7月2日
lizhiqing 2021年6月8日
暂无贡献等级
梦幻追风  LV4 2021年4月25日
helo_gan 2021年3月1日
暂无贡献等级
675717929 2020年12月30日
暂无贡献等级
15623544116  LV2 2020年9月1日
renxiao123  LV17 2020年4月11日
1543057945 2019年6月18日
暂无贡献等级
hucjl208  LV3 2018年12月7日
呆呆带呆呆  LV5 2018年10月25日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友