您的位置:首页 > 其它

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
/**********************************/




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: