- N +

【Lucene实战】(三) Lucene 多样化查询代码讲解

【Lucene实战】(三) Lucene 多样化查询代码讲解原标题:【Lucene实战】(三) Lucene 多样化查询代码讲解

导读:

本章主题介绍本章主要对Lucene内置的Query类型进行讲解:TermQuery,TermRangeQuery,NumericaRangeQuery,PrefixQuery,...

文章目录 [+]

本章主题介绍

本章主要对Lucene内置的Query类型进行讲解:TermQuery,TermRangeQuery,NumericaRangeQuery,PrefixQuery,BooleanQuery,PhraseQuery,WildcardQuery,FuzzyQuery。我们将讲解这些类构成的查询语句是如何与文档进行匹配的,及代码实例讲解。

索引数据结构如下:我们将以这个索引为例子进行讲解

class Book{
    
    //书籍名称
    private String  bookName;
    //书籍编码
    private String  bookNo;
    //书籍作者
    private String  writer;
    //书籍分类
    private String  category;
    //书籍标签
    private String  tag;
    //书籍发布时间
    private String  time;
    
     private   int      number;
    
    
    Book(String bookName,String bookNo,String writer,String category,String tag,String time,int number){
        
        this.bookName=bookName;
        this.bookNo=bookNo;
        this.category=category;
        this.tag=tag;
        this.time=time;
        this.writer=writer;
        this.number=number;
        
    }
}

通过项进行搜索:TermQuery

对索引中特定项进行搜索是最基本的搜索方式。Term是最小的索引片段,每个Term包含一个域名和一个文本值。

代码讲解:

        Term term=new Term("writer", "书生");
        
        Query query=new TermQuery(term);
        
        ScoreDoc[] scoreDoc=isearcher.search(query,null, 10).scoreDocs;
        
        System.out.println(scoreDoc.length)


在指定的范围内搜索:TermRangeQuery

索引中的各个term 对象会按照字典编排顺序(通过String.compareTo 方法)进行排序,并允许在Lucene的TermRangeQuery对象提供的范围内进行文本项的直接搜索。

TermRangeQuery的使用方法,其功能是搜索起始字母范围从d到j的书籍名称。

    
        TermRangeQuery query =new TermRangeQuery("category",new BytesRef("d"), new BytesRef("j"), true, true);
        
        ScoreDoc[] scoreDoc=isearcher.search(query,null, 10).scoreDocs;
        
        System.out.println(scoreDoc.length)

        初始化中的两个布尔类型是标识 是否包含搜索范围的起点和终点。

在指定的数字范围内搜索:NumericRangerQuery

如果使用NumericField对象来索引域,那么你就能有效地使用NumericRangeQuery类在某个特定范围内搜索该域。

        NumericRangeQuery query=NumericRangeQuery.newIntRange("number", 1, 20, true, true);
        
        ScoreDoc[] scoreDoc=isearcher.search(query,null, 10).scoreDocs;
        
        System.out.println(scoreDoc.length)

初始化中的两个布尔类型是标识 是否包含搜索范围的起点和终点。

通过字符串搜索:PrefixQuery

搜索以指定字符串开头的项的文档。

        Term term=new Term("category","ja");
        
        PrefixQuery query=new PrefixQuery(term);
        
        ScoreDoc[] scoreDoc=isearcher.search(query,null, 10).scoreDocs;
        
        System.out.println(scoreDoc.length)


组合查询:BooleanQuery

BooleanQuery本身是一个Boolean字句的容器。这个子句可以是   “与”“或”“非”的一个子句。

这里 Occur对象可以设置为 BooleanClause.Occur.MUST,BooleanClause.Occur.SHOULD,BooleanClause.Occur.MUST_NOT


下面我们将 上面的 通过字符串搜索 和 通过项进行搜索例子进行整合:

        Term term1=new Term("writer", "书生");
        
        Query query1=new TermQuery(term1);
        
        Term term2=new Term("category","ja");
        
        PrefixQuery query2=new PrefixQuery(term2);
        
        BooleanQuery query=new BooleanQuery();
        
        query.add(query1, BooleanClause.Occur.MUST);
        
        query.add(query2,  BooleanClause.Occur.MUST);
        
        ScoreDoc[] scoreDoc=isearcher.search(query,null, 10).scoreDocs;
        
        System.out.println(scoreDoc.length)

我们将两个查询合并成一个 ,条件是必须都满足。BooleanQuery对其中的子句是有数量限制的默认是1024个查询子句。

通配符查询:WildcardQuery

通配符查询可以让我们使用不完整的,缺少某些字母的项进行模糊查询。 Lucene 使用两个标准的通配符:*和?   

*代表0个或者多个字母   ?代表0个或者一个字母。

        Term term =new Term("category","j?v");
        
        Query query=new WildcardQuery(term);
        
        
        ScoreDoc[] scoreDoc=isearcher.search(query,null, 10).scoreDocs;
        
        System.out.println(scoreDoc.length);


搜索类似项:FuzzyQuery

FuzzyQuery用于匹配与指定项相似的项。Levenshtein距离算法用来决定索引文件中的项与指定的项的相似程度。这种算法叫做编辑距离算法,它是两个字符串之间相似度的一个度量方法,编辑距离就是计算从一个字符串转换成另一个字符串所需要的最少,插入,删除和替换的字母个数。例如three和tree 的编辑举例为1  只需要去掉three  的t就一致了。

        Term term=new Term("category","tag");
        
        Query query=new FuzzyQuery(term);
        
        ScoreDoc[] scoreDoc=isearcher.search(query,null, 10).scoreDocs;
        
        System.out.println(scoreDoc.length);


本文标题:【Lucene实战】(三) Lucene 多样化查询代码讲解
本文链接:https://www.kyjszj.com/htzq/103.html
作者授权:除特别说明外,本文由 开源技术之家 原创编译并授权 开源技术之家 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。

有好的文章希望我们帮助分享和推广,猛戳这里我要投稿

返回列表
上一篇:
下一篇:

发表评论中国互联网举报中心

快捷回复:

    评论列表 (暂无评论,共791人参与)参与讨论

    还没有评论,来说两句吧...