Lucene08-Lucene的相关度排序

目录

  • 1 什么是相关度
  • 2 相关度评分
  • 3 相关度设置
    • 3.1 需求
    • 3.2 广告设置中......

1 什么是相关度

概念: 相关度指两个事物之间的关联关系(相关性). Lucene中指的是搜索关键词(Term)与搜索结果之间的相关性. 如: 搜索bookname域中包含java的图书, 则根据java在bookname中出现的次数和位置来判断结果的相关性.

2 相关度评分

Lucene对查询关键字和索引文档的相关度进行打分, 得分越高排序越靠前.

  • Lucene的打分方法: Lucene在用户进行检索时根据实时搜索的关键字计算分值, 分两步:

    1. 计算出词(Term)的权重
    2. 根据词的权重值, 计算文档相关度得分.
  • 什么是词的权重?

    通过索引部分的说明, 易知索引的最小单位是Term(索引词典中的一个词). 搜索也是从索引域中查询Term, 再根据Term找到文档. Term对文档的重要性称为Term的权重.

  • 影响Term权重的因素有两个:
    1. Term Frequency(tf):

      指此Term在此文档中出现了多少次. tf 越大说明越重要.

      词(Term)在文档中出现的次数越多, 说明此词(Term)对该文档越重要, 如"Lucene"这个词, 在文档中出现的次数很多, 说明该文档可能就是讲Lucene技术的.

    2. Document Frequency(df):

      指有多少文档包含此Term. df 越大说明越不重要.

      如: 在某篇英文文档中, this出现的次数很多, 能说明this重要吗? 不是的, 有越多的文档包含此词(Term), 说明此词(Term)越普通, 不足以区分这些文档, 因而重要性越低.

3 相关度设置

Lucene通过设置关键词Term的权重(boost)值, 影响相关度评分, 从而影响搜索结果的排序.

3.1 需求

出版社做了广告推广: Lucene在收到钱之后, 将《Lucene Java精华版》排到第一.

3.2 广告设置中......

/**
 * 相关度排序, 通过修改索引库的方式, 修改需要更改的图书的权重
 */
@Test
public void updateIndexBoost() throws IOException {
    // 1.建立分析器对象(Analyzer), 用于分词
    Analyzer analyzer = new IKAnalyzer();

    // 2.建立索引库配置对象(IndexWriterConfig), 配置索引库
    IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_10_4, analyzer);

    // 3.建立索引库目录对象(Directory),指定索引库位置
    Directory directory  = FSDirectory.open(new File("/Users/healchow/Documents/index")); 

    // 4.建立索引库操作对象(IndexWriter), 操作索引库
    IndexWriter writer = new IndexWriter(directory,iwc);

    // 5.建立文档对象(Document)
    Document doc = new Document();
    // 5 Lucene Java精华版 80 5.jpg
    doc.add(new StringField("bookId", "5", Store.YES));
    TextField nameField = new TextField("bookName", "Lucene Java精华版", Store.YES);
    // 设置权重值为100. 默认是1
    nameField.setBoost(100f);
    doc.add(nameField);
    doc.add(new FloatField("bookPrice", 80f, Store.YES));
    doc.add(new StoredField("bookPic","5.jpg"));

    // 6.建立更新条件对象(Term)
    Term term = new Term("bookId", "5");

    // 7.使用IndexWriter对象,执行更新
    writer.updateDocument(term, doc);

    // 8.释放资源
    writer.close();
}
// 或在创建索引时即修改权重:
// 打个广告: 收到钱之后, 将《Lucene Java精华版》排到第一
// 5 Lucene Java精华版 80 5.jpg
TestField bookNameField = new TextField("bookName", book.getBookname(), Store.YES);
if (book.getId() == 5) {
    // 设置权重值为100. 默认是1
    bookNameField.setBoost(100f);
}
document.add(bookNameField);

版权声明

作者: ma_shoufeng(马瘦风)

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但未经博主同意必须保留此段声明, 且在文章页面明显位置给出原文链接, 否则博主保留追究法律责任的权利.

原文地址:https://www.cnblogs.com/shoufeng/p/9410785.html

时间: 2024-10-05 04:41:19

