Lucene的搜索功能

Lucene的搜索功能主要包括:

对特定项搜索、查询表达式:QueryParser、分页实现、其他查询方式如下
    指定项范围查询 TermRangeQuery ;
    指定数字范围查询 NumericRangeQuery ;
    指定字符串开头搜索 PrefixQuery ;
    组合查询 BooleanQuery
中文分词&高亮显示:中文分词 smartcn、检索结果高亮显示实现

Lucene 的检索接口主要由QueryParser、IndexSearcher、Hits这3 个类构成,QueryParser 是查询解析器,负责解析用户提交的查询关键字,在新建一个解析器时需要指定要解析的域和使用什么语言分析器,这里使用的语言分析器必须与索引库建立时使用的解析器相同,否则查询结果不正确。IndexSearcher是索引搜索器,在实例化IndexSearcher时需要指定索引库所在的目录,IndexSearcher有一个search 方法执行索引的检索,这个方法接受Query 作为参数,返回Hits,Hists 是一系列排好序的查询结果的集合,集合的元素是Document。通过Document的get 方法可以得到与这个文档对应文件的信息,比如:文件名、文件路径、文件内容等。

5.1 基本查询

如图查询主要有两种方式,但是推荐使用第一种构造QueryParser表达式,它可以有灵活的组合方式,包括布尔逻辑表达、模糊匹配等,但是第二种Term只能针对词汇查询。

1.构造QueryParser查询式:

    QueryParser parser=new QueryParser("fullPath", analyzer);

       Query query=parser.parse(q);

2.对特定项的查询:

    Term t = new Term("fileName", q);

       Query query = new TermQuery(t);

查询结果如图5-1所示:以查询文件名fileName包含“大”为例。

图5-1:“大”查询结果

5.2 模糊查询

在构造QueryParser时,通过对词项q的修改可以实现精确匹配和模糊匹配。模糊匹配通过在“q”之后加“~”进行修改。如图5-2所示:

图5-2:模糊匹配

5.3 限定条件查询

布尔逻辑查询和模糊查询只需要对查询词q进行更改,而限定条件查询需要对query表达式进行设定,主要分为以下几类:

分别为指定项范围搜索、指定数字范围、指定字符串开头和多条件查询,分别列出应用的查询,true参数指的:是否包含上限和下限在内。

指定项范围:

TermRangeQuery query=new TermRangeQuery("desc", new BytesRef("b".getBytes()), new BytesRef("c".getBytes()), true, true);

指定数字范围:

NumericRangeQuery<Integer> query=NumericRangeQuery.newIntRange("id", 1, 2, true, true);

指定字符串开头:

PrefixQuery query=new PrefixQuery(new Term("city","a"));

多条件查询:

NumericRangeQuery<Integer>query1=NumericRangeQuery.newIntRange("id", 1, 2, true, true);

PrefixQuery query2=new PrefixQuery(new Term("city","a"));

BooleanQuery.Builder booleanQuery=new BooleanQuery.Builder();

booleanQuery.add(query1,BooleanClause.Occur.MUST);

booleanQuery.add(query2,BooleanClause.Occur.MUST);

5.4 高亮查询

在百度、谷歌等搜索引擎中,进行查询时,返回的网页包含查询关键字的时候会显示为红色,且进行摘要显示,即对包含关键字的部分内容进行截取并返回。高亮查询即为实现对关键字的样式更改,本实验在myeclipse中进行,返回结果并不会有样式的改变,只会对返回内容的关键字添加html标签,如果显示到网页即产生样式的变化。

高亮的设置代码如图5-3所示,结果如图5-4所示,会对南京匹配词添加<b>和<font>标签,显示到网页上为加粗和变红。

QueryScorer scorer=new QueryScorer(query);
        Fragmenter fragmenter=new SimpleSpanFragmenter(scorer);
        SimpleHTMLFormatter simpleHTMLFormatter=new SimpleHTMLFormatter("<b><font color='red'>","</font></b>");
        Highlighter highlighter=new Highlighter(simpleHTMLFormatter, scorer);
        highlighter.setTextFragmenter(fragmenter);

图5-3:高亮设置

图5-4:高亮显示结果

猜你喜欢

转载自blog.csdn.net/liberty12345678/article/details/82465299