Lucene5学习之PrefixQuery使用

     继续学习Query系列的实现类,PrefixQuery即前缀查询,类似于数据库SQL里的like 'Java%',查询以指定前缀字符串打头的索引文档。官方API是这样解释的:


 意思是这个Query是用包含指定前缀的Terms来匹配索引文档的,PrefixQuery是QueryParser根据用户的输入构建的。

     这个Query很简单,没什么多说的,直接上使用示例: 

Java代码  

  1. String fieldName = "contents";  
  2. String queryString = "lucene";  
  3.           
  4. Query query = new PrefixQuery(new Term(fieldName,queryString));  

    注意,使用PrefixQuery时,你的输入不需要加*星号的,即queryString=lucene即可,而不用多此一举写成

   queryString=lucene*,但如果你是使用QueryParser来构建前缀查询,则需要添加星号的,如:

Java代码  

  1. QueryParser parser = new QueryParser(fieldName, new AnsjAnalyzer());  
  2. Query query = parser.parse("lucene*");  

    这个是容易犯错的地方,特此提醒。

    还有需要注意的是,你提供的查询参数queryString必须全部是小写的,不能包含大写形式,因为Lucene内部的Term都是经过小写处理过的,没有大写形式的,你如果这样写:

Java代码  

  1. //参数定义  
  2. String directoryPath = "D:/lucenedir";  
  3. String fieldName = "contents";  
  4. String queryString = "Lucene"; //Lucene中L大写了,是搜不到结果的  
  5.           
  6. Query query = new PrefixQuery(new Term(fieldName,queryString));  

    而你如果使用QueryParser来构建前缀查询则不用担心这个大小写问题,因为QueryParser会经过分词器,分词器会进行大小写处理,前面的几篇博文也提到过。

    最后提醒一点就是前缀查询性能不太好,尽量提供的查询关键字长度大点,不要使用什么a*这种方式来查询,更不用说**这种方式了。注意了上面几点,PrefixQuery怎么使用就基本上掌握了。

    如果你还有什么问题请加我Q-Q:7-3-6-0-3-1-3-0-5,

或者加裙
一起交流学习!

转载:http://iamyida.iteye.com/blog/2194955

时间: 2024-12-05 14:58:08

Lucene5学习之PrefixQuery使用的相关文章

Lucene5学习之Filter过滤器

  清明3天假,我猜小伙伴们都相约出去玩去了,对于我等屌丝来说,唯有在家写代码打发时间了.其实不是我喜欢宅,只是一个人去哪儿都没有激情,还不如在家安安静静的看看书写写代码来的安逸,对这个看脸的世界就差绝望了,就算代码虐我千万遍,我待代码还是如初恋啊!今天从早上9点起来,就中午做个饭,一坐就是整整10个小时,照着我预想的计划继续记录我的Lucene5学习轨迹,由于Filter体系下子类有点多,还要编写测试demo,所以这篇博客有点姗姗来迟,请大家多多包涵!                    

Lucene5学习之自定义排序

         在Lucene5学习之排序-Sort中,我们已经学习了Sort的用法,已经了解了,Lucene搜索返回的命中结果默认是按照索引文档跟搜索关键字的相关度已经排序的,而相关度又是基于内部的打分机制和索引文档id,内部的打分机制则是根据Term的IDF-TF以及创建索引时Field的boost等决定的,默认是按照得分降序排序,得分相同再按docId升序排序.如果你觉得默认的排序方式满足不了你的需求,你可以设置SortField按照特定的域来排序,特定的域排序其实根据域的type类型去

Lucene5学习之多线程创建索引

    昨晚睡觉前把多线程创建索引demo写好了,今天早上7点多就起来,趁着劲头赶紧记录分享一下,这样对那些同样对Lucene感兴趣的童鞋也有所帮助.     我们都知道Lucene的IndexWriter在构造初始化的时候会去获取索引目录的写锁writerLock,加锁的目的就是保证同时只能有一个IndexWriter实例在往索引目录中写数据,具体看截图:  而在多线程环境下,光保证只有IndexWriter实例能得到锁还不行,还必须保证每次只能有一个线程能获取到writerLock,Luce

Lucene5学习之Suggest关键字提示

     首先需要搞清楚Suggest模块是用来解决什么问题的?Google我想大家都用过,当我们在搜索输入框里输入搜索关键字的时候,紧贴着输入框下方会弹出一个提示框,提示框里会列出Top N个包含当前用户输入的搜索关键字的搜索热词,如图:       这里说的不是前端的这种JS效果,而说的是输入一个关键字如何获取相关的搜索热词,至于js效果,自己Google jQuery自动补全插件,我以前玩过,这里关注的是提示数据如何获取,当然你也可以使用数据库SQL like "%xxxx%"来

Lucene5学习之Highlighte关键字高亮

   Google我想大家应该都用过,输入我们的搜索关键字,然后回车,Google就会返回搜索结果,在返回的界面里,会对命中的关键字进行红色字体标注出来,这就是高亮功能.        Lucene5中高亮功能相关API都在org.apache.lucene.search.highlight包下,我们先从简单的高亮器开始即Highlighter        透过Hightlighter类的源码,我们首先需要去了解里面的每个成员变量的含义: Java代码   public static fina

Lucene5学习之FunctionQuery功能查询

    我猜,大家最大的疑问就是:不是已经有那么多Query实现类吗,为什么又设计一个FunctionQuery,它的设计初衷是什么,或者说它是用来解决什么问题的?我们还是来看看源码里是怎么解释FunctionQuery的:         意思就是基于ValueSource来返回每个文档的评分即valueSourceScore,那ValueSource又是怎么东东?接着看看ValueSource源码里的注释说明:  ValueSource是用来根据指定的IndexReader来实例化Funct

Lucene5学习之创建索引入门示例

    Lucene更新实在太快了,只好紧跟脚步开始学习Lucene5,花了点时间写了一个demo,就是程序根据用户提供的一个文件夹,读取该文件夹下的所有文件,然后读取文件里的内容写入索引.读取文件部分采用的是最新的NIO2.0API,因此,JDK必须使用1.7及以上版本.Lucene5开发压缩包请在Lucene官网下载.不多说了,对于码农来说,最直接的就是上代码. Java代码   package com.yida.framework.lucene5.core;      import jav

Lucene5学习之SpanQuery跨度查询

    SpanQuery下的子类有好几个,我就放一篇里集中说说.SpanQuery即跨度查询,首先要理解跨度这个概念,Lucene里跨度是用Spans这个类定义的,源码如下:   Java代码   /** Expert: an enumeration of span matches.  Used to implement span searching.   * Each span represents a range of term positions within a document.  

Lucene5学习之使用MMSeg4j分词器

     MMSeg4j是一款中文分词器,详细介绍如下:        1.mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用.          2.MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配.Complex 加了四