lucene - lucene8.7.0 如何一次性搜索多个域并配置权重及分析器

122 阅读1分钟

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

问 :如何实现多域搜索?
答 :使用 MultiFieldQueryParser

public void articleSearchServiceTest() throws ParseException {
	 ArticleSearchService articleSearchService =
	         ServiceBindCache.getBean(ArticleSearchService.class);
	
	 Map<String, Float> boosts = new HashMap<>();
	
	 boosts.put("title", 10F);
	 boosts.put("content", 1F);
	
	 QueryParser parser = new MultiFieldQueryParser(
	         new String[]{"title", "content"},
	         new StandardAnalyzer(), boosts);
	
	 Query query = parser.parse("白日");
	
	 Result result = articleSearchService.search(indexRoot, query, 10);
	
	 result.getDocs().forEach(doc -> {
	         System.out.println("title : " + doc.get("title") + " " +
	                 "content : " + doc.get("content"));
	 });
}

# 结果
title : 白日夜话 content : 我心安处即吾乡
title : 登鹳雀楼 content : 白日依山尽,黄河入海流。欲穷千里目,更上一层楼。
title : 登鹳雀楼 content : 白日依山尽,黄河入海流。欲穷千里目,更上一层楼。
title : 登鹳雀楼 content : 白日依山尽,黄河入海流。欲穷千里目,更上一层楼。
title : 望庐山瀑布 content : 日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。
title : 望庐山瀑布 content : 日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。
title : 望庐山瀑布 content : 日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。