Lucene(3.5)自定义QueryParser

标签: lucene 定义 queryparser | 发表时间:2015-08-22 01:28 | 作者:
出处:http://m635674608.iteye.com
[java]  view plain copy
 
  1. package com.test.lucene;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.index.IndexReader;  
  9. import org.apache.lucene.queryParser.QueryParser;  
  10. import org.apache.lucene.search.IndexSearcher;  
  11. import org.apache.lucene.search.Query;  
  12. import org.apache.lucene.search.ScoreDoc;  
  13. import org.apache.lucene.search.TopDocs;  
  14. import org.apache.lucene.store.Directory;  
  15. import org.apache.lucene.store.FSDirectory;  
  16. import org.apache.lucene.util.Version;  
  17. import org.junit.Test;  
  18.   
  19.   
  20. public class ParserTest {  
  21. //  共找到1条记录  
  22. //  name: java  
  23. //  date:1334494024083  
  24. //  size: 148  
  25. //  content: 全国软件专业人才设计与开发大赛  
  26. //  帽子和服装  
  27. //  Hello  
  28. //  Lucene实战(第二版) Lucene in action  
  29. //  人民邮电出版社  
  30. //  the quick brown fox jumped over the lazy dog  
  31.     private static final Version version = Version.LUCENE_35;  
  32.     private static final Analyzer analyzer = new StandardAnalyzer(version);//和索引时用的分词器一致  
  33.       
  34.     @Test  
  35.     public void testQueryPraser() throws Exception {  
  36.         //QueryParser parser = new QueryParser(version, "content", analyzer);//默认在content域中查找  
  37.         QueryParser parser = new MyQueryParser(version, "content", analyzer);//默认在content域中查找, 重写了getRangeQuery方法, 可以进行数字范围查询  
  38.         Query query = null;   
  39.           
  40.         //查找content(默认域)中存在软件的结果  
  41.         query = parser.parse("软件");  
  42.           
  43.         //查找name域中有java的结果  
  44.         query = parser.parse("name:java");  
  45.           
  46.         //使用通配符  
  47.         query = parser.parse("name: j*");//默认*号不能出现在最前端, 会影响效率, 使用parser.setAllowLeadingWildcard(true)打开  
  48.         query = parser.parse("lu*n?");//只能在单个分词中使用通配符, 即 使用 “lucene*action”就匹配不到  
  49.         query = parser.parse("lucene test");//默认lucene和action是或关系  
  50.         query = parser.parse("lucene OR test");//同上, OR必须大写  
  51.         query = parser.parse("lucene AND test");//与关系  
  52.         query = parser.parse("- lucene + test");//存在test但不存在lucene  
  53.         //query = parser.parse("size:[100 TO 200]");//这个query是TermRangeQuery所以不能用于数字(日期)范围查询  
  54.         query = parser.parse("name:[java TO java]");//查找有a-z字母的    {}不包含  
  55.         //数字范围查询需要重写QueryParser的getRangeQuery方法  
  56.         query = parser.parse("date:[1334550379955 TO 1334550379955]");  
  57.         query = parser.parse("\"lucene action\"~1");//1即phraseQuery中的slop=1  
  58.         query = parser.parse("name:xava~0.74");//加上~代表模糊查询, 要和上面的额短语查询相区别开来,另外~后面可以加一个浮点数去顶相似度  
  59.         //查询大小在145到150, 名称与javv相似, 创建时间在1334550379955之前的 不要, lucene与action相距1  
  60.         query = parser.parse("size:[145 TO 150] + name:javv~ - date:[1 TO 1334550379954] + \"lucene action\"~1");  
  61.         doSearch(query);  
  62.     }  
  63.   
  64.     private void doSearch(Query query) throws Exception{  
  65.         Directory dir = FSDirectory.open(new File("E:/lucene/index"));  
  66.         IndexReader reader = IndexReader.open(dir);   
  67.         IndexSearcher searcher = new IndexSearcher(reader);  
  68.         TopDocs hits = searcher.search(query, 100);  
  69.         System.out.println("共找到" + hits.totalHits + "条记录");  
  70.         ScoreDoc[] docs = hits.scoreDocs;  
  71.         for(int i = 0; i < docs.length; i++){  
  72.             int docId = docs[i].doc;  
  73.             Document doc = searcher.doc(docId);  
  74.             System.out.println("name: " + doc.get("name"));  
  75.             System.out.println("date:" + doc.get("date"));  
  76.             System.out.println("size: " + doc.get("size"));  
  77.             System.out.println("content: " + doc.get("content"));  
  78.         }  
  79.         searcher.close();  
  80.     }  
  81. }  

 

