lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3
来源:互联网 发布:淘宝靠谱日代推荐 编辑:程序博客网 时间:2024/04/30 22:47
前言:
前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作)、如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这里我们已经知道如何建立索引,那么本章将会详解如何搜索索引目录中的索引文档索以及如何创建索引搜索器和六种文档搜索器(搜索器)的实现。
luncene5.5.3集合jar包下载地址:http://download.csdn.net/detail/eguid_1/9677589
一、创建索引搜索器
索引搜索器由索引目录创建,依赖搜索器进行全文搜索,部分搜索器依赖分词器进行分词查询
1、创建索引目录搜索器(即索引搜索器)
根据索引目录创建索引搜索(如果有多个索引目录,那么需要创建多个索引搜索,分别搜索出结果后再对搜索结果进行合并调整)
/** * 创建索引搜索 * * @param indexReader -索引目录Reader * @return */public IndexSearcher createSearch(IndexReader indexReader) {IndexSearcher indexSearch = null;if (indexReader != null) {indexSearch = new IndexSearcher(indexReader);}return indexSearch;}/** * 创建索引搜索 * @param dir -索引目录 * @return */public IndexSearcher createSearch(Directory dir) {IndexSearcher indexSearch = null;try {IndexReader indexReader = DirectoryReader.open(dir);indexSearch = new IndexSearcher(indexReader);} catch (IOException e) {}return indexSearch;}
2、搜索结果
/** * 搜索 * * @param search * -索引搜索器 * @param query * -查询器 * @param num * -搜索结果数量 * @return */public TopDocs search(IndexSearcher search, Query query, int num) {TopDocs topDocs = null;try {topDocs = search.search(query, num);} catch (IOException e) {}return topDocs;}/** * 自定义排序搜索 * * @param search * -索引搜索 * @param query * -查询器 * @param num * -搜索结果数量 * @param sort * -排序 * @return */public TopDocs search(IndexSearcher search, Query query, int num, Sort sort) {TopDocs topDocs = null;try {topDocs = search.search(query, num, sort);} catch (IOException e) {}return topDocs;}/** * 搜索 * * @param search * -索引搜索器 * @param query * -查询器 * @param results * -搜索结果 */public void search(IndexSearcher search, Query query, Collector results) {try {if (query != null && results != null)search.search(query, results);} catch (IOException e) {}}/** * 按照匹配分数搜索 * * @param search * @param query * @param after * -文档匹配分数 * @param numHits * -命中数量 * @return */public TopDocs search(IndexSearcher search, Query query, ScoreDoc after, int numHits) {TopDocs topDocs = null;try {if (query != null && after != null)topDocs = search.searchAfter(after, query, numHits);} catch (IOException e) {}return topDocs;}/** * 按照匹配分数搜索 * * @param search * @param query * @param after * -文档匹配分数 * @param numHits * -命中数量 * @param sort * 自定义排序 * @return 搜索结果 */public TopDocs search(IndexSearcher search, Query query, ScoreDoc after, int numHits, Sort sort) {TopDocs topDocs = null;try {if (query != null && after != null && sort != null)topDocs = search.searchAfter(after, query, numHits, sort);} catch (IOException e) {}return topDocs;}/* 以下API已过时不建议再使用 */public TopDocs search(IndexSearcher search, Query query, Filter filter, int results) {TopDocs topDocs = null;try {topDocs = search.search(query, filter, results);} catch (IOException e) {}return topDocs;}public TopDocs search(IndexSearcher search, Query query, Filter filter, int results, Sort sort) {TopDocs topDocs = null;try {topDocs = search.search(query, filter, results, sort);} catch (IOException e) {}return topDocs;}public TopDocs search(IndexSearcher search, Query query, Filter filter, int results, Sort sort, boolean doDocScores,boolean doMaxScore) {TopDocs topDocs = null;try {topDocs = search.search(query, filter, results, sort, doDocScores, doMaxScore);} catch (IOException e) {}return topDocs;}
二、六种搜索器实现
/** * 创建单词搜索器 * * @param fieldName * @param key * @return */public Query createTermQuery(String fieldName, String key) {return new TermQuery(new Term(fieldName, key));}/** * 创建前缀搜索器 * * @param fieldName * @param key * @return */public Query createPrefixQeury(String fieldName, String key) {return new PrefixQuery(new Term(fieldName, key));}/** * 创建范围搜索器 * * @param fieldName * @param start * @param end * @return */public Query createNumericRangeQuery(String fieldName, int start, int end) {return NumericRangeQuery.newIntRange(fieldName, start, end, true, true);}/** * 根据分词器创建条件搜索 * * @param operator * @param analyzer * @param fieldName * @param key * @return * @throws ParseException */public Query createPhraseQueryByOperator(Operator operator, Analyzer analyzer, String fieldName, String key)throws ParseException {QueryParser qp = new QueryParser(fieldName, analyzer);if (operator != null) {qp.setDefaultOperator(operator);}return qp.parse(key);}/** * 根据分词器创建模糊搜索 * * @param analyzer * @param fieldName * @param key * @return * @throws ParseException */public Query createPhraseQuery(Analyzer analyzer, String fieldName, String key) throws ParseException {return createPhraseQueryByOperator(null, analyzer, fieldName, key);}/** * 创建混合搜索器 * * @return */public BooleanQuery createBooleanQuery() {return new BooleanQuery();}/** * 添加搜索器到混合搜索器 * * @param booleanQuery * @param occ * @param query */public void addToBooleanQuery(BooleanQuery booleanQuery, Occur occ, Query query) {if (booleanQuery != null && query != null && occ != null) {booleanQuery.add(query, occ);}}
三、搜索结果解析
public String[] parseQuery(TopDocs topDocs,IndexSearcher search,String fieldName){ int hits = 0; if (topDocs != null && (hits = topDocs.totalHits) > 0) { ScoreDoc[] docs = topDocs.scoreDocs; String[] results = new String[hits]; for (ScoreDoc doc : docs) { try { //通过搜索结果找到对应文档Document resultDoc = search.doc(doc.doc);List<IndexableField> list=resultDoc.getFields();for(IndexableField i:list){System.out.println("名称:"+i.name()+",内容:"+i.stringValue()+",权重值:"+i.boost());}} catch (IOException e) {} } return results; } return null; }
四、测试搜索
Analyzer analyzer=createAnalyzer(false);Directory dir=createDirectory(null, "d:","dir","search");IndexWriterConfig conf=createIndexConf(analyzer, OpenMode.CREATE_OR_APPEND, false);IndexWriter index=createIndex(dir, conf);//创建一个文档Document doc=createDocument(); String[] states = new String[] {"欢迎来到eguid的博客", "欢迎大家来到eguid的技术博客", "欢迎大家来到eguid的技术博客,很开心能和大家一起分享开源技术"};//创建字段Field[] fields=createFields("字段名", states, TextField.TYPE_STORED, 1.1f);//批量增加字段到索引文档addFiledList(doc, fields);//把索引文档保存到索引器index.addDocument(doc);close(index, true);//读取目录IndexReader indexReader=DirectoryReader.open(dir);//创建索引搜索器IndexSearcher indexSearch=createSearch(indexReader);try {//创建文档搜索器Query query=createPhraseQuery(analyzer, "字段名", "eguid");//搜索结果TopDocs topDocs=search(indexSearch, query, 2);parseQuery(topDocs, indexSearch, "字段名");//得到TopDocs,这个TopDocs就是一个结果文档,里面包含了搜索的结果内容,匹配度等等搜索计算结果参数} catch (ParseException e) {}
搜索结果:
名称:字段名,内容:欢迎来到eguid的博客,权重值:1.0
名称:字段名,内容:欢迎大家来到eguid的技术博客,权重值:1.0
名称:字段名,内容:欢迎大家来到eguid的技术博客,很开心能和大家一起分享开源技术,权重值:1.0
到这里,lucene全文搜索的全部功能就全部实现了,而我们需要做的就是根据我们自己的业务对lucene的功能进行组合,从而实现我们的全文搜搜服务。
1 0
- lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3
- lucene全文搜索之二:创建索引器(创建IKAnalyzer分词器和索引目录管理)基于lucene5.5.3
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
- Lucene用标准分词器搜索索引
- Lucene全文搜索之分词器:使用IK Analyzer中文分词器(修改IK Analyzer源码使其支持lucene5.5.x)
- lucene全文搜索之一:lucene的主要功能和基本结构(基于lucene5.5.3)
- java之全文索引搜索lucene之增删改查文档与中文分词搜索
- Lucene5.0索引的创建与搜索
- 搜索引擎之全文搜索算法功能实现(基于Lucene)
- mongodb全文搜索解决方案(lucene+IKAnalyzer)
- lucene--创建索引,搜索
- Lucene-索引创建&搜索
- 全文检索Lucene入门之创建索引及简单搜索
- lucene5--增量索引(Zoie)(近实时搜索的实现)
- lucene的建立索引,搜索,中文分词
- lucene 建立多索引搜索器
- Lucene分词器(搜索关键字解析器)
- Lucene全文搜索工具分析
- 小程序公测后,你可以关注这些
- 生活的烦恼
- 安装Apache Kylin时遇到的问题
- Runtime.getRuntime().addShutdownHook关闭钩子介绍
- 如何获取Android系统时间是24小时制还是12小时制
- lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3
- 笔记01——GPU渲染流程
- 如何打开VMware的vmdk虚拟磁盘文件
- OSGI中,以Web Service的方式提供文件上传的接口
- cloudera manager 设置开机自启
- 块元素的作用
- javaScript面向对象编程
- Sublime Text3
- springMVC框架--json数据的交互(四)