Lucene 文档域加权
文档域加权
文档域加权是为了提高某个关键词的搜索排名,例如 为设置加权时查询到的是 Marry、John、Andy ,如果我们想让Andy在查询时排名靠前
此时就需要对其单独设置权重,这个权重的设置在文档域中进行设置的
从7.0开始已经去除在创建索引时对指定字段进行权重配置,替代的方式改为查询时使用BoostQuery对要查询的某个字段配置权重
以下案例以6.x版本演示 在创建文档域时对指定字段加权
创建索引
// 封装数据
private static String ids[]={"1","2","3","4"};
private static String authors[]={"Jack","Marry","John","Json"};
private static String titles[]={"Java is a good language.","Java is a cross platform language","Java powerful","You should learn Java"};
// 生成索引库
private static void createIndex()throws Exception{
// 1. 获取索引需要保存的路径
Directory dir = FSDirectory.open(Paths.get("D://lucene03"));
// 2. 创建IndexWriter 用来创建索引 使用默认分析器
IndexWriter writer = new IndexWriter(dir,new IndexWriterConfig(new StandardAnalyzer()));
// 3. 遍历数据 将数据添加到索引
for (int i = 0; i < ids.length; i++) {
// 4. 创建Document对象
Document document = new Document();
document.add(new TextField("id",ids[i], Field.Store.YES));
document.add(new TextField("author",authors[i], Field.Store.YES));
TextField titleField = new TextField("title", titles[i], Field.Store.YES);
// 对文档域中指定的内容加权
if("Marry".equals(authors[i])){
titleField.setBoost(1.5f);
}
document.add(titleField);
// 5. 添加到索引
writer.addDocument(document);
}
writer.close();
}
查询索引
private static void searchIndex() throws Exception{
// 1. 获取索引需要保存的路径
Directory dir = FSDirectory.open(Paths.get("D://lucene03"));
// 2. 创建IndexReader对象 用来读取索引文件
IndexReader reader= DirectoryReader.open(dir);
// 3. 创建IndexSearcher对象 用来读取索引
IndexSearcher indexSearcher = new IndexSearcher(reader);
// 4. 创建查询器 TermQuery
Query query = new TermQuery(new Term("title","java"));
//BoostQuery query1 = new BoostQuery(query,1.5f);
// 5. 执行查询 最多返回10条记录
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询 java 共查询到 "+topDocs.totalHits+" 条记录");
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
// 6. 根据docId获取每条数据
Document document = indexSearcher.doc(scoreDoc.doc);
System.out.println("title:"+document.get("title")+" - 作者:"+document.get("author"));
}
reader.close();
}