3.执行搜索
来源:互联网 发布:seo页面优化 编辑:程序博客网 时间:2024/05/22 23:23
使用Lucene执行搜索,首先要创建IndexSearcher对象,然后通过Term和Query对象来封装用户输入的搜索条件,最后将结果封装在Hits对象中,返回给用户。
1. 创建搜索器对象 IndexSearhcer
IndexSearcher searcher = new IndexSearcher(索引存放的路径);
对象的search()方法返回一个结果集对象
Hits h = searcher.search();
关闭IndexSearhcer对象
search.close();
2. 封装搜索条件:Term和Query对象
创建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);
返回指定序号的Document的id属性
l intlength();
返回Hits对象的长度,也就是Hits对象中包含的Document的数量
l floatscore(int n);
返回指定序号的Document的score属性,即文档得分
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的时候)对中文进行单字分词,即为每个字建立索引,因此在索引中没有和“大禹”相对应的。
- 3.执行搜索
- Lucene之执行搜索
- elasticsearcg 执行搜索
- Lucene入门之执行搜索
- lucene学习之执行搜索
- MySQL执行多表搜索
- java调用浏览器执行搜索
- 点搜索按钮div后 自动执行搜索
- 搜索框,当点击回车键时,执行搜索操作
- linux反向搜索执行过的命令
- 在liux环境执行搜索的命令
- RobotFramework: 设置Case执行的搜索路径
- linux命令行历史记录搜索,然后再执行
- 关于搜索Enter执行查询的方法
- Elasticsearch之分布式搜索的执行方式
- 使用 XPath 通过 MSXML 执行不区分大小写的搜索
- preg_replace -- 执行正则表达式的搜索和替换
- Web服务搜索与执行引擎---WSDL与SOAP
- 2.创建索引
- Android Getting Started
- 提问的智慧
- 南方出现新一轮低温冰冻天气可能影响春运
- python3学习笔记(一)
- 3.执行搜索
- 4.中文分词
- ERP的二次开发
- 表内触发
- 5.常用的数据解析组件
- [转]matlab文件操作及读txt文件
- winForm中窗体的显示及窗体间的简单传值
- vim插件ZenCoding一些常用的操作
- 6.索引的建立和优化