2016-08-12 Eric Wang
Lucene和Solr的历史版本 Lucene历史版本,不妨点进去看看,会发现Lucene的版本更新很频繁,所以Lucene的Doc注释比JDK的Doc注释差太多,在研读Lucene In Action的过程中,发现此书的Lucene版本为3.0,而自己使用的Lucene版本是5.5,所以会有诸多冲突之处,现聊记之,以备查用。另外附上Solr历史版本。 在学习Lucene过程中,官方推荐的Lucene索引查看工具是Luke,下载地址点我。 Lucene API变动相关 Field类中的枚举Index已被废弃,转而采用FieldType,并通过setIndexOptions方法设置索引选项 IndexWriter的optimi 继续阅读 »
2017-05-31 Eric Wang
FieldSelector 提高Lucene检索性能的方法有很多种,这里简单介绍一种常用且便捷可行的方法快速提高Lucene检索性能。在早期的Lucene版本中,使用FieldSelector来决定哪些Fields应该被加载,并以何种方式加载,但是在LUCENE-3309中该接口被废弃,并且提出了新的替代接口StoredFieldVisitor。 FieldCache 另一种提高检索性能的方案是使用FieldCache来缓存Lucene的term values信息,不过该接口目前已被移至org.apache.lucene.uninverting包下,并且访问权限变成包级私有,也就是说,用户再也无法直接使用FieldCache了 继续阅读 »
2016-05-23 Eric Wang
Analyzer简介 在Lucene的org.apache.lucene.analysis模块中提供了顶层的抽象类Analyzer,Analyzer主要是用来构建TokenStreams,如果想实现自定义的Analyzer,必须覆写createComponents(String)方法,并定义自己的TokenStreamComponents。 为什么要有Analyzer呢?对于Lucene而言,不管是索引还是检索,都是针对纯文本而言,对于纯文本的来源可以是PDF,Word,Excel,PPT,HTML等,Lucene对此并不关心,只要保证传递给Lucene的是纯文本即可。 而通常情况下,对于大量的文本,用户在检索的时候不可能全部 继续阅读 »
2017-10-10 Eric Wang
一般来说,如果想要从Lucene索引中获取Field的值,那么需要在索引阶段设置Field.Store.YES才可以,然后在搜索阶段得到TopDocs对象之后,用它去获取ScoreDoc再取出Document,使用Document获取存储在索引中的值。但是我们都知道,存储字段是需要硬盘空间的,如果想要追求极致的存储空间并且获取Field的值,那么在不存储的情况下,如何获取呢?其实仔细思索一下,在我们只索引不存储的情况下,Lucene依然可以判断搜索是否命中,这说明在Lucene索引中依然存有一份Field的值,这样在搜索阶段才能判断是否匹配。本文就是探讨在这种情形下,使用Lucene的核心包获取没有存储的Field的值的几种方法,如 继续阅读 »
2016-05-20 Eric Wang
引言 Lucene6.0于2016年4月8日发布,要求最低Java版本是Java 8。 相信大多数公司的数据库都需要采用分库分表等一些策略,而对于某些特定的业务需求,分别从不同的库不同的表中去检索特定的数据显得比较繁琐,而Lucene正好可以解决某些特殊需求,对于不同库不同表中的数据先建立全量索引,然后将需要检索的数据写入某个单独的表中,供其它业务需求方查询,以后的每天只需要做增量索引并写入数据表即可。 鉴于最近一直在做Lucene相关方面的工作,而本人一向又比较喜欢使用最新发布的版本,而网络上这类资源极少,故将一些要点及示例整理出来,本文主要从实战角度来介绍Lucene 6.0的使用,不涉及过多原理方面的东西,但是对于一些核 继续阅读 »
2016-11-23 Eric Wang
 环境 Lucene 6.0.0 Java "1.8.0_111" OS Windows 7 Ultimate  线程安全 在Lucene中,打开一个IndexWrite之后,就会自动在索引目录中生成write.lock文件,这个文件中并不会有内容,不管是在索引打开期间还是在索引关闭之后,其大小都为0KB,并且在IndexWriter关闭之后,并不会删除该文件。如果同时打开多个IndexWriter的话,后打开的IndexWriter就会抛出LockObtainFailedException异常。这是个很重要的保护机制,因为若针对同一索引打开两个writer的话,会导致索引损坏。所以Lucene中的锁主要针对并发写的情况,在写 继续阅读 »
2016-08-12 Eric Wang
Caused by: java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code at org.apache.lucene.store.DataInput.readVInt(DataInput.java:134) ~[lucene-core-5.5.0.jar:5.5.0 2a228b3920a07f930f7afb6a42d0d20e184a943c - mike - 2016-02-16 15:18:34] at org.apache.lucene.codecs.blocktr 继续阅读 »
2016-05-24 Eric Wang
Lucene的主要搜索API 一个简单的搜索应用主要包括索引和搜索两部分,在Lucene中,IndexSearcher类是用于对索引中文档进行搜索的核心类,它有几个重载的搜索方法,可以使用最常用的方法对特定的项进行搜索,一个项由一个字符串类型的域值和对应的域名构成。现将搜索相关API汇总如下 | 类 | 目的 | | ------------ | ------------ | | IndexSearcher | 搜索索引的核心类。所有搜索都通过IndexSearcher进行,它们会调用该类中重载的search方法 | | Query及其子类 | 封装某种查询类型的具体子类。Query实例将被传递给IndexSearcher 继续阅读 »
2016-09-27 Eric Wang
 Lucene英文目录结构和功能模块 - core: Lucene core library - analyzers    analyzers-common: Analyzers for indexing content in different languages and domains.    analyzers-icu: Analysis integration with ICU (International Components for Unicode).    analyzers-kuromoji: Japanese Morphological Analyzer    analyzers-morfologik: Anal 继续阅读 »
2017-11-15 Eric Wang
抛出问题 在 RDBMS 中,我们可以使用 GROUP BY 来对检索的数据进行分组,同样地,想要在 Lucene 中实现分组要如何做呢?首先思考如下几个问题 - Lucene 是如何实现分组的? - 用来分组的字段(域)或者说 Field 如何添加? - 组的大小如何设置? - 组内大小如何设置? - 如何实现组的分页? - 如果结果集超过了组内大小,可以通过分页解决,那么如果结果集超过了组大小的上限,如何解决? - 如何实现单类别分组,即类似SQL中的 GROUP BY A - 如何实现多类别分组,即类似SQL中的 GROUP BY A, B 从 SQL 的 GROUP BY 说起 如果分组后面只有一个字段,如 GROUP 继续阅读 »