所需添加依赖包
lucene-highlighter-4.10.3.jar、lucene-memory-4.10.3.jar
<!-- lucene-highlighter -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>4.10.3</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-memory</artifactId>
<version>4.10.3</version>
</dependency>
高亮器
操作步骤
1. 配置依赖jar包(lucene-highlighter-4.10.3.jar、lucene-memory-4.10.3.jar)
2. 创建Highlighter对象
高亮格式器
——Formatter formatter = new SimpleHTMLFormatter()
查询记分对象
——Scorer scorer = new QueryScorer(query)
/** 创建Highlighter高亮对象 */
Highlighter highlighter = new Highlighter(formatter, scorer);
Highlighter highlighter = new Highlighter(formatter, scorer);
3. 设置文本截断
创建文本片断
——Fragmenter fragmenter = new SimpleFragmenter(20)
————
highlighter.setTextFragmenter(fragmenter)
4. 获取高亮内容(获取最佳的文本片断)
获取最佳内容片断:—— highlighter.getBestFragment(analyzer, "字段名", "字段值");
/** 检索后数据高亮显示 */
@Test
public void test() throws Exception{
/** 创建读索引库对象 */
IndexReader indexReader = DirectoryReader
.open(FSDirectory.open(new
File("D:\\Lucene4\\lucene_index")));
/** 创建IndexSearcher对象 */
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
/** 定义分词器 */
Analyzer analyzer = new IKAnalyzer();
/** 创建QueryParser对象 */
QueryParser qp = new QueryParser("content", analyzer);
/** 爱 默认Field里包含"爱"关键词 */
Query query = qp.parse("爱");
/** 进行检索,返回最前面的5条记录 */
TopDocs topDocs = indexSearcher.search(query, 5);
System.out.println("命中的总记录数:" + topDocs.totalHits);
System.out.println("最大的分数:" + topDocs.getMaxScore());
/** 获取分数文档数组 */
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
/** 创建高亮格式器 (默认格式器:<B></B>) */
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
/** 创建记分对象 */
Scorer scorer = new QueryScorer(query);
/** 创建Highlighter高亮对象 */
Highlighter highlighter = new Highlighter(formatter, scorer);
/** 创建文档片断 */
Fragmenter fragmenter = new SimpleFragmenter(20) ;
/** 设置文本截断 */
highlighter.setTextFragmenter(fragmenter);
/** 迭代检索到得分数文档数组 */
for (ScoreDoc scoreDoc : scoreDocs){
System.out.println("文档分数:" + scoreDoc.score);
System.out.println("文档索引号:" + scoreDoc.doc);
/** 根据索引号docId,获取文档 */
Document doc = indexSearcher.doc(scoreDoc.doc);
System.out.println(doc.get("id") + "\t" + doc.get("name")
+ "\t" + highlighter.getBestFragment(analyzer,
"content", doc.get("content")));
}
indexReader.close();
}
提升权重(相关度)
Lucene对查询关键字和索引文档的相关度进行打分,得分高的就排在前边。如何打分呢?Lucene是在用户进行检索时实时根据搜索的关键字计算出来的,分两步:
1) 计算出词(Term)的权重
W t,d = tf t,d * log(n / df t )
|
2、根据词的权重值,计算文档相关度得分。
词(Term)在文档中出现的次数越多,说明此词(Term)对该文档越重要,如“
Lucene”这个词,在文档中出现的次数很多,说明该文档主要就是讲Luccene技术的。
可以通过设置boost值影响权重
boost是一个加权值(默认加权值为1.0f),它可以影响权重的计算。
TextField textField= new TextField("content", “”, Store.YES);
/** 提升权重 */
textField.setBoost(10.0f);
- coord(q,d) 评分因子,基于文档中出现查询项的个数。越多的查询项在一个文档中,说明文档的匹配程度越高。
- queryNorm(q)查询的标准查询
- tf(t in d) 指项t在文档d中出现的次数frequency。具体值为次数的开根号。
- idf(t) 反转文档频率, 出现项t的文档数docFreq
- t.getBoost 查询时候查询项加权
- norm(t,d) 长度相关的加权因子