执行搜索
搜索的流程
1, 创建搜索器
创建的方法如下:
IndexSearcher searcher=new IndexSearcher(索引存放的路径);
使用searcher.search();
2, 封装用户输入的搜索条件
如果用户搜索条件是,在标题中搜索Hello World,那么就可以用Term term=new Term(“title”,”Hello World”);来封装用户的搜索请求
Term创建方式:
Term term=new Term(“字段名称”,”关键词”);
创建完Term完成搜索请求的封装后,需要将Term转换为可搜索的请求Query。最简单的Query q=new TermQuery(term);
3, 执行搜索
Query封装完后即可执行搜索。返回结果放在Hits中。
Hits hs=searcher.search(q);
4, 处理搜索结果
搜索结果由一组Document组成。Document又由一组Field组成。因此,获得搜索结果地思路是,从Hits中获得Document,从Document中获得Field.提取搜索结果常用的方法有:
所属对象 | 方法名 | 方法描述 |
Hits | Document doc(int n) | 返回指定序号的Document |
Int id(int n) | 返回指定序号的Document的ID属性 | |
Int length() | 返回Hits对象的长度,即Document得数量 | |
Float score(int n) | 返回指定序号的Document的score属性,文档得分 | |
Document | FieldgetField(Stringname) | 根据Field的名称,返回Filed对象 |
List getFields() | 返回该Document中所有的Field | |
Enumeration fields() | 返回该Document中所有的Field | |
String get(String name) | 根据field名称,返回field的值 | |
Field | Byte[] binaryValue() | 返回指定的Field的二进制值 |
Reader readerValue() | 返回指定的Field的内容,以Reader的形式返回 | |
String stringValue() | 返回指定对象的字符串值 |
5, 关闭搜索器
Searcher.close();
搜索的简单示例
搜索的HelloWorld
//BasicSearcher.java package example.example;
import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.Term; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery;
public class SimpleSearcher { public static void main(String[] args) throws java.io.IOException { //索引存放的路径 String indexPath = "./myindex"; //搜索的域 String searchField = "content"; //搜索的语句 String searchPhrase = "lucene"; // StringBuffer sb = new StringBuffer("");
//创建搜索器 IndexSearcher searcher = new IndexSearcher(indexPath);
//封装查询条件 Term t = new Term(searchField, searchPhrase); Query q = new TermQuery(t);
//执行搜索 Hits hs = searcher.search(q);
//处理搜索结果 int num = hs.length();
for(int i=0;i<num;i++) {
//获得Document Document doc = hs.doc(i);
//获得Filed Field fname = doc.getField("title"); sb.append("title:" + "/n"); //取对应域的值 sb.append(fname.stringValue() + "/n");
//获得Field Field fcontent = doc.getField("content"); sb.append("content:" + "/n"); sb.append(fcontent.stringValue()+ "/n");
sb.append("------------------- " + "/n"); } //关闭搜索器 searcher.close();
System.out.print(sb); } } |