lucene
lucene
車輪の唄
atarik@163.com
展开
-
tf/idf评分算法
lucene 的评分机制elasticsearch是基于lucene的,所以他的评分机制也是基于lucene的。评分就是我们搜索的短语和索引中每篇文档的相关度打分。如果没有干预评分算法的时候,每次查询,lucene会基于一个评分算法来计算所有文档和搜索语句的相关评分。使用lucene的评分机制基本能够把最符合用户需要的搜索放在最前面。当然有的时候,我们可能想要自定义评分算法,这个就和lu...原创 2017-09-14 10:24:58 · 2682 阅读 · 3 评论 -
关于lucene的索引文件对象MMapDirectory
https://yq.aliyun.com/articles/45356https://blog.csdn.net/zteny/article/details/51859865https://www.cnblogs.com/huangfox/p/3616298.html原创 2018-08-28 22:54:06 · 624 阅读 · 0 评论 -
lucene实现近实时索引
另一篇https://blog.csdn.net/cdnight/article/details/40273519https://www.programcreek.com/java-api-examples/index.php?api=org.apache.lucene.index.TrackingIndexWriter近实时搜索(near-real-time)可以搜索IndexWr...原创 2018-08-28 20:09:10 · 1642 阅读 · 0 评论 -
Lucene 索引去重
在使用Lucene过程中,会发现当我们为添加新的Document时,会产生重复现象(两次添加同一个Document),毕竟Lucene中没有像数据库中一样,有键可以区分。不过我们可以通过为Document建立类似于键的域,来防止添加重复的Document。示例(id这个域就当做键使用了,推荐使用MD5码之类的唯一性较好的作为键): Document document = new D...原创 2018-08-30 19:50:16 · 1880 阅读 · 2 评论 -
lucene源码分析—倒排索引的写过程
lucene将倒排索引的信息写入.tim和.tip文件,这部分代码也是lucene最核心的一部分。倒排索引的写过程从BlockTreeTermsWriter的write函数开始,BlockTreeTermsWriter::write public void write(Fields fields) throws IOException { String lastField =...原创 2018-08-12 09:34:54 · 1572 阅读 · 0 评论 -
lucene API中的search和searchAfter
Lucene 3.5开始对深度分页支持,在之前的版本是提供分页的方法,只能根据自己的应用场景去写分页的方法!在《lucene in action》一书中提现两种分页的方法:1、将首次搜索获得的多页搜索结果收集起来并保存在ScoreDocs和IndexSearcher实例中,并在用户换页浏览时展现这几页的结果。 2、每次用户换页浏览时都重新进行查询操作。按这两个方法是可以做出分页的,只是效...原创 2018-05-31 19:15:42 · 1844 阅读 · 1 评论 -
DocumentsWriterFlushControl
缓存和刷新是比较重要的问题,它涉及到lucene如何管理内存和磁盘。前面提到索引的结果是缓存在内存中的,等到一定时候才会将其刷新到硬盘上去。缓存在这里的目的无非是缓解高速设备到低速设备的不匹配。下面这些问题都比较重要:调用增删改索引后此时索引时已经写入磁盘还是仍然驻留内存,即索引的刷新时间是什么?其次,缓存会占用多少内存?另外,刷新的效率如何?最后,lucene允许多个线程并发刷新索引,具体实现是...原创 2018-05-23 16:31:19 · 372 阅读 · 0 评论 -
WildCardQuery
WildCardQuery:只要知道“*”表示0到多个字符,而使用“?”表示一个字符就行了:\IndexSearcher searcher=new IndexSearcher(path);Term t1=new Term("content","?o*");WildcardQuery query=new WildcardQuery(t1);Hits hits=searcher.search...原创 2018-03-13 19:18:46 · 1961 阅读 · 0 评论 -
hard commit和soft commit理解
commitTracker分hard commit和soft commit即CommitTracker, SoftCommitTracker软提交写内存,硬提交写硬盘的说法并不准确在FSDirectory下,它们的区别是flush和force的区别。只有在NrtCachingDirectory下,它们才有写内存,和写磁盘的区别...原创 2018-09-03 13:39:02 · 608 阅读 · 0 评论 -
lucene源码学习博客
https://blog.csdn.net/conansonic/article/details/53235528https://yq.aliyun.com/articles/45333原创 2017-10-29 11:42:42 · 489 阅读 · 0 评论 -
为什么Lucene检索可以比mysql快
Mysql只有term dictionary这一层,是以b-tree排序的方式存储在磁盘上的。检索一个term需要若干次的random access的磁盘操作。而Lucene在term dictionary的基础上添加了term index来加速检索,term index以树的形式缓存在内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term...原创 2019-03-31 10:24:44 · 2082 阅读 · 1 评论 -
Lucene DocValues详解
我们已经知道倒排表存储了term 对就在的 docIds,也就是说我们可以用它非常高效的找到所有含有查询词的文档得到一个结果集。这个结果集含有满足查询条件的docid(即文档号),这个结果集极有可能非常大。这里有两个非常重要的件:1. 结果集只有含文档号,不含文档的内容;2. 这个结果集很大,有很多个文档号。当然一般来我们并不需要整个结果集,只需要按一定条件topK。当一定条件是指按相似度...原创 2019-01-30 11:28:15 · 354 阅读 · 0 评论 -
Lucene导入源码运行异常A SPI class of type org.apache.lucene.codecs.Codec with name
Exception in thread "main" java.lang.ExceptionInInitializerErrorat org.apache.lucene.index.LiveIndexWriterConfig.<init>(LiveIndexWriterConfig.java:122)at org.apache.lucene.index.IndexWriterCon...原创 2019-01-25 14:25:37 · 1697 阅读 · 0 评论 -
lucene 拼写检查
spellChecker是用来对用户输入的“检索内容”进行校正,例如百度上搜索“麻辣将”,他的提示如下图所示: 我们首先借用lucene简单实现该功能。本文内容如下(简单实现、原理简介、现有问题) lucene中spellchecker简述lucene 的扩展包中包含了spellchecker,利用它我们可以方便的实现拼写检查的功能,但是检查的效果(推荐的准确程度)需...原创 2018-10-23 09:24:15 · 491 阅读 · 0 评论 -
Files类和Paths类
Java7中文件IO发生了很大的变化,专门引入了很多新的类:import java.nio.file.DirectoryStream;import java.nio.file.FileSystem;import java.nio.file.FileSystems;import java.nio.file.Files;import java.nio.file.Path;import j...原创 2018-04-29 08:54:29 · 1179 阅读 · 0 评论 -
AtomicBoolean
官方的说明是:可以用原子方式更新的 boolean 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicBoolean 可用在应用程序中(如以原子方式更新的标志),但不能用于替换 Boolean。换一句话说,Atomic就是原子性的意思,即能够保证在高并发的情况下只有一个线程能够访问这个属性值。(类似我们之前所说的volat...原创 2018-04-29 21:54:37 · 406 阅读 · 0 评论 -
Iterable接口
本文主要对Iterable和Iterator两个接口进行深入学习。1、Iterable接口Iterable接口 (java.lang.Iterable) 是Java集合的顶级接口之一。我们首先看下这这个接口在JDK中的定义:package java.lang; public interface Iterable<AnyType>{ Iterator<...原创 2018-04-29 22:20:33 · 1469 阅读 · 0 评论 -
FST算法中的一些规则
1. flag如果不包含4, 则必须给出下一个node 的地址, 或者不存在下一地址(即结束状态) 如果包含4, 则当前节点结束的位置后就是下一地址2. 2代表当前节点数据已经结束3. 数据复用, 只能复用尾部数据, 且整个节点内容都要一致(可以做多节点数据复用)4. S开始的位置节点最后做compile5. ...原创 2018-05-06 09:43:43 · 1612 阅读 · 0 评论 -
lucene源码-创建IndexReader--2
总体上分为三步1) 读取段信息(segment_N, si文件) , 获取segmentinfos对象, 其下有private List<SegmentCommitInfo> segments = new ArrayList<>(); SegmentCommitInfo类代表了每次的提交信息, segmentCommitInfo下包括SegmentInfo2) 读取...原创 2017-10-26 15:18:20 · 409 阅读 · 0 评论 -
rewrite方法-1
query树是由booleanQuery连接起来的,其叶子节点必然是termquery或是multiTermQuery termQuery的rewrite返回本身,而multiTermQuery的rewrite最终会返回一个个原子query 1、BoostingQuery BoostingQuery包含三个成员变量:Query match:这是结果集必须满足的查询对象...原创 2017-12-09 09:52:44 · 608 阅读 · 0 评论 -
rewrite方法--2
IndexSearcher(Searcher).createWeight(Query) 代码如下: protected Weight createWeight(Query query) throws IOException { return query.weight(this); } BooleanQuery(Query).weight(Searc...原创 2017-12-09 09:53:24 · 597 阅读 · 0 评论 -
Query的子类ConstantScoreQuery
主要用于过滤查询和将multiTermQuery rewrite为原子查询后使用的查询对象, 他会返回一个constantquery A query that wraps another query or a filter and simply returns a constant score equal to the query boost for every document tha...原创 2017-12-09 09:58:58 · 2690 阅读 · 0 评论 -
must,must_not,should组合关系以及OR和AND
1. 所有的组合关系都是对OR而言, AND连接符不予分析2. MUST_NOT和其他语句连接在一起时, 只做过滤, 不参与打分 3. editionkey:(13 25 ) 代表筛选出 13或15-editionkey:(13 25 )代表过滤掉13 和 15...原创 2017-12-10 17:40:17 · 9533 阅读 · 2 评论 -
lucene的多线程索引
lucene中存在的两种锁, 第一种, 针对每个索引文件目录有一个锁, 该锁保证了只有一个IndexWriter实例写该目录第二种, 在每个IndexWriter实例下, 有一个ThreadState对象池, 默认大小为8(该对象池也被称为线程池, 但实际上他只是一个锁池), 具体参见点击打开链接 lucene的多线程索引可以分为三类, 第一种, 单线程单目录索引, 该方式只会...原创 2017-12-16 13:55:42 · 1040 阅读 · 0 评论 -
关于Tokenizer与TokenFilter的区别
Lucene Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数,而TokenFilter则是一个类似拦截器的东东,其参数可以使TokenStream、Tokenizer,甚至是另一个TokenFilter。整个Lucen原创 2018-01-23 15:03:07 · 517 阅读 · 0 评论 -
索引文件介绍与数据类型
Lucene生成的索引文件由上文中提到的代码生成的索引文件如下所示:格式都相当怪异,那些这些文件里面都存放了些什么东西?我们先来了解如下名词a)段信息(SegmentInfo):它包含段的元数据;b)字段名(Field name):它包含了用来构建索引的字段名;c)存储的字段值(Stored Field values):它包含每一个文档的属性-值(attr...原创 2017-09-20 21:43:51 · 1619 阅读 · 0 评论 -
lucene 搜索过程
IndexSearcher是搜索的入口,主要提供的api都是关于search的。关于搜索,比较有意思的话题有这么几个:如何计算打分,这个问题已经在空间向量模型一文中讨论过?如何从一个搜索词得到一个Query对象?如何从Query对象到评分器从而计算打分的?几个重要的参数是如何在被组织起来计算的,比如n, filter, sort, collector等。另外,分页是如何进行的? 本文以展原创 2017-09-26 11:26:44 · 2207 阅读 · 3 评论 -
lucene的默认评分算法-向量空间模型(Vector Space Model)
在lucene4以前,一直都是使用经典的向量空间模型作为其检索模型,这种方式虽然统一了评分算法,简化了计算,但是带来的问题是很难去调整,一旦向量空间模型不适合,也很难去替换一种更好的算法。 而lucene4则将检索模型与事实上的搜索做了解耦和抽象,并且加入了另外几种检索模型的实现,其中就有经典的BM25。 经典的向量空间模型的理论基础及其在lucene中的应用 向量空原创 2017-09-26 11:08:55 · 1714 阅读 · 3 评论 -
IndexReader中maxDoc()和numDocs()的区别
maxDoc()和numDocs()。前者返回下一个可用的内部Document号,后者返回索引中的Document的数目。因为我们的索引只含有两个Document,numDocs()返回2;又因为Document号从0开始,maxDoc()也返回2。 注意:每个Lucene的Document有个唯一的内部编号。这些编码不是永久分配的,因为Lucene索引分配时在内部重新分配Docum原创 2017-09-23 16:33:18 · 910 阅读 · 0 评论 -
termvector--2--图解lucene TermVector
1 TermVector.YES 2 TermVector.WITH_POSITIONS 3 TermVector.WITH_OFFSETS 4 TermVector.WITH_POSITIONS_OFFSETS原创 2017-08-28 19:17:00 · 574 阅读 · 0 评论 -
lucene analyzer 体系结构一览
分词这块内容往往是做搜索的入门级内容,例如我们刚接触搜索的时候,经常会碰到“想要检索的检索不到”的问题,这时得对分词有个大概的了解了。这里是简要分析,因此我用的是lucene1.9来分析(目前看的源码主要也是1.9版本,虽然都快出4.0了) 一)体系结构首先我们了解两组类结构,一是Analyzer,二是TokenStream。图1:analyzer类结构原创 2018-01-23 15:00:52 · 334 阅读 · 0 评论 -
关于flush操作
flush动作不是将内存中缓存的索引写入磁盘, 而是写入操作系统缓冲区???只有Index Writer上的commit操作才会导致ram directory上的数据完全同步到文件。Index Writer提供了实时获得reader的API,这个调用将导致flush操作,生成新的segment,但不会commit(fsync),从而减少 了IO。新的segment被加入到新生成的r原创 2017-12-22 18:08:04 · 5956 阅读 · 0 评论 -
导入lucene源码(solr源码同理)
1.lucen源码下载 http://archive.apache.org/dist/lucene/java/2.下载下来,发现不是project文件,需要用ivy和ant,弄成project文件:可参考http://blog.csdn.net/ccit0519/article/details/84437803.安装ant和ivy。4.cmd到项目路径下:例如:E:\第三方开源包\lu...原创 2017-12-06 18:06:21 · 783 阅读 · 0 评论 -
query子句解析
lucene中String类型的查询表达式最终会被QueryParse解析为各种Query对象, 直接使用查询表达式和直接使用Query对象的不同在于前者需要配置分词器进行分词, 而后者所见即所得没有分词过程QueryParser parser = new MyQueryParser(version, "content", analyzer);//默认在content域中查找, 重写了ge原创 2017-12-08 15:07:30 · 1140 阅读 · 0 评论 -
lucene的IndexReader的初始化过程
在使用Lucene时,有一条建议”不要频繁去打开关闭硬盘索引”。为什么会有这条建议?这就需要在IndexReader的实例化过程中找答案。先说一个结论“IndexReader的实例化过程是一个非常耗时的过程”。由于IndexReader只是一个抽象类,在调用代码:真正得到的是StandardDirectoryReader对象。首先来看一下StandardDirectoryReader的类图原创 2017-10-24 15:34:37 · 365 阅读 · 0 评论