Lucene
文章平均质量分 85
sc736031305
这个作者很懒,什么都没留下…
展开
-
Lucene5学习之创建索引入门示例
Lucene更新实在太快了,只好紧跟脚步开始学习Lucene5,花了点时间写了一个demo,就是程序根据用户提供的一个文件夹,读取该文件夹下的所有文件,然后读取文件里的内容写入索引。读取文件部分采用的是最新的NIO2.0API,因此,JDK必须使用1.7及以上版本。Lucene5开发压缩包请在Lucene官网下载。不多说了,对于码农来说,最直接的就是上代码。package com....原创 2015-03-16 20:49:10 · 151 阅读 · 0 评论 -
Lucene5学习之QueryParser-Query解析器
Lucene已经给我们提供了很多Query查询器,如PhraseQuery,SpanQuery,那为什么还要提供QueryParser呢?或者说设计QueryParser的目的是什么?QueryParser的目的就是让你从众多的Query实现类中脱离出来,因为Query实现类太多了,你有时候会茫然了,我到底该使用哪个Query实现类来完成我的查询需求呢,所以Lucene制定了一套Que...2015-04-02 14:17:13 · 721 阅读 · 0 评论 -
Lucene5学习之Filter过滤器
清明3天假,我猜小伙伴们都相约出去玩去了,对于我等屌丝来说,唯有在家写代码打发时间了。其实不是我喜欢宅,只是一个人去哪儿都没有激情,还不如在家安安静静的看看书写写代码来的安逸,对这个看脸的世界就差绝望了,就算代码虐我千万遍,我待代码还是如初恋啊!今天从早上9点起来,就中午做个饭,一坐就是整整10个小时,照着我预想的计划继续记录我的Lucene5学习轨迹,由于Filter体系下子类...2015-04-04 20:08:55 · 744 阅读 · 0 评论 -
Lucene5学习之增量索引(Zoie)
清明节放假期间,就一直在思考着Lucene增量索引问题,通过google我了解到了Zoie的存在,于是就开始2天的学习Zoie之旅,对Zoie的原理以及使用基本掌握,还特地使用Zoie实现了Lucene索引增量索引。不过Zoie已经好久没更新了,Zoie目前版本只支持到Lucene4.3.0,为此我花了2个多小时,修改了Zoie的源码将它升级使其支持Lucene5.0,我修改过的Z...2015-04-07 10:28:31 · 307 阅读 · 0 评论 -
Lucene5学习之评分Scoring
评分机制是Lucene的核心部分之一。Lucene默认是按照评分机制对每个Document进行打分,然后在返回结果中按照得分进行降序排序。内部的打分机制是通过Query,Weight,Scorer,Similarity这几个协作完成的。想要根据自己的业务对默认的评分机制进行干预来影响最终的索引文档的评分,那你必须首先对Lucene的评分公式要了解: coord(q,...2015-04-08 17:43:46 · 274 阅读 · 0 评论 -
Lucene5学习之CustomScoreQuery
虽然前面我们已经集中学习过Query,但CustomScoreQuery当初略过了,今天就来学学这个Query.从类名上看,顾名思义,就大不略的猜得到它的干嘛用的。它是用来进行干预查询权重的,从而影响最终评分的,即评分公式中的queryNorm部分。 一个索引文档的评分高低意味着它的价值大小,有价值的索引文档会优先返回并靠前显示,而影响评分的因素有Term在docume...2015-04-09 21:54:52 · 256 阅读 · 0 评论 -
Lucene5学习之TermVector项向量
项向量在Lucene中属于高级话题。利用项向量能实现很多很有意思的功能,比如返回跟当前商品相似的商品。当你需要实现返回与xxxxxxxx类似的东西时,就可以考虑使用项向量,在Lucene中是使用MoreLikeThis来实现。 项向量其实就是根据Term在文档中出现的频率和文档中包含Term的频率建立的数学模型,计算两个项向量的夹角的方式来判断他们的相似性...2015-04-10 21:56:19 · 693 阅读 · 0 评论 -
Lucene5学习之FunctionQuery功能查询
我猜,大家最大的疑问就是:不是已经有那么多Query实现类吗,为什么又设计一个FunctionQuery,它的设计初衷是什么,或者说它是用来解决什么问题的?我们还是来看看源码里是怎么解释FunctionQuery的: 意思就是基于ValueSource来返回每个文档的评分即valueSourceScore,那ValueSource又是怎么东东?接着看看Value...2015-04-11 13:49:09 · 389 阅读 · 0 评论 -
Lucene5学习之自定义排序
在Lucene5学习之排序-Sort中,我们已经学习了Sort的用法,已经了解了,Lucene搜索返回的命中结果默认是按照索引文档跟搜索关键字的相关度已经排序的,而相关度又是基于内部的打分机制和索引文档id,内部的打分机制则是根据Term的IDF-TF以及创建索引时Field的boost等决定的,默认是按照得分降序排序,得分相同再按docId升序排序。如果你觉得默认的排序方式...2015-04-11 21:33:41 · 292 阅读 · 0 评论 -
Lucene5学习之自定义Collector
你们都睡了,而我却在写博客,呵呵!我也不知道为什么都夜深了,我却还没一点困意,趁着劲头赶紧把自定义结果集写完,已经拖了2天没更新了,不能让你们等太久,我也要把写博客一直坚持下去。 Collector是什么?还是看源码吧。这也是最权威的解释说明。/** * <p>Expert: Collectors are primarily meant t...2015-04-14 01:12:10 · 847 阅读 · 0 评论 -
Lucene5学习之Group分组统计
Group即分组,类似SQL里的group by功能,Lucene中分组是通过内置的几种Collector结果集收集器实现的,有关group的结果集收集器都在org.apache.lucene.search.grouping包及其子包下, 包含group关键字的Collector都是有关Group分组的结果收集器,如果你只需要统计如下这些分组信息:/** 所有组的数量 */...2015-04-15 12:12:37 · 541 阅读 · 0 评论 -
Lucene5学习之Facet简单入门
说到Facet,我还真找不到一个合适的中文词汇来描述它,英文翻译是方面,感觉不够贴切,大家也不必纠结它的中文叫法是啥,你只需要知道使用Facet能解决什么类型的问题就行了,来看几个典型的应用案例: 看了上面几张图,大家应该知道Facet是用来干嘛的了,如果非要用语言描述Facet的用途,那Facet的用途就是根据域的域值进行分组统计,注意这里的域必须是Face...2015-04-16 17:43:52 · 474 阅读 · 0 评论 -
Lucene5学习之Highlighte关键字高亮
Google我想大家应该都用过,输入我们的搜索关键字,然后回车,Google就会返回搜索结果,在返回的界面里,会对命中的关键字进行红色字体标注出来,这就是高亮功能。 Lucene5中高亮功能相关API都在org.apache.lucene.search.highlight包下,我们先从简单的高亮器开始即Highlighter 透过Hightlighter...2015-04-18 16:23:05 · 1058 阅读 · 0 评论 -
Lucene5学习之Facet(续)
默认Facet是统计落入某一组域值的总数的,然后按照总数从大到小排序,判定规则是域值是否相同,其实还可以根据域值是否在某个范围内来判定是否落入某一个分组。这里说的范围就是通过Range定义的,比如: /**1小时之前的毫秒数*/ final LongRange PAST_HOUR = new LongRange("Past hour", this.no...2015-04-19 16:27:51 · 224 阅读 · 0 评论 -
Lucene5学习之Spatial地理位置搜索
现在手机APP满天飞,我想大家都用过这个功能:【搜索我附近的饭店或宾馆】之类的功能,类似这样的地理位置搜索功能非常适用,因为它需要利用到用户当前的地理位置数据,是以用户角度出发,找到符合用户自身需求的信息,应用返回的信息对于用户来说满意度会比较高,可见,地理位置空间搜索在提高用户体验方面有至关重要的作用。在Lucene中,地理位置空间搜索是借助Spatial模块来实现的。...2015-04-21 13:47:04 · 846 阅读 · 0 评论 -
Lucene5学习之Suggest关键字提示
首先需要搞清楚Suggest模块是用来解决什么问题的?Google我想大家都用过,当我们在搜索输入框里输入搜索关键字的时候,紧贴着输入框下方会弹出一个提示框,提示框里会列出Top N个包含当前用户输入的搜索关键字的搜索热词,如图: 这里说的不是前端的这种JS效果,而说的是输入一个关键字如何获取相关的搜索热词,至于js效果,自己Google JQuery自动补全插件,...2015-04-22 16:37:57 · 640 阅读 · 0 评论 -
Lucene5学习之SpellCheck拼写纠错
最近有点累,让这篇又姗姗来迟了,各位不好意思,让你们久等了。趁着周末一个人没什么事,继续Lucene5系列的脚步,今天主题是Suggest模块下另一个功能:拼写纠错。什么叫拼写纠错?大家还是看图吧,这样会比较形象: 看完上面两张图片,我想大家应该已经知道SpellCheck是用来解决问题的了吧。其实这个功能主要目的还是为了提升用户体验问题,当用户输入的搜索关键字里...2015-04-25 17:49:37 · 477 阅读 · 0 评论 -
Lucene5学习之拼音搜索
今天来说说拼音检索,这个功能其实还是用来提升用户体验的,别的不说,最起码避免了用户切换输入法,如果能支持中文汉语拼音简拼,那用户搜索时输入的字符更简便了,用户输入次数少了就是为了给用户使用时带来便利。来看看一些拼音搜索的经典案例: 看了上面几张图的功能演示,我想大家也应该知道了拼音检索的作用以及为什么要使用拼音检索了。那接下来就来说说如何实现: ...2015-04-29 12:50:31 · 832 阅读 · 0 评论 -
Lucene5学习之排序-Sort
这回我们来学习Lucene的排序。机智的少年应该已经发现了,IndexSearcher类的search方法有好几个重载: /** Finds the top <code>n</code> * hits for <code>query</code>. * * @throws BooleanQue...2015-04-01 21:23:26 · 679 阅读 · 1 评论 -
Lucene5学习之自定义同义词分词器简单示例
同义词功能在全文搜索时的意义,大家应该都懂的。今天中文我就试着写了一个同义词分词的示例demo,其实主要代码还是参考Lucene in Action 这本英文版书籍的随书代码,只不过Lucenen in Action书里的示例代码目前最新版只支持到Lucene4.x,对于Lucene5.x,代码需要稍作修改,下面是基于Lucene5.x的自定义同义词分词器demo: pack...2015-03-31 13:13:27 · 214 阅读 · 0 评论 -
Lucene5学习之分页查询
上篇博文《Lucene5学习之创建索引入门示例》里我们创建了索引,现在我们来编写测试代码来查询索引,具体代码如下: package com.yida.framework.lucene5.core;import java.io.IOException;import java.nio.file.Paths;import java.util.ArrayList;...原创 2015-03-17 20:39:06 · 219 阅读 · 0 评论 -
Lucene5学习之使用Luke查看索引
首先在git上下载luke的最新源码,然后导入Eclipse中,如图: 然后编写MANIFEST.MF清单文件:Manifest-Version: 1.0Class-Path: lib/js.jar lib/commons-cli-1.2.jar lib/commons-codec-1.3.jar lib/commons-httpclient...原创 2015-03-17 23:20:54 · 312 阅读 · 0 评论 -
Lucene5学习之使用IKAnalyzer分词器
之前的示例中,使用的是默认的StandardAnalyzer分词器,不能有效的进行中文分词,下面演示下如何在Lucene5.0中使用IKAnalyzer分词器。 首先下载IKAnalyzer分词器源码,IKAnalyzer分词器源码托管在OSChina的git上。下载地址:http://git.oschina.net/wltea/IK-Analyzer-2012FF请...原创 2015-03-18 13:46:00 · 654 阅读 · 0 评论 -
Lucene5学习之使用Ansj-seg分词器
这回我们来玩玩ansj分词器,由于Lucene5.0在API上有点小变化,需要修改ansj分词器源码,重新打包jar包,然后mvn install到本地仓库才能引用到项目中。至于怎么修改以及怎么打包jar,我就不过多说明了,有点麻烦,我想偷个懒,哈哈。这里我就直接把打包后的jar分享给你们,jar包注意在底下的附件里下载。 我就说说,怎么在项目中使用ansj分词器,首先pom...原创 2015-03-19 15:59:37 · 1016 阅读 · 0 评论 -
Lucene5学习之Field理解
Field即Lucene索引文档里的域,一个文档Document可以包含多个Field域,你可以类比数据库表里可以有多个字段来理解,虽然两者不能等同,但有助于你理解每个Field包含3部分信息:域的名称,域的类型,域的值,域的值可以是String,java.io.Reader,TokenStream,可以是byte[]字节数组,可以是数字等等,而域的类型则是有IndexableFi...原创 2015-03-20 17:54:01 · 159 阅读 · 0 评论 -
Lucene5学习之Directory理解
Directory即Lucene中对索引目录的一个抽象,体现到API上,它被设计为一个抽象类,类里面定义了一些抽象方法,如listAll列出目录下所有文件,deleteFile(String name) 根据文件名称删除索引文件,这个都是文件的基本操作,其中比较重要的一个接口方法是makeLock,为什么要为索引目录加锁?其实就跟你上厕所为什么要锁门是一样一样滴?我没拉完你就给我乖乖等着。...原创 2015-03-20 22:30:58 · 327 阅读 · 0 评论 -
Lucene5学习之TermQuery使用
首先来学习用下TermQuery,这是最简单的一个Query实现,即查询索引文档中是否包含了指定的Term,Lucene官方API注释里是这样说的:public class TermQueryextends QueryA Query that matches documents containing a term. This may be combined with oth...原创 2015-03-23 10:32:47 · 679 阅读 · 0 评论 -
Lucene5学习之TermRangeQuery使用
TermRangeQuery是用于字符串范围查询的,既然涉及到范围必然需要字符串比较大小,字符串比较大小其实比较的是ASC码值,即ASC码范围查询。一般对于英文来说,进行ASC码范围查询还有那么一点意义,中文汉字进行ASC码值比较没什么太大意义,所以这个TermRangeQuery了解就行,用途不太大,一般数字范围查询NumericRangeQuery用的比较多一点,比如价格,年龄,金...原创 2015-03-23 13:32:07 · 1201 阅读 · 0 评论 -
Lucene5学习之NumericRangeQuery使用
说到NumericRangeQuery查询,你们肯定觉得很简单,不就是数字范围查询吗?用户提供一个上限值和一个下限值,底层API里直接>min,<max,真的是这样吗?其实在Lucene里只能对字符串String建立索引,那么数字怎么转成String,你肯定又会想当然的认为toString()一下就OK啦?OK,假如真的是这样的,那字符串"3" > "26"问题怎么解...原创 2015-03-23 17:15:46 · 437 阅读 · 0 评论 -
Lucene5学习之PrefixQuery使用
继续学习Query系列的实现类,PrefixQuery即前缀查询,类似于数据库SQL里的like 'java%',查询以指定前缀字符串打头的索引文档。官方API是这样解释的: 意思是这个Query是用包含指定前缀的Terms来匹配索引文档的,PrefixQuery是QueryParser根据用户的输入构建的。 这个Query很简单,没什么多说的,直接上使用示例: ...原创 2015-03-24 09:54:04 · 541 阅读 · 0 评论 -
Lucene5学习之FuzzyQuery使用
接着学习MultiTermQuery下的另一个Query子类FuzzyQuery,它用于模糊相似度查询,那这里说的相似度是如何判定的?用到的是Damerau-Levenshtein算法,具体这个算法的原理我也不是很清楚,只知道个大概,Levenshtein中文一般翻译为编辑距,何为编辑距?即两个字符串有一个转变成另一个所需要的最小的操作步骤,这里说的操作步骤指的是插入一个字符或修改一...原创 2015-03-24 15:07:20 · 4935 阅读 · 0 评论 -
Lucene5学习之WildcardQuery使用
WildcardQuery即通配符查询,即使用通配符来模糊查询,常见的通配符有?,*,-等等,通配符不知道怎么使用的自己Google学习下吧。照例还是先阅读官方的API文档: 特别要注意的Note后面的话,提醒我们注意,WildcardQuery查询是很慢的,因为它需要遍历很多的Term,为了避免极慢的查询速度,请不要使用以星号开头的通配符进行查询。 除了官方给的那点提醒以...原创 2015-03-24 22:28:00 · 3354 阅读 · 1 评论 -
Lucene5学习之SpanQuery跨度查询
SpanQuery下的子类有好几个,我就放一篇里集中说说。SpanQuery即跨度查询,首先要理解跨度这个概念,Lucene里跨度是用Spans这个类定义的,源码如下: /** Expert: an enumeration of span matches. Used to implement span searching. * Each span represents a ...原创 2015-03-26 12:59:04 · 630 阅读 · 0 评论 -
Lucene5学习之PhraseQuery短语查询
PhraseQuery:短语查询,就是查询文档中是否包含指定的一个Term或多个Term,多个Term之间可以指定间隔即slop参数,官方API解释如图: 使用示例代码,如下: package com.yida.framework.lucene5.query;import java.io.IOException;import org.apache.luc...原创 2015-03-26 15:54:43 · 1287 阅读 · 0 评论 -
Lucene5学习之LuceneUtils工具类简单封装
周六花了整整一下午,将Lucene5中有关索引的常见操作进行了简单封装,废话不多说,上代码: package com.yida.framework.lucene5.util;import java.io.IOException;import java.util.concurrent.ExecutorService;import java.util.concur...2015-03-28 20:40:07 · 150 阅读 · 0 评论 -
Lucene5学习之多线程创建索引
昨晚睡觉前把多线程创建索引demo写好了,今天早上7点多就起来,趁着劲头赶紧记录分享一下,这样对那些同样对Lucene感兴趣的童鞋也有所帮助。 我们都知道Lucene的IndexWriter在构造初始化的时候会去获取索引目录的写锁writerLock,加锁的目的就是保证同时只能有一个IndexWriter实例在往索引目录中写数据,具体看截图: 而在多线程环境下,光保证只有...原创 2015-03-29 08:31:14 · 608 阅读 · 0 评论 -
Lucene5学习之多索引目录查询以及多线程查询
上一篇中我们使用多线程创建了索引,下面我们来试着采用不把多个索引目录里的数据合并到一个新的索引目录的方式去查询索引数据,当然你也可以合并(合并到一个索引目录查询就很简单了),其实很多情况我们都是不合并到一个索引目录的,那多索引目录该如何查询呢,在Lucene5中使用的MultiReader类,在Lucene4时代,使用的是MultiSearcher类。至于Lucene多线程查询,只需要...2015-03-29 21:09:39 · 441 阅读 · 0 评论 -
Lucene5学习之使用MMSeg4j分词器
MMSeg4j是一款中文分词器,详细介绍如下: 1、mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。 ...2015-04-30 15:03:59 · 290 阅读 · 0 评论