lucene3.6.0的查询条件分析
// TermQuery:词条查询。通过对某个词条的指定,实现检索索引中存在该词条的所有文档。
Query query = new TermQuery(New Term("content","java")),区分大小写
// TermRangeQuery:范围查询。这种范围可以是日期,时间,数字,大小等等。可以使用"context:[a to b]"(包含边界)或者"content:{a to b}"(不包含边界) 查询表达式
// PrefixQuery:前缀查询。 可以使用"content:lua*"表达式
// BooleanQuery:布尔查询。Lucene中包含逻辑关系:“与”,“或”,“非”的复杂查询,最终都会表示成BooleanQuery。布尔查询就是一个由多个子句和子句之间组成的布尔逻辑所组成的查询。 可以通过BooleanQuery.java类的public void add(Query query, BooleanClause.Occur occur) 方法来增加一个查询子句。子句最大数量默认为1024。
查询表达式可以通过“+”,“-”,“AND”,“OR”,“NOT”来组合。比如“+content:"abc" -title:"xyz"”
// PhraseQuery:短语查询。默认为完全匹配,但可以指定坡度(Slop,默认为0)改变范围。比如Slop=1,检索短语为“电台”,那么在“电台”中间有一个字的也可以被查找出来,比如“电视台”。 查询表达式可以为“电 台 ~1”
// MultiPhraseQuery:多短语查询。
// FuzzyQuery:类似项查询,模糊查询。模糊查询使用的匹配算法是levensh-itein算法。此算法在比较两个字符串时,将动作分为3种:加一个字母(Insert),删一个字母(Delete),改变一个字母(Substitute)。 编辑距离能够影响结果的得分,编辑距离越小得分越高.查询表达式为"fuzzy~",使用~来表示模糊查询.
// WildcardQuery:通配符查询。“*”号表示0到多个字符,“?”表示单个字符。 最好不要用通配符为首,否则会遍历所有索引项
// SpanQuery:跨度查询。此类为抽象类。
// SpanTermQuery:检索效果完全同TermQuery,但内部会记录一些位置信息,供SpanQuery的其它API使用,是其它属于SpanQuery的Query的基础。
// SpanFirstQuery:查找方式为从Field的内容起始位置开始,在一个固定的宽度内查找所指定的词条。
// SpanNearQuery:功能类似PharaseQuery。SpanNearQuery查找所匹配的不一定是短语,还有可能是另一个SpanQuery的查询结果作为整体考虑,进行嵌套查询。
// SpanOrQuery:把所有SpanQuery查询结果综合起来,作为检索结果。
// SpanNotQuery:从第一个SpanQuery查询结果中,去掉第二个SpanQuery查询结果,作为检索结果。
Query的toString()方法可以查看最终的查询表达式:
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT,"context", new StandardAnalyzer(Version.LUCENE_CURRENT););
Query query = parser.parse("旧水泥袋");
输出:
context:旧 context:水 context:泥 context:袋
不能只有NOT表达式,必须跟AND,OR等其他表达式一起使用.
//QueryParser parser = new QueryParser(version, "content", analyzer);//默认在content域中查找
QueryParser parser = new MyQueryParser(version, "content", analyzer);//默认在content域中查找, 重写了getRangeQuery方法, 可以进行数字范围查询
Query query = null;
//查找content(默认域)中存在软件的结果
query = parser.parse("软件");
//查找name域中有java的结果
query = parser.parse("name:java");
//使用通配符
query = parser.parse("name: j*");//默认*号不能出现在最前端, 会影响效率, 使用parser.setAllowLeadingWildcard(true)打开
query = parser.parse("lu*n?");//只能在单个分词中使用通配符, 即 使用 “lucene*action”就匹配不到
query = parser.parse("lucene test");//默认lucene和action是或关系
query = parser.parse("lucene OR test");//同上, OR必须大写
query = parser.parse("lucene AND test");//与关系
query = parser.parse("- lucene + test");//存在test但不存在lucene
//query = parser.parse("size:[100 TO 200]");//这个query是TermRangeQuery所以不能用于数字(日期)范围查询
query = parser.parse("name:[java TO java]");//查找有a-z字母的 {}不包含
//数字范围查询需要重写QueryParser的getRangeQuery方法
query = parser.parse("date:[1334550379955 TO 1334550379955]");
query = parser.parse("\"lucene action\"~1");//1即phraseQuery中的slop=1
query = parser.parse("name:xava~0.74");//加上~代表模糊查询, 要和上面的额短语查询相区别开来,另外~后面可以加一个浮点数去顶相似度
//查询大小在145到150, 名称与javv相似, 创建时间在1334550379955之前的 不要, lucene与action相距1
query = parser.parse("size:[145 TO 150] + name:javv~ - date:[1 TO 1334550379954] + \"lucene action\"~1");
对查询项进行加权:可以通过在查询项加上^factor对某个查询项进行加权,比如"title^2.0 junit" 对title的查询加权为2.0,而junit还是默认1.0