Lucene08-Lucene的相关度排序的相关文章

Lucene底层储存结构、优化和相关度排序

lucene详细存储结构: 索引 (Index) : 一个目录一个索引,在 Lucene 中一个索引是放在一个文件夹中的. 段(Segment) : 一个索引 (逻辑索引)由多个段组成, 多个段可以合并, 以减少读取内容时候的磁盘IO. Lucene 中的数据写入会先写在内存的一个Buffer,当Buffer内数据到一定量后会被flush成一个Segment,每个Segment有自己独立的索引,可独立被查询,但数据永远不能被更改.这种模式避免了随机写,数据写入都是批量追加,能达到很高的吞吐量.S

验证相关度排序是否受查询的多个关键字在内容中相邻紧密程度有关

昨天给公司同事们介绍了lucene相关度打分的公式,大家提到了一个问题,总感觉用相关度排序的时候,lucene会把查询关键字相邻紧密的doc排在前面,但是打分公式里面却没提到过这个因素,所以我现在来验证下查询词的紧密程度是否会影响打分. 局部代码 添加doc程序 1 设置lucene保存field的所有信息,包括词位置, payloads等等 FieldType ty = new FieldType();ty.setIndexed(true);ty.setStored(true);ty.setT

Lucene - CustomScoreQuery 自定义排序

在某些场景需要做自定义排序(非单值字段排序.非文本相关度排序),除了自己重写collect.weight,可以借助CustomScoreQuery. 场景:根据tag字段中标签的数量进行排序(tag字段中,标签的数量越多得分越高) public class CustomScoreTest { public static void main(String[] args) throws IOException { Directory dir = new RAMDirectory(); Analyze

Lucene 中自定义排序的实现

使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们就来看看在Lucene中如何实现自定义排序功能. Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和 ScoreDocCom

lucene的相关度打分

官方文档http://lucene.apache.org/core/4_9_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html term:不是单纯的key.是field-key,指定域下面的key 影响打分的因素 coord:document命中query中term的个数(不是算数量,是算不同term的个数) term.tf:term在对应域里出现的频率 term.idf:包含这个term的document个数 qu

lucene整理3 -- 排序、过滤、分词器

1.    排序 1.1. Sort类 public Sort() public Sort(String field) public Sort(String field,Boolean reverse)  //默认为false,降序排序 public Sort(String[] fields) public Sort(SortField field) public Sort(SortField[] fields) Sort sort=new Sort(“bookname”);按照“booknam

Lucene中使用Score进行自然排序

/* *这里是使用Lucene进行相关度排序 *使用Score进行自然排序 *相关度排序是一种最简单的排序方式. *所谓相关度,其实是文档的得分 *文档的得分在每次查找的时候都不同, *需要根据查找的关键字来确定. * *tf词条频率 *idf反转文档频率 *boost Field的激励因子 *LengthNum长度因子  */ 结果图: package score; import java.io.IOException; import org.apache.lucene.analysis.st

一步一步跟我学习lucene(13)---lucene搜索之自定义排序的实现原理和编写自己的自定义排序工具

自定义排序说明 我们在做lucene搜索的时候,可能会需要排序功能,虽然lucene内置了多种类型的排序,但是如果在需要先进行某些值的运算然后在排序的时候就有点显得无能为力了: 要做自定义查询,我们就要研究lucene已经实现的排序功能,lucene的所有排序都是要继承FieldComparator,然后重写内部实现,这里以IntComparator为例子来查看其实现: IntComparator相关实现 其类的声明为 public static class IntComparator exte

[Elasticsearch] 控制相关度 (一) - 相关度分值计算背后的理论

本章翻译自Elasticsearch官方指南的Controlling Relevance一章. 控制相关度(Controlling Relevance) 对于仅处理结构化数据(比如日期,数值和字符枚举值)的数据库,它们只需要检查一份文档(在关系数据库中是一行)是否匹配查询即可. 尽管布尔类型的YES|NO匹配也是全文搜索的一个必要组成,它们本身是不够的.我们还需要知道每份文档和查询之间的相关程度.全文搜索引擎不仅要找到匹配的文档,还需要根据相关度对它们进行排序. 全文搜索相关度的公式,或者被称为