package com.dream.search;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.*;
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.index.Term;
import org.apache.lucene.index.TermDocs;
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.BooleanQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocCollector;
/*
* @author zhaozhi3758
* 为数据库建立索引并查询
*/
public class SearchDb {
private ArrayList dbList = new ArrayList();
private String INDEX_DIR = "f:/index";
/**
* 获取数据库数据
*
* @return
*/
@SuppressWarnings("finally")
public void getResults() {
ResultSet rs = null;
Statement stmt = null;
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");// 加载驱动
// new oracle.jdbc.driver.OracleDriver();
String url = "jdbc:mysql://localhost/libraryv1";
conn = DriverManager.getConnection(url, "root", "123");// 建立连接
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from reader");// 发送执行,获得结果集
while (rs.next()) {// 遍历结果
HashMap map = new HashMap();
map.put("name", rs.getString(2));
map.put("vocation", rs.getString(5));
map.put("date", rs.getString(6));
this.dbList.add(map);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {// 关闭连接释放资源
rs.close();
rs = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 创建索引
*/
public void indexDocs() {
if (this.dbList.size() <= 0)
return;
try {
IndexWriter writer = new IndexWriter(this.INDEX_DIR,
new StandardAnalyzer(), true);
createIndex(writer);
System.out.println("正在优化...");
writer.optimize();
writer.close();
} catch (IOException e) {
System.out.println(" caught a " + e.getClass()
+ "\n with message: " + e.getMessage());
}
}
public void createIndex(IndexWriter writer) {
HashMap map = new HashMap();
for (Iterator it = this.dbList.iterator(); it.hasNext();) {
map = (HashMap)it.next();
Document doc = new Document();//必须放在循环中
//System.out.println("-->" + map.get("date").toString());
doc.add(new Field("name", map.get("name").toString(),Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("vocation", map.get("vocation").toString(),Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("date", map.get("date").toString(),Field.Store.YES, Field.Index.TOKENIZED));
try {
writer.addDocument(doc);//添加到索引器writer
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 结果遍历
* @param hits
* @param key
* @throws Exception
*/
public static void printResult(Hits hits, String key,int num) throws Exception {
System.out.println("查找 \"" + key + "\" :");
if (hits != null) {
if (hits.length() == 0) {
System.out.println("没有找到任何结果");
} else {
System.out.println("找到" + hits.length() + "个结果");
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.println("姓名"+num+":" + doc.get("name"));
System.out.println("职业"+num+":"+ doc.get("vocation"));
}
}
}
}
/**
* 遍历索引[方式一:按词条搜索]
* 注意:字段值是区分大小写的,因此在查询时必须注意大小写的匹配
*/
public void search_mod1(String type, String keyword)
throws CorruptIndexException, IOException, ParseException {
IndexSearcher searcher = new IndexSearcher(this.INDEX_DIR);
Term term = new Term(type,keyword);
//Query query=new TermQuery(term);最常用,然后构造hits保存检索结果
TermDocs docs = searcher.getIndexReader().termDocs(term);
//System.out.println("count:"+docs.freq());
while (docs.next()) {
Document doc = searcher.doc(docs.doc());
System.out.println("姓名1:" + doc.get("name"));
System.out.println("职业1:" + doc.get("vocation"));
}
if (searcher != null)searcher.close();
}
/**
* 遍历索引[方式二]
* @param type
* @param keyword
* @throws Exception
*/
public void search_mod2(String type, String keyword) throws Exception{
int count=50;//取前50条
Searcher searcher = new IndexSearcher(INDEX_DIR);
Query query = new QueryParser(type, new StandardAnalyzer()).parse(keyword);
TopDocCollector collector = new TopDocCollector(count);
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
// System.out.println("共查找到结果:"+hits.length);
for (int i = 0; i < hits.length; i++) {
int docId = hits[i].doc;
Document doc = searcher.doc(docId);
//System.out.println("Title:"+doc.get("title"));
System.out.println("姓名2:"+doc.get("name"));
System.out.println("职业2:"+doc.get("vocation"));
}
if (searcher != null)searcher.close();
}
/**
* 遍历索引[方式三]
* @param type
* @param keyword
* @throws Exception
*/
public void search_mod3(String type, String keyword)throws Exception{
Searcher searcher = new IndexSearcher(INDEX_DIR);
Query query = new QueryParser(type, new StandardAnalyzer()).parse(keyword);
Hits hits=searcher.search(query);
for(int i=0;i<hits.length();i++){
Document doc=hits.doc(i);
System.out.println("姓名3:"+doc.get("name"));
System.out.println("职业3:"+doc.get("vocation"));
}
if (searcher != null)searcher.close();
}
/**
* 遍历索引[方式四:与或搜索]
*/
public void search_mod4()throws Exception{
Query query1 = null;
Query query2 = null;
BooleanQuery query = new BooleanQuery();// 构造一个布尔查询
Hits hits = null;
Searcher searcher = new IndexSearcher(INDEX_DIR);
query1 = new TermQuery(new Term("name","赵"));
query2 = new TermQuery(new Term("vocation","教"));
// 添加两个子查询[下面两个子句为或的关系]
//MUST、SHOULD、MUST_NOT表示与、或、非
query.add(query1,BooleanClause.Occur.SHOULD);
query.add(query2,BooleanClause.Occur.SHOULD);
hits = searcher.search(query);
printResult(hits, "赵和教",4);
}
/**
* 遍历索引[方式五:在某一范围内搜索]
* @throws Exception
*/
public void search_mod5()throws Exception{
RangeQuery query = null;
Hits hits = null;
Searcher searcher = new IndexSearcher(INDEX_DIR);
//当第二的参数为null时,后边界无限
query = new RangeQuery(new Term("date","1985-04-05"),
new Term("date","1988-05-02"), true);//true包括边界
hits = searcher.search(query);
printResult(hits, "1985-04-05~1988-05-02",5);
}
/**
* 遍历索引[方式六:多域搜索]
* @throws Exception
*/
public void search_mod6()throws Exception{
Hits hits = null;
Searcher searcher = new IndexSearcher(INDEX_DIR);
//指定或的关系
BooleanClause.Occur[] flags = new BooleanClause.Occur[] {
BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };
Query query= MultiFieldQueryParser.parse(
"赵", new String[] {"name", "vocation"}, flags, new StandardAnalyzer());
hits = searcher.search(query);
printResult(hits, "名字或职业含有赵的结果",6);
}
/**
* 遍历索引[方式七:将索引结果排序]
* @throws Exception
*/
public void search_mod7()throws Exception{
Sort sort = new Sort(new SortField[]{new SortField("date", SortField.AUTO, true)});
RangeQuery query = null;
Hits hits = null;
Searcher searcher = new IndexSearcher(INDEX_DIR);
//当第二的参数为null时,后边界无限
query = new RangeQuery(new Term("date","1985-04-05"),
new Term("date","1988-05-02"), true);//true包括边界
hits = searcher.search(query,sort);
printResult(hits, "按时间大小",7);
}
public static void main(String[] args) {
SearchDb sdb = new SearchDb();
sdb.getResults();
sdb.indexDocs();
try {
sdb.search_mod1("name","詹");
System.out.println("------------------");
sdb.search_mod2("vocation","师");
System.out.println("------------------");
sdb.search_mod3("vocation","员");
System.out.println("------------------");
sdb.search_mod4();
System.out.println("------------------");
sdb.search_mod5();
System.out.println("------------------");
sdb.search_mod6();
System.out.println("------------------");
sdb.search_mod7();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
**Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...
它允许用户以图形化的方式查看、操作和分析 Lucene 索引。 Luke 提供了诸如查看文档字段、搜索索引、查看倒排索引结构等功能,对于开发者来说是了解和调试 Lucene 索引的利器。 Luke 的源码也公开在 GitHub 上,这...
《深入理解Lucene索引查看程序与代码》 在信息技术领域,搜索引擎的高效运作离不开底层索引技术的支持,而Lucene作为Apache软件基金会的一个开放源代码项目,正是一个强大的全文检索库,它提供了高效的文本搜索功能...
通过 Luke,开发者可以更好地理解 Lucene 索引的工作方式,进行索引优化,例如调整分析器设置以改进分词效果,或查看是否存在重复或无效的索引项。这对于调试搜索问题、提升搜索效率和整体应用性能至关重要。
以下是对Lucene索引机制的详细解析: 一、Lucene的索引过程 1. 文档分析:当向Lucene添加文档时,首先会经过一个分词器(Tokenizer),将文本拆分成一系列的词项(Token)。接着,这些词项会被过滤(Filter)和...
**Lucene索引和查询** Lucene是Apache软件基金会的开放源码全文搜索引擎库,它提供了文本检索的核心工具,使得开发者能够快速构建自己的搜索应用。本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行...
lukeall-0.9.jar为Lucene索引查看工具,方便大家查看索引
`Luck`,全称`Luke`,是一款强大的Lucene索引浏览器和分析器工具,可以帮助开发者、数据分析师以及对Lucene感兴趣的人员查看、理解和调试Lucene索引。 `Luke 7.4.0`是这款工具的一个特定版本,它专门设计用来与...
《深入理解Lucene索引文件查看工具LukeAll 4.7.1》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用在各种数据检索系统中。然而,对于开发者来说,理解并调试Lucene创建的索引文件并非易事。此时...
以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和应用Lucene有所帮助。在实际开发中,可以根据需求选择合适的Analyzer,优化索引策略,以...
《深入理解Luke:洞察Lucene索引文件》 在信息技术领域,搜索引擎的高效运作离不开对数据的快速检索,而Lucene作为开源全文检索库,扮演了核心角色。在这个过程中,Luke工具提供了一种直观的方式,让我们能够查看和...
这方面的信息存储在各种文件中,如segments_N(段信息),fnm(域名和索引方式),fdx/fdt(文档域信息),tvx/tvd/tvf(Term Vector信息,包含词频、位置等)。 反向信息(Inverted Index)则提供了从词到文档的...
**Lucene索引结构原理** Lucene是Apache软件基金会的开放源代码全文搜索引擎库,它为Java开发人员提供了强大的文本搜索功能。理解Lucene的索引结构原理对于优化搜索性能和设计高效的搜索应用至关重要。 首先,我们...
**Lucene索引的基本操作** Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高效、可扩展的全文检索功能。在Java开发环境中,Lucene是广泛使用的文本搜索工具,能够帮助开发者构建复杂的搜索引擎。本文将...
《Lucene索引小示例解析》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。在Java编程环境中,Lucene被广泛应用于构建搜索功能,特别是对于大量文本数据的高效检索。本篇文章将通过一个简单的小...
一个Lucene索引是由多个文件组成的,包括但不限于 segments文件、.del文件(删除文档标记)、.tii和.tis文件(Term Info Index和Term Info postings)、.frx、.fdx、.fdt、.fdt(Field Data)等。这些文件共同构成了...
这款已经老了,2.4以后的lucene索引用不了。我上传了最新版本的,有需要的话!请到http://download.csdn.net/source/1423241 下。一款可以查看Lucene分词后在索引的排名以及是否有无该词,很多时候用于查看有无需要...
而在Lucene中,基本单位是Document,它同样由多个字段组成,但Lucene索引的是这些字段的内容,以加速文本检索。 - **索引构建**:Lucene支持增量索引和批量索引,可以处理数据源的小幅变化或大规模数据。数据库通常...
本文将详细介绍一款被称为“很好的lucene索引查看工具”的实用软件,旨在帮助用户更好地理解和调试Lucene索引。 Lucene索引查看工具是一款专为Lucene设计的可视化工具,它允许用户直观地浏览和分析由Lucene创建的...
1. **索引浏览器**:Luke允许用户打开并查看Lucene索引目录,展示了索引的基本结构,包括字段、文档数量、存储方式等信息。用户可以通过它来浏览每个文档的详细内容,如字段值、ID、文档长度等。 2. **字段信息**:...