`
忧里修斯
  • 浏览: 436214 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

lucene索引方式

阅读更多
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索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...

    lucene索引查看工具及源码

    它允许用户以图形化的方式查看、操作和分析 Lucene 索引。 Luke 提供了诸如查看文档字段、搜索索引、查看倒排索引结构等功能,对于开发者来说是了解和调试 Lucene 索引的利器。 Luke 的源码也公开在 GitHub 上,这...

    lucene索引查看程序及代码

    《深入理解Lucene索引查看程序与代码》 在信息技术领域,搜索引擎的高效运作离不开底层索引技术的支持,而Lucene作为Apache软件基金会的一个开放源代码项目,正是一个强大的全文检索库,它提供了高效的文本搜索功能...

    lucene 索引 查看 工具

    通过 Luke,开发者可以更好地理解 Lucene 索引的工作方式,进行索引优化,例如调整分析器设置以改进分词效果,或查看是否存在重复或无效的索引项。这对于调试搜索问题、提升搜索效率和整体应用性能至关重要。

    深入 Lucene 索引机制

    以下是对Lucene索引机制的详细解析: 一、Lucene的索引过程 1. 文档分析:当向Lucene添加文档时,首先会经过一个分词器(Tokenizer),将文本拆分成一系列的词项(Token)。接着,这些词项会被过滤(Filter)和...

    Lucene索引和查询

    **Lucene索引和查询** Lucene是Apache软件基金会的开放源码全文搜索引擎库,它提供了文本检索的核心工具,使得开发者能够快速构建自己的搜索应用。本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行...

    Lucene索引查看工具

    lukeall-0.9.jar为Lucene索引查看工具,方便大家查看索引

    lucene索引查看工具luck7.4.0

    `Luck`,全称`Luke`,是一款强大的Lucene索引浏览器和分析器工具,可以帮助开发者、数据分析师以及对Lucene感兴趣的人员查看、理解和调试Lucene索引。 `Luke 7.4.0`是这款工具的一个特定版本,它专门设计用来与...

    Lucene索引文件查看工具lukeall4.7.1

    《深入理解Lucene索引文件查看工具LukeAll 4.7.1》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用在各种数据检索系统中。然而,对于开发者来说,理解并调试Lucene创建的索引文件并非易事。此时...

    Lucene 索引的简单使用

    以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和应用Lucene有所帮助。在实际开发中,可以根据需求选择合适的Analyzer,优化索引策略,以...

    luke源码--查看lucene索引文件

    《深入理解Luke:洞察Lucene索引文件》 在信息技术领域,搜索引擎的高效运作离不开对数据的快速检索,而Lucene作为开源全文检索库,扮演了核心角色。在这个过程中,Luke工具提供了一种直观的方式,让我们能够查看和...

    lucene索引文件格式介绍

    这方面的信息存储在各种文件中,如segments_N(段信息),fnm(域名和索引方式),fdx/fdt(文档域信息),tvx/tvd/tvf(Term Vector信息,包含词频、位置等)。 反向信息(Inverted Index)则提供了从词到文档的...

    lucene索引结构原理

    **Lucene索引结构原理** Lucene是Apache软件基金会的开放源代码全文搜索引擎库,它为Java开发人员提供了强大的文本搜索功能。理解Lucene的索引结构原理对于优化搜索性能和设计高效的搜索应用至关重要。 首先,我们...

    Lucene索引的基本操作

    **Lucene索引的基本操作** Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高效、可扩展的全文检索功能。在Java开发环境中,Lucene是广泛使用的文本搜索工具,能够帮助开发者构建复杂的搜索引擎。本文将...

    lucene 索引小示例

    《Lucene索引小示例解析》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。在Java编程环境中,Lucene被广泛应用于构建搜索功能,特别是对于大量文本数据的高效检索。本篇文章将通过一个简单的小...

    Lucene读取索引文件

    一个Lucene索引是由多个文件组成的,包括但不限于 segments文件、.del文件(删除文档标记)、.tii和.tis文件(Term Info Index和Term Info postings)、.frx、.fdx、.fdt、.fdt(Field Data)等。这些文件共同构成了...

    lucene索引查看工具

    这款已经老了,2.4以后的lucene索引用不了。我上传了最新版本的,有需要的话!请到http://download.csdn.net/source/1423241 下。一款可以查看Lucene分词后在索引的排名以及是否有无该词,很多时候用于查看有无需要...

    lucene索引结构原理.docx

    而在Lucene中,基本单位是Document,它同样由多个字段组成,但Lucene索引的是这些字段的内容,以加速文本检索。 - **索引构建**:Lucene支持增量索引和批量索引,可以处理数据源的小幅变化或大规模数据。数据库通常...

    很好的lucene索引查看工具,欢迎各位lucene研究者前来下载

    本文将详细介绍一款被称为“很好的lucene索引查看工具”的实用软件,旨在帮助用户更好地理解和调试Lucene索引。 Lucene索引查看工具是一款专为Lucene设计的可视化工具,它允许用户直观地浏览和分析由Lucene创建的...

    luke lucene索引查看

    1. **索引浏览器**:Luke允许用户打开并查看Lucene索引目录,展示了索引的基本结构,包括字段、文档数量、存储方式等信息。用户可以通过它来浏览每个文档的详细内容,如字段值、ID、文档长度等。 2. **字段信息**:...

Global site tag (gtag.js) - Google Analytics