调试并修改Lucene源码

需求: 搜索关键词的词频始终保持为1,即在document无论搜索关键词出现几次,只能计算该搜索关键词只出现1次。那为什么会有这需求呢? 词频会影响到document的相似度计算分。 搜了下相关资料,发现solr4.x之前计算相似度的算法是TF-IDF, solr4.x 之后的算法改为BM25,下文会有这两种算法的大致描述。 既然要改词频,那就只能先clone Lucene的源码下来研究下,也就有了该文点点滴滴的记录, 下文主要对比较核心的点进行记录。

本文基于Lucene源码8.5.1

Intellij Idea编译Lucene源码

注意:下载的是lucene-solr源码包,单独的lucene不支持ant idea|eclipse


1. 在lucene源码中引入IK分词器jar包报错

Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene
...

参考了 Lucene和ik的版本问题, 这可能是IK分词器和lucene的版本对应不上导致的,本次下载的lucene源码版本是8.5.1,IK分词器是

ikanalyzer-2012_u6.jar

找个版本比较新的IK分词器jar包试下,IKAnalyzer6.5.0.jar

上面的链接打不开的话,就尝试这个链接:https://pan.baidu.com/s/1-pTUm4auvfSWpEzWLhZftg
提取码:w1ag

2. 怎么在idea工具里,给ivy项目添加jar包

在这里插入图片描述

如图所示,在项目模块的ivy.xml文件里添加库依赖,打开右侧的Ant,右键刚才添加库依赖的模块名,点击 Run Build

3. 探究Lucene源码中词频的存储位置以及score的生成(基于Lucene4.0版本之后)

对生成索引和检索阶段都设置IK分词器,Lucene词频的计算位置在BM25Similarity.BM25Scorer.score函数,存储是在Lucene84PostingsReader.BlockDocsEnum.freqBuffer数组中

在调试中,发现只有匹配搜索词的Document才会进入score函数,而且IK会对搜索词进行分词,比如将 搜索词 “谷歌网站从来” 分词成 “谷歌”、“网站”、“从来” 这三个词,而score的调用是和Document存在该分词的个数密切相关的,具体看下面截图(已加说明)

在这里插入图片描述

Document的score值是在WANDScorer.score函数里计算的,在这个函数里会对Document中匹配搜索的分词进行词频统计的调用和 各词频间score值的相加, 最终得到Document对应的score值

将BM25Similarity.BM25Scorer.score函数的freq置为1,即可实现词频始终为1, 接着对比下词频改动前后的搜索结果,看下面截图.

不改动Lucene源码中的词频时,输出结果分析:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pDOeO7y1-1589968463409)(cipin_1moren.png)]

将Lucene源码中的词频改为1,即同一文档中相同词出现的频率始终记录为1,输出结果分析:

在这里插入图片描述

从上面的输出结果中,无法确定已排除词频的影响,接着看

在这里插入图片描述

到这里,是不是可以确定已忽略词频这一因素

4. 修改lucene源码,编译构建成到solr应用

Solr之修改和编译源代码

主要用到的ant构建task:

  • ant编译lucene-core(由于修改的源码是在lucene-core模块):在lucene-solr 目录下执行 ant compile-core

  • 构建solr服务: 在lucene-solr 目录下的 solr 目录,执行ant server

也可以通过idea工具运行ant task

在这里插入图片描述
在这里插入图片描述

5. 两种经典搜索算法的介绍

https://mubu.com/doc/2T8QHvqurPC 密码: j8s2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章