您的位置:首页 > 产品设计 > UI/UE

Lucene知识总结(Query篇)

2015-06-19 00:02 477 查看



继承Query类的一系列子类操作

1.TermQuery
用于词条搜索(单个关键字)
调用如下:
Term term = new Term("key","value");
Query query = new TermQuery(term);
2.BooleanQuery
组合搜索(允许多个关键字组合查询)
调用如下:
Term term1=new Term("key","value");
TermQuery query1=new TermQuery(term1);
Term term2=new Term(字段名,搜索关键字);
TermQuery query2=new TermQuery(term2);
BooleanQuery booleanquery=new BooleanQuery();
booleanquery.add(query1,参数)
booleanquery.add(query2,参数)
此方法中的核心在BooleanQuery的add方法上,其第二个参数有三个可选值,对应着逻辑上的与或非关系
参数如下:
BooleanClause.Occur.MUST        --必须包含,类似于逻辑运算的与
BooleanClause.Occur.MUST _NOT   --必须不包含,类似于逻辑运算的非
BooleanClause.Occur.SHOULD      --可以包含,类似于逻辑运算的或
3.WildcardQuery
通配符索引,这个查询可能会很慢,因为它会遍历很多Term,为了防止降低效率,在使用该类时:通配符不建议放在开始位置;不建议使用通配符*
调用如下
Term term=new Term(字段名,搜索关键字+通配符);
WildcardQuery wildcardquery=new WildcardQuery (term);
Hits hits=searcher.search(wildcardquery);
其中的通配符分两种,即*和?
* 表示任意多的字符
?表示任意一个字符
4.PhraseQuery
短语搜索(根据零碎的短语组合成新的词组进行搜索)
调用如下:
Term term1=new Term(字段名,搜索关键字);
Term term2=new Term(字段名,搜索关键字);
PhraseQuery phrasequery=new PhraseQuery();
phrasequery.setSlop(参数);
phrasequery.add(term1);
phrasequery.add(term2)
其中setSlop的参数是设置两个关键字之间允许间隔的最大值.
5.PrefixQuery
前缀搜索(搜索起始位置符合要求的结果)
调用如下:
Term term=new Term(字段名,搜索关键字);
PrefixQuery prefixquery=new PrefixQuery (term);
6.MultiPhraseQuery
多短语搜索(先指定一个前缀关键字,然后将其他的关键字加在此关键字之后,组成词语进行搜索)
Term term=new Term(字段名,前置关键字);
Term term1=new Term(字段名,搜索关键字);
Term term2=new Term(字段名,搜索关键字);
MultiPhraseQuery multiphrasequery=new MultiPhraseQuery();
multiphrasequery.add(term);
multiphrasequery.add(new Term[]{term1,term2});

7.FuzzyQuery
模糊搜索
Term term=new Term(字段名,搜索关键字);
FuzzyQuery fuzzyquery=new FuzzyQuery (term,参数);

此中的参数是表示模糊度,是小于1的浮点小数,比如0.5f

以上为最常用的Lucene搜索类

  
信息整理来源:http://www.2cto.com/kf/201207/140701.html

 8.RegexpQuery
正则匹配,
从某种方式上来说,正则查询(RegexpQuery)跟通配符查询(WildcardQuery)的功能很相似,因为他们都可以完成一样的工作,但是不同的是正则查询支持更灵活定制细化查询,这一点与通配符的泛化是不一样的,而且正则查询天生支持使用强大的正则表达式的来准确匹配一个或几个term,需要注意的是,使用正则查询的字段最好是不分词的,因为分词的字段可能会导致边界问题,从而使查询失败,得不到任何结果,这一点和WildcardQuery效果是一样的。 

    具体信息请链接:http://my.oschina.net/MrMichael/blog/220956
9.TermRangeQuery
范围查询
并不适用于数值?
10.NumericRangeQuery
范围查询
NumericRangeQuery只对IntField,LongField,FloatField,DoubleField等这些表示数字的Field域有
4000


Query q = NumericRangeQuery.newFloatRange("weight", 0.03f, 0.10f, true, true); 

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