[java]  view plain copy
 
  1. /** 
  2.  * 自定义QueryParser, 提供数字范围查询支持 
  3.  * @author Ping_QC 
  4.  * 
  5.  */  
  6. public class MyQueryParser extends QueryParser {  
  7.     public MyQueryParser(Version matchVersion, String f, Analyzer a) {  
  8.         super(matchVersion, f, a);  
  9.     }  
  10.     @Override  
  11.     protected org.apache.lucene.search.Query getRangeQuery(String field,  
  12.             String part1, String part2, boolean inclusive)  
  13.             throws ParseException {  
  14.         if ("size".equals(field) || "date".equals(field)) {  
  15.             return NumericRangeQuery.newLongRange(field, Long.parseLong(part1),  
  16.                     Long.parseLong(part2), inclusive, inclusive);  
  17.         }  
  18.         return super.newRangeQuery(field, part1, part2, inclusive);  
  19.     }  
  20. }  

 

http://blog.csdn.net/ping_qc/article/details/7465888



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [lucene 定义 queryparser] 推荐:

Lucene(3.5)自定义QueryParser

- - zzm
//  content: 全国软件专业人才设计与开发大赛  . //  Lucene实战(第二版) Lucene in action  .     private static final Analyzer analyzer = new StandardAnalyzer(version);//和索引时用的分词器一致  .

[Lucene] 使用Lucene创建自定义的词干分析器

- - 行业应用 - ITeye博客
代码主要来源: 《Collective Intelligence 实战》. Lucene版本: 4.6.1. 原来的代码是基于2.2写的,很多东西已经变了. // 创建一系列的分词过滤器. // TokenStream的包装类 在2.2之中 是TokenStream. // 将数组转成lucene可识别的CharArraySet对象 CharArraySet类似java.util.set.

lucene排序

- - 开源软件 - ITeye博客
排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最高或卖的最好的商品,再比如在Iteye里的博客栏里,每天都会以降序的方式,来显示出最新发出的几篇博客,有了排序,我们就能在某些时候很方便快速的得到某些有效信息,所以说排序功能,无处不在 ^_^.

[原]Lucene系列-facet

- - 文武天下
facet:面、切面、方面. 个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品. 其中品牌、网络、价格就是商品的维度(facet),点击某个品牌或者网络,获取更细分的结果. 点击品牌小米,获得小米手机的结果,显示27个.

[原]Lucene系列-FieldCache

- - 文武天下
域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但访问速度比较慢,而且只能获得Stored域的值. FieldCache能获得域值数组,根据docId random access域值.

Lucene 使用教程

- - 行业应用 - ITeye博客
1 lucene简介 . 1.1 什么是lucene . Lucene是一个全文搜索框架,而不是应用产品. 因此它并不像 http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品. 1.2 lucene能做什么 . 要回答这个问题,先要了解lucene的本质.

Lucene 4.x 之 IndexReader

- - zzm
在Lucene 3.x时代,《Lucene In Action》是一本相当不错的参考书,书中详细介绍了Lucene各种高级使用技术,对于开发者来说非常实用. 但是近期Lucene升级到了4.x版本,在性能等各方面有了很大的提高,值得在新项目中使用. 然而Lucene 4.x中的API相比3.x来说有了很大的改变,《Lucene In Action》中的很多内容都已经过时了,并且由于4.x推出的时间不长,还没有比较好的文档来对用法进行说明,这个系列文章就是想记录下自己使用Lucene 4.x的经验体会,供大家参考使用.

文章: 集成Lucene和HBase

- - InfoQ cn
在所有先进的应用程序中,不管是购物站点还是社交网络乃至风景名胜站点,搜索都扮演着关键的角色. Lucene搜索程序库事实上已经成为实现搜索引擎的标准. 苹果、IBM、Attlassian(Jira)、Wolfram以及很多大家喜欢的公司【1】都使用了这种技术. 因此,大家对任何能够提升Lucene的可伸缩性和性能的实现都很感兴趣.

Solr\Lucene优劣势分析

- - 淘宝网综合业务平台团队博客
最早lucene2.4以及以前,追溯到2008年前后,lucene刚刚引起大家的关注,到后来Nutch. 、solr的出现,lucene变得更加热. Nutch、Solr的发展,极大推动了lucene的升级. 对于一些接触过搜索,使用过lucene、solr的人来说,一般都会感觉lucene、solr很牛逼.