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"才能搜索得到。
分享到:
相关推荐
接着,创建一个SQL查询,如ADOTable或DataSet组件,用于检索数据库中的数据。这里可能会涉及到数据库的表选择、字段选择以及筛选条件等。 然后,开发者需要在TTreeView的OnData事件中处理数据加载。当用户展开一个...
数据库用于组织、检索和更新图书馆中的书籍、读者信息、借阅记录等各种数据。 数据库的核心在于其结构化数据的管理方式,它遵循特定的模式,如关系型数据库模型,这是最常见的类型。在关系型数据库中,数据被组织成...
本示例聚焦于“利用数据库中数据创建无限树”,这是一种常见的UI设计模式,尤其适用于组织层级结构的数据,如组织架构、文件系统或者分类目录。无限树视图允许用户通过展开和折叠节点来探索多级关系,提供了一种直观...
1. **数据库基本概念**:数据库是一个有组织的数据集合,它提供了数据的存储、检索、更新和删除等功能。通过结构化查询语言(SQL)与数据库进行交互,可以执行复杂的查询和操作。 2. **关系型数据库**:本示例很...
标题和描述中提到的知识点是关于Lucene全文检索数据库的应用示例,特别是在处理大量数据和多表查询时的性能优化。下面将详细阐述Lucene的基本概念、如何在Java环境中使用Lucene进行全文检索,以及结合MySQL数据库的...
罗斯文示例数据库是Microsoft Access中的一个重要组成部分,它是一个预设的、用于教学和学习目的的数据库实例。这个数据库在Access的多个版本中都存在,为用户提供了丰富的数据管理及应用开发的实践平台。罗斯文示例...
在Python web开发中,Flask是一个轻量级的Web服务程序框架,而MySQL是一种广泛使用的开源关系型数据库管理...通过以上步骤,开发者可以有效地在Flask应用中管理和操作MySQL数据库,实现web应用的数据存储和检索功能。
在本场景中,我们探讨如何使用Lucene来检索数据库,尤其是针对MS SQL Server 2000的全文索引。 1. **建立JDBC连接和数据读取** - 传统的数据库访问方式是通过JDBC(Java Database Connectivity)接口,编写SQL查询...
在索引过程中,首先需要有一系列的被索引文件,这些文件通常来自数据库数据。接着,这些文件经过语言处理和语法分析,被分解成一系列的词(Term)。然后,通过索引创建,构建词典和反向索引表,这个表将词与对应的...
1、易于使用:资源附带的示例代码Demo和示例DML数据,有详细的函数说明和注释,以及请求demo示例,方便用户快速上手。 2、自定义分隔符:支持用户自定义分隔符,如英文逗号、分号等,满足各种复杂的字段拆分需求。 3...
SQL(Structured Query Language)是一种用于管理和处理关系数据库的标准编程语言,它...最后,实践是提升SQL技能的关键,可以尝试解决实际问题,例如通过编写SQL脚本来处理数据集,或为简单的应用程序设计数据库结构。
本示例提供了一个简单的Java数据库编程教程,旨在帮助初学者理解如何使用Java与数据库进行交互。我们将深入探讨以下几个核心知识点: 1. JDBC(Java Database Connectivity):JDBC是Java标准API,用于连接和操作...
在本文中,我们将探讨如何使用PHP从PostgreSQL数据库中检索数据,并实现分页显示以及根据特定条件进行查找。PostgreSQL是一种强大的开源关系型数据库系统,而PHP作为服务器端脚本语言,常用于与数据库交互,构建动态...
本示例主要介绍如何在Wiley InterScience平台上的Cochrane Library进行EBM数据检索。 Cochrane Library是EBM研究中的核心资源,它包含多个子数据库,如Cochrane Database of Systematic Reviews (CDSR),Database ...
而数据库则用于长期存储和管理大量数据,提供高效检索和数据安全性。以下将详细介绍如何将Excel文件导入到数据库中,以及如何将数据库中的数据导出到Excel中。 首先,将Excel文件导入数据库通常涉及到以下几个步骤...
在IT领域,数据库搜索是应用程序开发中的一个关键环节,特别是在数据密集型的系统中。...通过学习和实践这样的示例,开发者可以掌握在C++环境中进行数据库操作的基本技巧,从而更好地构建数据驱动的应用程序。
在这个数据库中,你可以学习到如何使用T-SQL语言进行复杂的数据检索、更新和删除操作,以及如何利用索引优化查询性能。 2. **Northwind**: Northwind是SQL Server早期版本中的经典示例数据库,模拟了一个全球分销...
本实例将探讨如何从数据库中读取数据并进行处理,这是一个常见的任务,涉及到多个技术层面,包括SQL查询语言、数据库连接、数据处理以及可能的数据分析。 首先,我们需要理解数据库的基本概念。数据库是一个组织...