`
lxwt909
  • 浏览: 572789 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
      同义词功能在全文搜索时的意义,大家应该都懂的。今天中文我就试着写了一个同义词分词的示例demo,其实主要代码还是参考Lucene in Action 这本英文版书籍的随书代码,只不过Lucenen in Action书里的示例代码目前最新版只支持到Lucene4.x,对于Lucene5.x,代码需要稍作修改,下面是基于Lucene5.x的自定义同义词分词器demo:   package com.yida.framework.lucene5.analyzer.synonym; import java.io.IOException; /** * 同义词提取引擎 * ...
     上一篇中我们使用多线程创建了索引,下面我们来试着采用不把多个索引目录里的数据合并到一个新的索引目录的方式去查询索引数据,当然你也可以合并(合并到一个索引目录查询就很简单了),其实很多情况我们都是不合并到一个索引目录的,那多索引目录该如何查询呢,在Lucene5中使用的MultiReader类,在Lucene4时代,使用的是MultiSearcher类。至于Lucene多线程查询,只需要在构建IndexSearcher对象时传入一个ExecutorService线程池管理对象即可,具体请看下面贴出的示例代码: package com.yida.framework.lucene5.in ...
    昨晚睡觉前把多线程创建索引demo写好了,今天早上7点多就起来,趁着劲头赶紧记录分享一下,这样对那些同样对Lucene感兴趣的童鞋也有所帮助。     我们都知道Lucene的IndexWriter在构造初始化的时候会去获取索引目录的写 ...
     周六花了整整一下午,将Lucene5中有关索引的常见操作进行了简单封装,废话不多说,上代码:   package com.yida.framework.lucene5.util; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.locks.Lock; i ...
    PhraseQuery:短语查询,就是查询文档中是否包含指定的一个Term或多个Term,多个Term之间可以指定间隔即slop参数,官方API解释如图:     使用示例代码,如下:   package com.yida.framework.lucene5.query; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apac ...
    SpanQuery下的子类有好几个,我就放一篇里集中说说。SpanQuery即跨度查询,首先要理解跨度这个概念,Lucene里跨度是用Spans这个类定义的,源码如下:   /** Expert: an enumeration of span matches. Used to implement span searching. * Each span represents a range of term positions within a document. Matches * are enumerated in order, by increasing docume ...
     群里有一哥们儿安装Activiti的Eclipse插件安装了2天了还没装好,我看了都快急死了,好人做到底,特地为他写了这篇博客。     我个人不喜欢在线安装的方式,因为速度太慢,而且过于傻瓜式,我对于傻瓜式的东西不感兴趣,这也是为什么我喜欢Eclispe而不喜欢用MyEclipse的原因,当然MyEclipse更卡也有一部分原因,额,扯远了哈,回归正题,离线方式安装Activiti的Eclipse插件的话,首先你需要去下载Activiti-designer压缩包即Activiti的eclipse插件安装包,下载地址如下:     http://www.activiti.org ...
     WildcardQuery即通配符查询,即使用通配符来模糊查询,常见的通配符有?,*,-等等,通配符不知道怎么使用的自己Google学习下吧。照例还是先阅读官方的API文档:  特别要注意的Note后面的话,提醒我们注意,WildcardQuery查询是 ...
     接着学习MultiTermQuery下的另一个Query子类FuzzyQuery,它用于模糊相似度查询,那这里说的相似度是如何判定的?用到的是Damerau-Levenshtein算法,具体这个算法的原理我也不是很清楚,只知道个大概,Levenshtein中文一般翻译为编辑距,何为编辑距?即两个字符串有一个转变成另一个所需要的最小的操作步骤,这里说的操作步骤指的是插入一个字符或修改一个字符或者删除一个字符。比如: shade / shadow 他们的编辑距就是2,这个不用解释的吧。理解了编辑距就可以了,至于算法怎么实现的,自己去网上搜索Damerau-Levenshtein算法 ...
     继续学习Query系列的实现类,PrefixQuery即前缀查询,类似于数据库SQL里的like 'java%',查询以指定前缀字符串打头的索引文档。官方API是这样解释的:  意思是这个Query是用包含指定前缀的Terms来匹配索引文档的,PrefixQuery是QueryParser根据用户的输入构建的。      这个Query很简单,没什么多说的,直接上使用示例:  String fieldName = "contents"; String queryString = "lucene"; Query query = ...
    说到NumericRangeQuery查询,你们肯定觉得很简单,不就是数字范围查询吗?用户提供一个上限值和一个下限值,底层API里直接>min,<max,真的是这样吗?其实在Lucene里只能对字符串String建立索引,那么数字怎么转成String,你肯定又会想当然的认为toString()一下就OK啦?OK,假如真的是这样的,那字符串"3" > "26"问题怎么解决?OK,可以通过在数字前面加前导零解决,“03”<"26"是没错,可是前导零加几位没法确定,加多了浪费硬盘空间,加少了支持索引的数字位 ...
    TermRangeQuery是用于字符串范围查询的,既然涉及到范围必然需要字符串比较大小,字符串比较大小其实比较的是ASC码值,即ASC码范围查询。一般对于英文来说,进行ASC码范围查询还有那么一点意义,中文汉字进行ASC码值比较没什么太大意义,所以这个TermRangeQuery了解就行,用途不太大,一般数字范围查询NumericRangeQuery用的比较多一点,比如价格,年龄,金额,数量等等都涉及到数字,数字范围查询需求也很普遍。     我们来看看官方API里是怎么解释这个Query的:  意思就是这个Query通过一个范围内的Term来匹配索引文档,这个Query通过一 ...
    首先来学习用下TermQuery,这是最简单的一个Query实现,即查询索引文档中是否包含了指定的Term,Lucene官方API注释里是这样说的: public class TermQuery extends Query A Query that matches documents containing a term. This may be combined with other terms ...
Directory即Lucene中对索引目录的一个抽象,体现到API上,它被设计为一个抽象类,类里面定义了一些抽象方法,如listAll列出目录下所有文件,deleteFile(String name) 根据文件名称删除索引文件,这个都是文件的基本操作,其中比较重要的一个接口方法是makeLock,为什么要为索引目录加锁?其实就跟你上厕所为什么要锁门是一样一样滴?我没拉完你就给我乖乖等着。  BaseDirectory是Directory的一个子类,它默认实现了makeLock方法,   @Override public final Lock makeLock(String na ...
     Field即Lucene索引文档里的域,一个文档Document可以包含多个Field域,你可以类比数据库表里可以有多个字段来理解,虽然两者不能等同,但有助于你理解每个Field包含3部分信息:域的名称,域的类型,域的值, 域的值可以是String,java.io.Reader,TokenStream,可以是byte[]字节数组,可以是数字等等,而域的类型则是有IndexableFieldType类表示的,域的名称就没什么好说的了。     为了方便我们创建Field,Lucene为我们提供了各种Field子类,如IntField, LongField, FloatField, ...
Global site tag (gtag.js) - Google Analytics