Solr__luence(六)高亮器、提升权重(相关度)

所需添加依赖包

lucene-highlighter-4.10.3.jar、lucene-memory-4.10.3.jar


org.apache.lucene
lucene-highlighter
4.10.3

    org.apache.lucene
    lucene-memory
    4.10.3

高亮器

操作步骤

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);

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;
/** 创建高亮格式器 (默认格式器:) */
Formatter formatter = new SimpleHTMLFormatter("", "");
/** 创建记分对象 */
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 )
计算方式

Wt,d:词在文档中的权重

tft,d:词在该文档中出现的频率次数

n: 文档总数

dft:包含这个词的文档的数量




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) 长度相关的加权因子



你可能感兴趣的:(solr)