lucene搜索方式(query类型)

Lucene有多种搜索方式,可以根据需要选择不同的方式。

1、词条搜索(单个关键字查找)

     主要对象是TermQuery

     调用方式如下: 

Term term=new Term(字段名,搜索关键字);
Query query=new TermQuery(term);
Hits hits=searcher.search(query); 

2、组合搜索(允许多个关键字组合搜索)

     主要对象是BooleanQuery

     调用方式如下: 

Term term1=new Term(字段名,搜索关键字);
TermQuery query1=new TermQuery(term1);

Term term2=new Term(字段名,搜索关键字);
TermQuery query2=new TermQuery(term2);

BooleanQuery booleanquery=new BooleanQuery();
booleanquery.add(query1,参数)
booleanquery.add(query2,参数)

Hits hits=searcher.search(booleanquery);
此方法中的核心在BooleanQuery的add方法上,其第二个参数有三个可选值,对应着逻辑上的与或非关系

参数如下:

BooleanClause.Occur.MUST                必须包含,类似于逻辑运算的与

BooleanClause.Occur.MUST _NOT       必须不包含,类似于逻辑运算的非

BooleanClause.Occur.SHOULD           可以包含,类似于逻辑运算的或

这三者组合,妙用无穷。 

3、范围搜索(允许搜索指定范围内的关键字结果)

     主要对象是RangeQuery

     调用方式如下: 

Term term1=new Term(字段名,起始值);

Term term2=new Term(字段名,终止值);

RangeQuery rangequery=new RangeQuery(term1,term2,参数);

Hits hits=searcher.search(rangequery);
此方法中的参数是Boolean类型的,表示是否包含边界 。

true 包含边界

false不包含边界 

4、前缀搜索(搜索起始位置符合要求的结果)

     主要对象是PrefixQuery

     调用方式如下: 

Term term=new Term(字段名,搜索关键字);
PrefixQuery prefixquery=new PrefixQuery (term);
Hits hits=searcher.search(prefixquery);

5、短语搜索(根据零碎的短语组合成新的词组进行搜索)

     主要对象是PhraseQuery

     调用方式如下:

Term term1=new Term(字段名,搜索关键字);
Term term2=new Term(字段名,搜索关键字);

PhraseQuery phrasequery=new PhraseQuery();
phrasequery.setSlop(参数);
phrasequery.add(term1);
phrasequery.add(term2);
Hits hits=searcher.search(phrasequery);
其中setSlop的参数是设置两个关键字之间允许间隔的最大值。

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});

Hits hits=searcher.search(multiphrasequery); 

7、模糊搜索(顾名思义)

     主要对象是:FuzzyQuery

     调用方式如下: 

Term term=new Term(字段名,搜索关键字);
FuzzyQuery fuzzyquery=new FuzzyQuery (term,参数);
Hits hits=searcher.search(fuzzyquery);
此中的参数是表示模糊度,是小于1的浮点小数,比如0.5f

8、通配符搜索(顾名思义)

     主要对象是:WildcardQuery

     调用方式如下: 

Term term=new Term(字段名,搜索关键字+通配符);
WildcardQuery wildcardquery=new WildcardQuery (term);
Hits hits=searcher.search(wildcardquery); 

其中的通配符分两种,即*和?

* 表示任意多的自负

?表示任意一个字符 

9、正则表达式搜索(顾名思义)

     主要对象是:RegexQuery

     调用方式如下:www.2cto.com 

Lucene 搜索种类很多。这里就介绍几个最常用的。其中TermQuery\BooleanQuery\RegexQuery功能最强大,最为常用。


 首先,强调一下PhraseQuery对象,这个对象不属于跨度查询类,但能完成跨度查询功能。

      匹配到的文档所包含的项通常是彼此相邻的,考虑到原文档中在查询项之间可能有一些中间项,或为了能查询倒排的项,PhraseQuery设置了slop因子,但是这个slop因子指2个项允许最大间隔距离,不是传统意义上的距离,是按顺序组成给定的短语,所需要移动位置的次数这表示PhraseQuery是必须按照项在文档中出现的顺序计算跨度的,如quick brown fox为文档,则quick fox2个项的slop为1,quick向后移动一次.而fox quick需要quick向后移动3次,所以slop为3

      其次,来看一下SpanQuery的子类SpanTermQuery。

      它能跨度查询,并且不一定非要按项在文档中出现的顺序,可以用一个独立的标记表示查询对象必须按顺序,或允许按倒过来的顺序完成匹配。匹配的跨度也不是指移动位置的次数,是指从第一个跨度的起始位置到最后一个跨度的结束位置。

      在SpanNearQuery中将SpanTermQuery对象作为SpanQuery对象使用的效果,与使用PharseQuery的效果非常相似。在SpanNearQuery的构造函数中的第三个参数为inOrder标志,设置这个标志,表示按项在文档中出现的顺序倒过来的顺序。

      如:the quick brown fox jumps over the lazy dog这个文档

      public void testSpanNearQuery() throws Exception{

           SpanQuery[] quick_brown_dog=new SpanQuery[]{quick,brown,dog};

           SpanNearQuery snq=new SpanNearQuery(quick_brown_dog,0,true);//按正常顺序,跨度为0,对三个项进行查询

           assertNoMatches(snq);//无法匹配

           SpanNearQuery snq=new SpanNearQuery(quick_brown_dog,4,true);//按正常顺序,跨度为4,对三个项进行查询

           assertNoMatches(snq);//无法匹配

           SpanNearQuery snq=new SpanNearQuery(quick_brown_dog,4,true);//按正常顺序,跨度为5,对三个项进行查询

           assertOnlyBrownFox(snq);//匹配成功    

           SpanNearQuery snq=new SpanNearQuery(new SpanQuery[]{lazy,fox},3,false);//按相反顺序,跨度为3,对三个项进行查询

           assertOnlyBrownFox(snq);//匹配成功   

           //下面使用PhraseQuery进行查询,因为是按顺序,所以lazy和fox必须要跨度为5

           PhraseQuery pq=new PhraseQuery();

           pq.add(new Term("f","lazy"));

           pq.add(new Term("f","lazy"));

           pq.setslop(4);

           assertNoMatches(pq);//跨度4无法匹配

           //PharseQuery,slop因子为5

           pq.setSlop(5);

           assertOnlyBrownFox(pq);          

      }


3.PhrasePrefixQuery 主要用来进行同义词查询的:
    IndexWriter writer = new IndexWriter(directory, new WhitespaceAnalyzer(), true);
    Document doc1 = new Document();
    doc1.add(Field.Text("field", "the quick brown fox jumped over the lazy dog"));
    writer.addDocument(doc1);
    Document doc2 = new Document();
    doc2.add(Field.Text("field","the fast fox hopped over the hound"));
    writer.addDocument(doc2);

    PhrasePrefixQuery query = new PhrasePrefixQuery();
    query.add(new Term[] {new Term("field", "quick"), new Term("field", "fast")});
    query.add(new Term("field", "fox"));

    Hits hits = searcher.search(query);
    assertEquals("fast fox match", 1, hits.length());
    query.setSlop(1);
    hits = searcher.search(query);
    assertEquals("both match", 2, hits.length());

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值