lucene 高级查询对象应用及分析
2012-02-03 14:18
295 查看
/**********************************/ 0.如何测试查询以及索引分词器的分词效果 >>lucene的分词器的大致内部实现是以过滤器链条的方式实现的就像我们的servlet过滤器程序一样 一个请求可以通过被很多个过滤器处理然后被传送到action中,那么lucene是通过不同的过滤器的功能 来实现不同的需求分词如org.apache.lucene.analysis.StopFilter.java, org.apache.lucene.analysis.LowerCaseFilter.java...这些被上一个过滤器过滤后的 文本将会接着传递到下一个过滤器进行又一轮的过滤 >>示例代码: Analyzer a = new StandardAnalyzer(Version.LUCENE_CURRENT); TokenStream t = a.tokenStream("f", new StringReader("how is your job?")); while(t.incrementToken()){ System.out.println(t); } >>分词后的效果: (how,startOffset=0,endOffset=3,positionIncrement=1,type=<ALPHANUM>) (is,startOffset=4,endOffset=6,positionIncrement=1,type=<ALPHANUM>) (your,startOffset=7,endOffset=11,positionIncrement=1,type=<ALPHANUM>) (job,startOffset=12,endOffset=15,positionIncrement=1,type=<ALPHANUM>) /**********************************/ /**********************************/ 1.org.apache.lucene.search.regex.RegexQuery.java >>示例代码 RegexQuery query = new RegexQuery(new Term("name",".*360.*")); >>分析: .代表任意字符*表示出现任意次数然后中间有一个360的数字 >>对应的查询语法: query=name:.*360.* >>部分参考结果: name=京东商城是360的里面的东西不是很好 /**********************************/ /**********************************/ 2.org.apache.lucene.search.spans.SpanQuery.java >>SpanQuery介绍: SpanQuery比PhraseQuery具有更好的关键词和关键词之间的位置感应能力 SpanQuery属于高级查询他不能够使用查询语法字符窜进行构造因为QueryParser 不支持他的解析 >其主要的子类有: org.apache.lucene.search.spans.SpanFirstQuery.java org.apache.lucene.search.spans.SpanTermQuery.java org.apache.lucene.search.spans.SpanNearQuery.java org.apache.lucene.search.spans.SpanNotQuery.java org.apache.lucene.search.spans.SpanOrQuery.java org.apache.lucene.search.spans.SpanQuery.java >>示例代码 SpanTermQuery jing = new SpanTermQuery(new Term("name", "京")); SpanTermQuery dong = new SpanTermQuery(new Term("name", "东")); SpanTermQuery shang = new SpanTermQuery(new Term("name", "商")); SpanTermQuery cheng = new SpanTermQuery(new Term("name", "城")); SpanTermQuery shi = new SpanTermQuery(new Term("name", "是")); SpanTermQuery s360 = new SpanTermQuery(new Term("name", "360")); /**SpanTermQuery是用于构成其他SpanQuery的基础单独用的话就相当于TermQuery * 他在构造其他SpanQuery的收作为参数传递进去 */ >>org.apache.lucene.search.spans.SpanFirstQuery.java用例: SpanFirstQuery query = new SpanFirstQuery(jing,1); >>对应查询语法: query=spanFirst(name:京, 1) >>部分参考结果: name=京东商城是360的里面的东西不是很好 >>分析: 在PhraseQuery里面关键词之间的slop不会按照一定的顺序去移动匹配,而SpanQuery不同 这一点正好和PhraseQuery相反,而SpanFirstQuery表示按照关键词的顺序,从第一个关键 开始算,在小于等于第二个参数的整数的情况去匹配北京的京这个关键词如果在这个范围内匹配到的 文档算是有效文档,因为京正好在第1个位置出现了正好这个文档被匹配 >>org.apache.lucene.search.spans.SpanNearQuery.java >>示例代码: SpanNearQuery query = new SpanNearQuery( new SpanTermQuery[] { jing, dong, shang, cheng, shi, s360 },/** 查询需要关联的关键词*/ 1, /** 相当于slop divisor*/ false); // false表示按照相对的左右位置去查找和PhraseQuery的效果一样 // true表示按照从上到下的关键词顺序进行匹配 // 如果我索引的文本是: 东京商城是360的里面的东西不是很好 // 并且第三个参数设置为true那么结果将匹配不到那是因为 // 他不会从相对的左右两边移动1个位置去找下一个关键词而只是往下移动 // 一个关键词的位置进行匹配所以找不到 // 否则他会从两边相对的位置去进行一个查找那么这时候的效果就达到了PhraseQuery的效果 // 这就是PhraseQuery和SpanNearQuery的区别之所在 >>对应的查询语法: query=spanNear([name:京, name:东, name:商, name:城, name:是, name:360], 2, false) >>部分参考结果: name=东京商城是360的里面的东西不是很好 name=京东商城是360的里面的东西不是很好 /**********************************/ /**********************************/ >>org.apache.lucene.search.spans.SpanOrQuery.java >>spanOrQuery主要用于将多个SpanQuery的实现子类的实例组合起来进行查询 >>示例代码 Term t1 = new Term("name", "中"); //中 華 人 民 共 和 國 Term t2 = new Term("name", "共"); SpanTermQuery stq1 = new SpanTermQuery(t1); SpanTermQuery stq2 = new SpanTermQuery(t2); SpanQuery sp = new SpanNearQuery (new SpanTermQuery[]{stq1,stq2}, 3, false); /**将一个相同的spanquery作为两个元素组成数组然后组合成或者的关系 */ SpanOrQuery oq = new SpanOrQuery(new SpanQuery[]{sp,sp}); >>对应查询语法: query=spanOr([spanNear([name:中, name:共], 3, false), spanNear([name:中, name:共], 3, false)]) >>分析: 在中和共这两个关键词中间最多可以间隔多少个关键词 >>部分参考结果: id=1 name=中华人民共和国 cdate=Thu Feb 02 00:00:00 CST 2012 /**********************************/ /**********************************/ >>org.apache.lucene.search.spans.SpanPositionRangeQuery.java >>SpanPositionRangeQuery用于在指定的位置范围内查找关键词 >>示例代码: Term t1 = new Term("name", "中"); //中 華 人 民 共 和 國 Term t2 = new Term("name", "共"); SpanTermQuery stq1 = new SpanTermQuery(t1); SpanTermQuery stq2 = new SpanTermQuery(t2); /** 从第一个关键所在位置开始算连续找5关键词在五个关键词内决定是否需要这个文档*/ SpanPositionRangeQuery spq = new SpanPositionRangeQuery(stq2, 0, 5); >>对应查询语法: query=spanPosRange(name:共, 0, 5) >>部分参考结果: id=1 name=中华人民共和国 cdate=Thu Feb 02 00:00:00 CST 2012 /**********************************/ /**********************************/ >>org.apache.lucene.search.spans.FieldMaskingSpanQuery.java >>用于组织现有块查询语句并且将气起一个别名 >>示例代码: Term t1 = new Term("name", "中"); //中 華 人 民 共 和 國 Term t2 = new Term("name", "共"); SpanTermQuery stq1 = new SpanTermQuery(t1); SpanTermQuery stq2 = new SpanTermQuery(t2); FieldMaskingSpanQuery fmq = new FieldMaskingSpanQuery(stq1, "name"); >>对应查询语法: query=mask(name:中) as name >>部分参考结果: id=1 name=中华人民共和国 cdate=Thu Feb 02 00:00:00 CST 2012 /**********************************/ /**********************************/ >>org.apache.lucene.search.spans.SpanOrQuery.java >>spanOrQuery主要用于将多个SpanQuery的实现子类的实例组合起来进行查询 >>示例代码 Term t1 = new Term("name", "中"); //中 華 人 民 共 和 國 Term t2 = new Term("name", "共"); SpanTermQuery stq1 = new SpanTermQuery(t1); SpanTermQuery stq2 = new SpanTermQuery(t2); SpanQuery sp = new SpanNearQuery (new SpanTermQuery[]{stq1,stq2}, 3, false); /**将一个相同的spanquery作为两个元素组成数组然后组合成或者的关系 */ SpanOrQuery oq = new SpanOrQuery(new SpanQuery[]{sp,sp}); >>对应查询语法: query=spanOr([spanNear([name:中, name:共], 3, false), spanNear([name:中, name:共], 3, false)]) >>分析: 在中和共这两个关键词中间最多可以间隔多少个关键词 >>部分参考结果: id=1 name=中华人民共和国 cdate=Thu Feb 02 00:00:00 CST 2012 /**********************************/ /**********************************/ >>org.apache.lucene.search.spans.SpanPositionRangeQuery.java >>SpanPositionRangeQuery用于在指定的位置范围内查找关键词 >>示例代码: Term t1 = new Term("name", "中"); //中 華 人 民 共 和 國 Term t2 = new Term("name", "共"); SpanTermQuery stq1 = new SpanTermQuery(t1); SpanTermQuery stq2 = new SpanTermQuery(t2); /** 从第一个关键所在位置开始算连续找5关键词在五个关键词内决定是否需要这个文档*/ SpanPositionRangeQuery spq = new SpanPositionRangeQuery(stq2, 0, 5); >>对应查询语法: query=spanPosRange(name:共, 0, 5) >>部分参考结果: id=1 name=中华人民共和国 cdate=Thu Feb 02 00:00:00 CST 2012 /**********************************/ /**********************************/ >>org.apache.lucene.search.spans.FieldMaskingSpanQuery.java >>用于组织现有块查询语句并且将气起一个别名 >>示例代码: Term t1 = new Term("name", "中"); //中 華 人 民 共 和 國 Term t2 = new Term("name", "共"); SpanTermQuery stq1 = new SpanTermQuery(t1); SpanTermQuery stq2 = new SpanTermQuery(t2); FieldMaskingSpanQuery fmq = new FieldMaskingSpanQuery(stq1, "name"); >>对应查询语法: query=mask(name:中) as name >>部分参考结果: id=1 name=中华人民共和国 cdate=Thu Feb 02 00:00:00 CST 2012 /**********************************/ /**********************************/ >>org.apache.lucene.search.spans.SpanNotQuery.java Term t1 = new Term("name", "中"); //中 華 人 民 共 和 國 Term t2 = new Term("name", "360"); SpanTermQuery stq1 = new SpanTermQuery(t1); SpanTermQuery stq2 = new SpanTermQuery(t2); //stq1表示包含这个条件 //stq2不包含这个条件 SpanNotQuery snq = new SpanNotQuery(stq1,stq2); >>对应查询语法: query=spanNot(name:中, name:360) >>部分参考结果: id=1 name=中华人民共和国的 cdate=Thu Feb 02 00:00:00 CST 2012 /**********************************/ /**********************************/ >>org.apache.lucene.search.spans.SpanNotQuery.java Term t1 = new Term("name", "中"); //中 華 人 民 共 和 國 Term t2 = new Term("name", "360"); SpanTermQuery stq1 = new SpanTermQuery(t1); SpanTermQuery stq2 = new SpanTermQuery(t2); //stq1表示包含这个条件 //stq2不包含这个条件 SpanNotQuery snq = new SpanNotQuery(stq1,stq2); >>对应查询语法: query=spanNot(name:中, name:360) >>部分参考结果: id=1 name=中华人民共和国的 cdate=Thu Feb 02 00:00:00 CST 2012 /**********************************/
相关文章推荐
- mongoose 查询操作的高级应用
- Lucene查询对象笔记_TermQuery(笔记)
- Java面向对象高级--实例分析—宠物商店
- 层次查询和分析函数(LAG、LEAD)在号段选取中的应用
- Javascript 拖拽的一些高级的应用——逐行分析代码,让你轻松了解拖拽的原理
- 空间分析及应用案例高级培训班培训照片2
- 线程高级应用-心得3-线程范围内的共享变量以及应用场景及面试题案例分析
- IOS 应用创建一个视图对象分析
- Elasticsearch源码分析一--调用Lucene查询接口之match_all查询
- Castle ActiveRecord 应用 Expression.Example 模板对象匹配查询
- 浏览器对象BOM模型开发示意图分析(应用设计)
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
- ASP.NET 之 CheckBoxList在实际项目中的应用——高级查询、数据库读出默认选中
- Lucene学习总结-高级查询
- HQL查询——查询返回对象类型分析
- Lucene学习总结之九:Lucene的查询对象(3)
- SQL Server高级查询错题分析
- 深入分析JavaWeb 36 -- 过滤器Filter高级应用
- 线程高级应用-心得3-线程范围内的共享变量以及应用场景及面试题案例分析
- smarty3.0高级应用---数据对象和注册对象