Lucene
文章平均质量分 53
Lucene笔记
王劭阳
这个作者很懒,什么都没留下…
展开
-
Lucene笔记01-Lucene简介和创建索引初步
一、Lucene存在的意义我们通常的数据库搜索,比如说在content中搜索某个内容,我们需要使用like的方式,这种方式的效率的非常低下的。这便要说到Lucene了,Lucene搜索的时候,用到了索引,这个索引类似于我们查字典时候最前面的索引表,相比于拿一本字典去翻看,我们通过索引表来查询,效率一定会很高,这就是全文搜索存在的意义。首先Lucene会将整个结构创建一个索引,之后搜索的时候,根...原创 2018-10-14 21:33:21 · 156 阅读 · 0 评论 -
Lucene笔记02-Lucene简介和搜索初步
一、简单介绍Lucene的搜索public void searcher() { try { // 创建Directory Directory directory = FSDirectory.open(new File("E:\\Lucene\\IndexLibrary")); // 创建IndexReader Index...原创 2018-10-14 22:20:51 · 145 阅读 · 0 评论 -
Lucene笔记03-Lucene索引创建域选项
一、域存储选项(Field.Store.*)Field.Store.YES:将会存储域值,原始字符串的值将会保存在索引中,可以进行恢复操作,对于主键和标题,可以采用这种方式存储。Field.Store.NO:不会存储域值,通常与Index.ANALYZED合起来使用,索引一些如文章正文等不需要恢复的文档。二、域索引选项(Field.Index.*)Field.Index.ANALY...原创 2018-10-15 23:04:30 · 208 阅读 · 0 评论 -
Lucene笔记04-Lucene索引的删除与更新
一、删除索引public void delete() { IndexWriter indexWriter = null; try { indexWriter = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUC...原创 2018-10-16 22:25:14 · 680 阅读 · 0 评论 -
Lucene笔记05-Lucene索引加权操作和Luke的简单演示
一、给索引加权package com.wsy;import java.io.File;import java.io.IOException;import java.util.HashMap;import java.util.Map;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.ap...原创 2018-10-17 23:30:05 · 293 阅读 · 0 评论 -
Lucene笔记06-对日期和数字进行索引
一、对数字进行索引public void index() { IndexWriter indexWriter = null; int[] attachFiles = {1, 2, 3, 4, 5, 6}; try { indexWriter = new IndexWriter(directory, new IndexWriterConfig(Versi...原创 2018-10-18 08:20:53 · 448 阅读 · 0 评论 -
Lucene笔记07-IndexReader的设计
一、IndexReader的设计IndexReader和IndexWriter在创建索引,读取索引过程中是很常用的两个类,它们在使用完一定要close(),可是对于它们,打开和关闭都是非常耗时的操作,特别对于IndexReader,它的操作更加耗时的,所以要设计成单例。我们需要将IndexReader添加到成员变量中,并在构造函数中对IndexReader对象进行初始化,另外添加一个get...原创 2018-10-20 17:26:02 · 331 阅读 · 0 评论 -
Lucene笔记08-Directory的几种操作方式
一、IndexReader的删除操作IndexReader也可以执行删除操作,使用IndexReader执行的删除操作不需要重新获取IndexReader对象了。使用IndexReader删除的前提是,在创建IndexReader对象的时候,要设置它的readonly为false。indexReader = IndexReader.open(directory,false);index...原创 2018-10-20 20:27:17 · 358 阅读 · 0 评论 -
Lucene笔记09-Lucene的搜索-TermRange等基本搜索
一、精确查询// 精确查询,对field域查询namepublic void searchByTerm(String field, String name, int number) { IndexSearcher indexSearcher = getIndexSearcher(); try { Query query = new TermQuery(new...原创 2018-10-21 00:25:37 · 173 阅读 · 0 评论 -
Lucene笔记10-Lucene的搜索-其他常用Query搜索
一、前缀搜索// 前缀查询public void searchByPrefix(String field, String name, int number) { IndexSearcher indexSearcher = getIndexSearcher(); try { Query query = new PrefixQuery(new Term(fiel...原创 2018-10-23 06:07:49 · 236 阅读 · 0 评论 -
Lucene笔记11-Lucene的搜索-基于QueryParser的搜索
一、QueryParser查询QueryParser查询功能是非常强大的,几乎可以涵盖前面所有的查询,下面是方法体,它将query作为参数传递进来。// 表达式查询public void searchByQueryParser(Query query, int number) { IndexSearcher indexSearcher = getIndexSearcher();...原创 2018-10-23 06:56:09 · 396 阅读 · 0 评论 -
Lucene笔记12-Lucene的搜索-复习和再查询分页搜索
一、Lucene的分页搜索Lucene的分页不像数据库中的limit的方式,而是提供了一种“再查询”的方式。什么是“再查询”呢?就是第一次把所有的数据都取出来,第二次查询再根据需求,从第几条取到第几条,分两步进行查询,所以叫“再查询”。二、测试代码package com.wsy;import org.apache.lucene.analysis.standard.Standard...原创 2018-10-24 06:21:27 · 128 阅读 · 0 评论 -
Lucene笔记13-Lucene的搜索-基于searchAfter的实现
一、使用searchAfter完成分页查询searchAfter()方法原理是获取上一页的最后一个元素和pageSize,再从最后一个元素的后一个开始取pageSize条数据,这就是需要展示的结果了。searchAfter()方法需要三个参数:ScoreDoc after, Query query, int n。after是上一页的最后一个scoreDoc,query是查询的内容,n是总条数。...原创 2018-10-24 07:01:23 · 1044 阅读 · 2 评论 -
Lucene笔记14-Lucene的分词-分词器的原理讲解
14原创 2018-10-25 08:04:26 · 549 阅读 · 0 评论 -
Lucene笔记15-Lucene的分词-通过TokenStream显示分词
一、展示分词内容package com.wsy;import org.apache.lucene.analysis.*;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;impo...原创 2018-10-25 22:37:13 · 298 阅读 · 0 评论 -
Lucene笔记16-Lucene的分词-通过TokenStream显示分词的详细信息
一、通过TokenStream查看分词的详细信息package com.wsy;import org.apache.lucene.analysis.*;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.analysis.tokenattributes.CharTer...原创 2018-10-26 06:19:51 · 257 阅读 · 0 评论 -
Lucene笔记17-Lucene的分词-中文分词介绍
一、分词器的作用分词器的作用就是得到一个TokenStream流,这个流中存储了分词相关的一些信息,可以通过属性获取到分词的详细信息。二、自定义Stop分词器package com.wsy;import org.apache.lucene.analysis.*;import org.apache.lucene.analysis.tokenattributes.CharTermA...原创 2018-10-26 07:52:51 · 208 阅读 · 0 评论 -
Lucene笔记18-Lucene的分词-实现自定义同义词分词器-思路分析
一、实现自定义同义词分词器思路分析前面文章我们提到同义词分词器,这里我们先来分析下同义词分词器的设计思路。首先我们有一个需要分词的字符串string,通过new StringReader(string)拿到Reader。 使用analyzer.tokenStream("content", new StringReader(string))拿到tokenStream,前面讲到tokenSt...原创 2018-10-27 18:10:31 · 270 阅读 · 0 评论 -
Lucene笔记19-Lucene的分词-实现自定义同义词分词器-实现分词器
一、同义词分词器的代码实现package com.wsy;import com.chenlb.mmseg4j.Dictionary;import com.chenlb.mmseg4j.MaxWordSeg;import com.chenlb.mmseg4j.analysis.MMSegTokenizer;import org.apache.lucene.analysis.Analy...原创 2018-10-28 07:38:21 · 333 阅读 · 0 评论 -
Lucene笔记20-Lucene的分词-实现自定义同义词分词器-实现分词器(良好设计方案)
一、目前存在的问题在getSameWords()方法中,我们使用map临时存放了两个键值对用来测试,实际开发中,往往需要很多的这种键值对来处理,比如从某个同义词词典里面获取值之类的,所以说,我们需要一个类,根据key提供近义词。为了能更好的适应应用场景,我们先定义一个接口,其中定义一个getSameWords()方法,在定义一个实现类,实现getSameWords()方法,当我们需要更换字...原创 2018-10-28 10:52:22 · 331 阅读 · 0 评论 -
Lucene笔记21-Lucene的自定义排序
一、排序介绍Lucene对文档搜索完成后,显示的结果是有一个顺序的,如果没有设置排序规则,那么这个顺序就是按照文档的评分降序排列,至于评分的计算,是一个比较复杂的公式,这里不先研究了。可是有时候,我们需要根据需求,改变默认的排序规则,这时候就要用到自定义排序啦,下面来看一下自定义排序是怎么使用的吧。二、代码演示package com.wsy;import org.apache.l...原创 2018-10-28 15:55:08 · 450 阅读 · 0 评论 -
Lucene笔记22-Lucene的使用-Filter
一、Filter应用场景假如有人搜索了一个关键词,通过Lucene查出来了所有的文档,读者比较关心最新的一些内容,因此需要将某些内容过滤掉。只显示用户敏感的文档数据即可。这就要用到过滤器。二、代码演示public void filter(String queryString, Filter filter) { try { IndexSearcher index...原创 2018-10-28 21:50:54 · 602 阅读 · 0 评论 -
Lucene笔记23-Lucene的使用-简单复习索引、检索和分词
一、索引索引过程中的核心类:IndexWriter、Directory、Analyzer、Document、Field。IndexWriter用来写索引。Directory用来定义索引的目标位置是硬盘上还是内存中。Analyzer用来分词,常用的分词器有:SimpleAnalyzer,WhitespaceAnalyzer,StandardAnalyzer,StopAnalyzer。...原创 2018-10-28 22:53:28 · 181 阅读 · 0 评论 -
Lucene笔记24-Lucene的使用-自定义评分简介
一、自定义评分流程有时候,Lucene提供的计算评分规则可能不符合业务需求,所以我们需要自定义评分规则,来实现自定义评分。自定义评分的流程:创建一个类继承CustomScoreQuery、重写getCustomScoreProvider()方法、创建CustomScoreProvider类、重写customScore()方法。二、代码实现package com.wsy;impor...原创 2018-10-29 23:15:46 · 365 阅读 · 0 评论 -
Lucene笔记25-Lucene的使用-根据域进行评分设定
一、需求根据文件名来设置评分规则,或者根据文档的修改时间,将最近一年的评分加倍,一年以外的评分降低,等等。二、具体实现这里根据文件名来修改评分规则,文件名中包含“JRE”和“SYSTEM”的评分加倍,其余减倍。重点就是怎么获取到文件名,在customScore()方法中,有一个doc变量,我们可以通过这个doc来获取文档,从而获取文件名。另外还有一点就是Lucene有域缓存,只要Ind...原创 2018-10-30 22:43:52 · 175 阅读 · 0 评论 -
Lucene笔记26-Lucene的使用-自定义QueryParser解决部分查询的性能问题
一、使用自定义QueryParser的原因对于某些QueryParser(FuzzyQuery、WildcardQuery)在查询时会使得性能降低,所以考虑将这些查询取消。 在具体的查询时候,很可能有这样一种需求:获取的是一个数字查询范围,所以必须要扩展原有的QueryParser才能进行。二、实现方法自定义QueryParser类,继承QueryParser类,并重写响应方法,实现自...原创 2018-10-31 21:29:38 · 514 阅读 · 0 评论 -
Lucene笔记27-Lucene的使用-自定义QueryParser解决日期和数字范围问题
一、需求说明Lucene提供的getRangeQuery(String field, String part1, String part2, boolean inclusive)方法支持的是String,假设我们需要对数字范围查询,那么就需要我们自己来改写了。二、代码实现重写getRangeQuery()方法。searchByQuery()方法将传入的查询字符串进行parse,根据转化...原创 2018-10-31 22:58:49 · 620 阅读 · 0 评论 -
Lucene笔记28-Lucene的使用-自定义Filter
一、应用场景假如某些字段被删除了,重建索引,开销较大,所以可以自定义索引过滤掉被删的索引信息。假如某商场搞活动,把某些商品定义成特价商品,于是我们添加字段,定义成特价商品,再次建索引,这样的开销也是很大,而且今天一个活动,明天一个活动,那岂不是要天天更新索引了,开销太大,所以可以在活动的时候使用自定义过滤器,专门处理,活动结束后,还是使用原来的过滤器。二、过滤器原理新建一个类,继承Fi...原创 2018-11-02 07:54:53 · 255 阅读 · 0 评论 -
Lucene笔记29-Lucene的使用-自定义Filter-合理的设计方式
一、优化代码我们知道,直接传入字符串数组是不可行的,这种模式就写“死”了,前面讲到面向接口编程,需要用到什么样子的实现类就new一个实现类即可。二、具体代码package com.wsy;public interface MyFilterAccessor { public String[] values(); public String getField();...原创 2018-11-05 22:55:55 · 180 阅读 · 0 评论 -
Lucene笔记30-Lucene的扩展-Luke介绍
一、Luke介绍Luke是一个查询索引的工具,Luke的下载点击这里看第二部分,这里就不多讲了,需要注意的是Lucene和Luke要版本匹配,否则Luke是打不开Lucene索引的。首先打开Luke,选择索引的目录,就可以打开索引,就可以看到界面了,右上角有个Re-open表示重新加载索引。Lukeyou有5个界面,依次是索引界面、文档页面、查询页面、文档页面、插件页面。二、页面功能介绍...原创 2018-11-08 07:18:04 · 270 阅读 · 0 评论 -
Lucene笔记31-Lucene的扩展-Tika介绍
一、Tika介绍Tika是2008年由Apache组织开发的项目,主要用于打开不同的文档。Tika的下载请点击这里。在处理文档索引的时候,有时候会碰到pdf,html,word这种非纯文本的内容,这些内容怎么来建立索引呢,这就要用到Tika了,Tika像一个桥梁一样,连通了IndexWriter和上层的各种文件类型。二、Tika的使用使用java -jar命令来打开刚刚下载的jar包。...原创 2018-11-09 07:13:48 · 298 阅读 · 0 评论 -
Lucene笔记32-Lucene的扩展-Tika的第二种使用方式
一、Tika的第二种使用方式第二种使用方式更加的简单,官方文档说,相比于第一种,效率会有降低,下面来看代码。// 文档上说效率没有前一种方式高public String fileToTextEasy(File file) { Tika tika = new Tika(); Metadata metadata = new Metadata(); // 可以自定义m...原创 2018-11-09 08:13:15 · 235 阅读 · 0 评论 -
Lucene笔记33-Lucene的扩展-使用Tika创建索引并进行搜索
一、使用Tika创建索引之前创建索引的文档都是txt文件,现在有了Tika,我们就可以将pdf,word,html等文件,通过Tika提取出文本,之后创建索引,创建索引的写法和之前大致相似。只需要将content域对应的值做一下处理,之前是FileReader来读取,现在是使用Tika.parse()来获取。public void index(boolean update) { ...原创 2018-11-10 15:51:23 · 285 阅读 · 0 评论 -
Lucene笔记34-Lucene的扩展-高亮基础
一、高亮显示用到的类Fragmenter:拿到一个字符串之后,对字符串进行分段 QueryScorer:查询评分,将评分最高的展示给用户 Encoder:显示出来的文本有两种,一种是SimpleEncode(忽略掉HTML标签),一种是DefaultEncode(展示HTML标签) Formatter:自定义标注高亮文本标签二、代码实例这里简单展示下高亮类的使用,对一个句子做了高亮...原创 2018-11-11 17:05:46 · 198 阅读 · 0 评论 -
Lucene笔记35-Lucene的扩展-高亮索引文件
一、对索引文件添加高亮现在我们有一些索引文件,怎么对这些索引文件添加高亮呢?首先需要根据搜索域和值找到这篇文档,然后通过文档获取域值,再将域值交给highlighter进行加工并返回,这个时候,返回的值就是添加过高亮的了。二、代码展示package com.wsy;import org.apache.lucene.analysis.Analyzer;import org.apa...原创 2018-11-11 18:45:32 · 259 阅读 · 0 评论 -
Lucene笔记36-Lucene运用到项目中-需求分析
一、需求分析索引的目标现在需要设计一个留言管理系统,我们需要对哪些字段建立索引呢?留言的内容 留言的标题 留言的附件索引的对象索引的对象,要存放什么属性呢?messageId title summary createDate content:这里的content存放了文本内容或者附件内容既然上面说到content既可以存放文本内容,又可以存放附件内容,那么文本内...原创 2018-11-14 22:43:40 · 143 阅读 · 0 评论 -
Lucene笔记37-Lucene如何通过NRTManager和SearchManager实现近实时搜索
一、思路分析如何实现近实时搜索呢?每次更新完索引都commit?那恐怕太浪费资源了,当数据量非常庞大的时候,几乎不可能。这里有两种方案。使用SearchManager来管理IndexSearcher对象,当发现索引更新之后,searchManager会调用maybeReopen()方法,来获取最新的IndexSearcher对象,索引search()就是最新的结果了。 使用NRTMana...原创 2018-11-18 00:50:05 · 702 阅读 · 0 评论 -
Lucene笔记38-Lucene在项目中的实现分析
一、实时搜索中存在的问题上一节我们提到NRT实时搜索,实时搜索的提交并不是实时的,可能要好几个小时才能提交一次,为什么搜索这么快呢,因为索引数据更新都在内存中实现的,那么,假设有这么一种情况,还没有提交,机器突然挂掉了,那硬盘上的数据还是旧的,就会存在数据不一致的问题了。现在有一个解决方案,那就是将没有更新的索引写到数据库的一张表中。在之后的操作中,通过表来读取数据,更新硬盘上的索引数据。...原创 2018-11-18 17:25:42 · 127 阅读 · 0 评论 -
Lucene笔记39-Lucene在项目中的实现部分Service的功能
因为这一块的代码没有跟着视频敲下来,所以还是附上项目代码的链接吧,主要就是对索引的增删查改这些操作。项目代码请见百度云盘:链接: https://pan.baidu.com/s/1TTKDv3TJkTiUZHF0yXmeug 提取码: ys36。...原创 2018-11-18 20:06:44 · 136 阅读 · 0 评论 -
Lucene笔记40-Lucene在项目中实现索引重构的功能
索引重构:将所有数据从数据库里取出来,创建相应的IndexField完成索引重构。这里就是将Message对象转换成IndexField对象。项目代码请见百度云盘:链接: https://pan.baidu.com/s/1TTKDv3TJkTiUZHF0yXmeug 提取码: ys36。...原创 2018-11-21 07:50:14 · 246 阅读 · 0 评论