3.执行搜索

来源:互联网 发布:seo页面优化 编辑:程序博客网 时间:2024/05/22 23:23

使用Lucene执行搜索,首先要创建IndexSearcher对象,然后通过TermQuery对象来封装用户输入的搜索条件,最后将结果封装在Hits对象中,返回给用户。

1.        创建搜索器对象 IndexSearhcer

IndexSearcher searcher = new IndexSearcher(索引存放的路径);

对象的search()方法返回一个结果集对象

Hits h = searcher.search();

关闭IndexSearhcer对象

search.close();

2.        封装搜索条件:TermQuery对象

创建Term对象封装搜索条件

Term t = new Term(“字段名称”,“关键词”);

创建Query对象来把Term对象转化成可执行的查询条件,Query对象有很多种,最常用的一种

Query q =  new TermQuery( t );

3.        执行搜索

把请求传递给IndexSearhcer对象,执行搜索

Hits hs = searcher.search(q);

4.        提取搜索结果,Hits对象

先从Hits对象中,获取Document,再从Document中获取Field

Hits对象的常用方法:

l        Documentdoc(int n)

返回指定序号的Document

l        intid(int n);

返回指定序号的Documentid属性

l        intlength();

返回Hits对象的长度,也就是Hits对象中包含的Document的数量

l        floatscore(int n);

返回指定序号的Documentscore属性,即文档得分

 

5.        提取搜索结果:Document对象

Document对象的常用方法:

l        FieldgetField(String name);

获取指定Field名称的Field对象

l        ListgetFields()

无参数,返回值是List类型,包含该Document的所有Field

l        Enumerationfields()

无参数,返回值是Enumeration类型,包含该Document的所有Field

l        Stringget(String name)

参数是Field名称,返回该Field对象的字符串值

 

6.        提取搜索结果:Field对象

l        byte[]binaryValue()

获取指定Field对象的二进制值

l        ReaderreaderValue()

获取指定Field对象的内容,以Reader形式返回

l        StringstringValue()

获取指定Field对象的字符串值,最为常用

 

实例:

importorg.apache.lucene.analysis.standard.StandardAnalyzer;

importorg.apache.lucene.index.*;

importorg.apache.lucene.search.*;

importorg.apache.lucene.document.*;

 

publicclass BasicSearcher2{

       public static void main(String args[])throws java.io.IOException{

              String indexPath ="index"; //索引存放位置

              String searchField ="content"; //搜索字段

              String searchPhrase = ""; //关键字

              StringBuffer sb = newStringBuffer(); //保留提取的字符串

             

              //创建IndexSearhcer对象

              IndexSearcher searcher = newIndexSearcher(indexPath);

             

              //封装搜索条件

              Term t = new Term(searchField,searchPhrase);

              Query q = new TermQuery(t);

             

              //反馈搜索结果

              Hits hs = searcher.search(q);

             

              //Hits对象中提取搜索结果

              int num = hs.length(); //Document对象个数

             

              for(int i=0; i<num; i++){

                     //获取Document

                     Document doc = hs.doc(i);

                    

                     //field name

                     Field fname =doc.getField("name");

                     sb.append("name:"+"/n");

                     sb.append(fname.stringValue()+"/n");

                    

                     //field content

                     Field fcontent =doc.getField("content");

                     sb.append("content"+"/n");

                     sb.append(fcontent.stringValue().substring(0,50)+"/n");//提取前50作为摘要

                     sb.append("-------------------" + "/n");

              }

              searcher.close();

              System.out.print(sb);

       }

}

 

结果:

 

中文分词问题:

上述程序的搜索关键词是“禹”,有3条结果。

如果把关键词改为“大禹”的话,虽然文本中有“大禹”这个词,但Lucene无法检索到结果,这是因为Lucene默认情况下(即使用StandardAnalyzer的时候)对中文进行单字分词,即为每个字建立索引,因此在索引中没有和“大禹”相对应的。