1、检索实体类
package com.dxcollector.entity;
public class DxNovel implements java.io.Serializable {
private Long id;
private String pid;
private String NTitle;
private String NAuthor;
private String NDesc;
private String NType;
private String NTotalWords;
private String NImgUrl;
private String NSourceUrl;
//省略getter and setter
}
2、索引的建立
package com.dxcollector.search;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;
import com.dxcollector.entity.DxNovel;
import com.dxcollector.novels.readnovel.NovelMgr;
/**
* 索引管理
*
* @author 忧里修斯
*/
public class IndexMgr {
NovelMgr novelMgr = new NovelMgr();
/**
* 创建新的索引
*
* @param index_store_path 索引存放路径
*/
public void createIndex(String index_store_path){
IndexWriter indexWriter = null;
try {
Directory directory = FSDirectory.open(new File(index_store_path));
indexWriter = new IndexWriter(directory,new StandardAnalyzer(Version.LUCENE_29),IndexWriter.MaxFieldLength.UNLIMITED);
List<DxNovel> novelList = novelMgr.getAllNovel();
System.out.println("大小:"+novelList.size());
Document doc = null;
for (DxNovel dxNovel : novelList) {
doc = new Document();
Field titleField = new Field("NTitle",dxNovel.getNTitle(),Field.Store.YES,Field.Index.ANALYZED);
Field authorField = new Field("NAuthor",dxNovel.getNAuthor(),Field.Store.YES,Field.Index.NOT_ANALYZED);
Field descField = new Field("NDesc",dxNovel.getNDesc(),Field.Store.YES,Field.Index.ANALYZED);
Field typeField = new Field("NType",dxNovel.getNType(),Field.Store.YES,Field.Index.ANALYZED);
doc.add(titleField);
doc.add(authorField);
doc.add(descField);
doc.add(typeField);
indexWriter.addDocument(doc);
}
indexWriter.optimize();
indexWriter.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("索引建立完成");
}
public static void main(String[] args) {
IndexMgr im = new IndexMgr();
im.createIndex("C:/index/");
}
}
3、搜索
package com.dxcollector.search;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import com.dxcollector.entity.DxNovel;
/**
* 搜索管理器
*
* @author 忧里修斯
*
*/
public class SearchMgr {
//索引文件存放的位置
private String index_store_path = "C:/index/";
public SearchMgr(String index_store_path){
this.index_store_path = index_store_path;
}
/**
* 搜索小说
*
* @param searchType 搜索类型,对应小说标题NTitle等
* @param keyword 关键字
* @return List<DxNovel>
*/
public List<DxNovel> search(String searchType,String keyword){
List<DxNovel> novelList = null;
try {
novelList = new ArrayList<DxNovel>();
Directory directory = FSDirectory.open(new File(index_store_path));
IndexSearcher indexSearcher = new IndexSearcher(directory,true);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
//建立搜索单元
Query query = null;
QueryParser queryParser = new QueryParser(Version.LUCENE_29,searchType,analyzer);
query = queryParser.parse(keyword);
//多域搜索
if(searchType.equals("")){
queryParser.setDefaultOperator(QueryParser.OR_OPERATOR);
String[] fields = {"NTitle", "NAuthor", "NDesc","NType"};
BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD,
BooleanClause.Occur.SHOULD,
BooleanClause.Occur.SHOULD,
BooleanClause.Occur.SHOULD};
try {
query = MultiFieldQueryParser.parse(Version.LUCENE_29,keyword, fields, flags, analyzer);
} catch (ParseException e) {
e.printStackTrace();
}
}
//检索
TopDocs topDocs = indexSearcher.search(query,100);
ScoreDoc[] hits = topDocs.scoreDocs;
System.out.println("结果集大小:"+hits.length);
for (int i = 0; i < hits.length; i++) {
int docId = hits[i].doc;
Document doc = indexSearcher.doc(docId);
DxNovel novel = new DxNovel();
novel.setNTitle(doc.get("NTitle"));
novel.setNAuthor(doc.get("NAuthor"));
novel.setNDesc(doc.get("NDesc"));
novel.setNType(doc.get("NType"));
novelList.add(novel);
}
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
return novelList;
}
public static void main(String[] args) {
SearchMgr searcher = new SearchMgr("C:/index/");
List<DxNovel> novelList = new ArrayList<DxNovel>();
novelList = searcher.search("NTitle", "my");
for (DxNovel dxNovel : novelList) {
System.out.println("标题:"+dxNovel.getNTitle());
System.out.println("作者:"+dxNovel.getNAuthor());
System.out.println("类型:"+dxNovel.getNType());
System.out.println("简介:"+dxNovel.getNDesc());
}
}
}
说明:
1、使用的luncene的版本为lucene-2.9.2
2、需注意的是搜索英文时,单词是以空格分开的。如youger dream,若搜索"ea"是搜索不到的,只有搜索"youger"或"dream"才能搜索得到。
分享到:
相关推荐
1、易于使用:资源附带的示例代码Demo和示例DML数据,有详细的函数说明和注释,以及请求demo示例,方便用户快速上手。 2、自定义分隔符:支持用户自定义分隔符,如英文逗号、分号等,满足各种复杂的字段拆分需求。 3...
若依前后端分离版本集成数据大屏、地图示例(热力图、区域图、检索等) 动态切换多数据源,数据库形式保存配置 地图示例(热力图、区域检索、区划、线路规划、点聚合图等) 大屏数据展示 SQL在线编辑器,目前只支持...
sql数据库及三层结构数据查询示例 WcfService
本文实例讲述了PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据。分享给大家供大家参考,具体如下: 主要功能是从postgreSql查询数据,并检索,由于自己刚开始接触,所以难点在于多条数据同时筛选并...
jsonDB的构建源自于HTML5本地存储的一个应用需求,可以通过sql对json数据进行增删改查,同时该类库提供强大的where检索条件,数据排序, limit查询条件限制等数据库基本功能。通过jsonDB可以轻松维护一个库/表或多个...
结构化查询语言(SQL)是用于存储,操作和检索许多数据库中的数据的语言。 它是许多关系数据库管理系统的标准语言,这些关系数据库管理系统是世界各地的组织使用的一种数据库。 这些类型的关系数据库管理系统用于将...
- 用法:用于从数据库中检索数据。 - 示例: SELECT * FROM 表名;(检索表中的所有数据) SELECT 列 1, 列 2 FROM 表名 WHERE 条件;(根 据条件检索指定列的数据) 2. INSERT 语句: - 用法:用于向数据库中...
- 用法:用于从数据库中检索数据。 - 示例: SELECT * FROM 表名;(检索表中的所有数据) SELECT 列 1, 列 2 FROM 表名 WHERE 条件;(根 据条件检索指定列的数据) 2. INSERT 语句: - 用法:用于向数据库中...
该数据库原生支持多种数据结构,提供了丰富的数据存储和检索能力。 技术构成: - 主要编程语言:Go - 文件构成:共85个文件,包括: - Go源代码文件:59个,涵盖了数据库的核心功能实现。 - Protocol Buffers定义...
《Oracle NoSQL数据库:实时大数据管理》讲述如何全面运用Oracle NoSQL数据库这个经济实惠的解决方案来存储、检索和更新海量的非结构化数据。本书在紧贴实用的示例的引导下,介绍Oracle NoSQL数据库的安装、配置、...
有关连接到数据库,从数据库检索数据,然后在控制台窗口中显示该数据的示例代码,请参见 示例代码 (ADO.NET)。ADO.NET 向编写托管代码的开发人员提供类似于 ActiveX 数据对象 (ADO) 向本机组件对象模型 (COM) 开发...
3、 按照给出的示例数据完成数据的录入。 4、 打开数据库 SQL Server 的查询编辑器,用 SQL 语句完成以下查询。并通过实验结果验证查询语句的正确性,将每个 SQL 语句及结果存盘,以备老师检查。 (1)求全体学生的...
5.4.1 OID OID 空间数据库的管理模式 混合管理基本思想 1 第一阶段: 两个子系统分别存储和检索空间数据与属性数据 属性数据存储在商用的RDBMS中 几何数据存储在文件系统中 两个子系统间用标识符联系起来(关键字) ...
重新组织数据挖掘和信息检索的内容,增加了对数据库系统PostgreSQL的实例研究。 《数据库系统概念》特点:综合全面。涵盖了数据模型、关系模型、基于对象的数据库和XML、数据存储和查询、事务管理、数据库系统体系...
数据库访问基础ADO.NET 1.1 ADO.NET概述 1.1.1 ADO.NET设计目标 1.1.2 ADO.NET结构 1.1.3 ADO.NET示例应用程序 1.2 .NET数据提供程序 1.2.1 使用ADO连接到数据源 1.2.2 Command命令 1.2.3 ...
aws-lambda-datafetcher-sample 使用 Amazon Lambda 和 SQS 获取数据的示例(概念证明)概念我想看看我是否可以开发一种从数据库中查询和获取数据的方法,而无需直接从客户端查询数据库。 我想尝试实现数据检索请求-...