`

lucene最新版本3.3的基本功能用法(IK分词是3.2.8)

阅读更多
1.创建索引和查询
package dataFromOracle.dao;

import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;


import org.apache.lucene.analysis.Analyzer;
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.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
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.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;

import dataFromOracle.conn.Conn;
import dataFromOracle.entity.SearchResult;

public class TestLucene {

	// 获得数据库的数据
	public ResultSet getResult(String sql) {
		try {
			Statement stmt = Conn.getConnection().createStatement();// 获得数据库连接
			ResultSet rs = stmt.executeQuery(sql);
			return rs;
		} catch (SQLException e) {
			System.out.println(e);
		}
		return null;
	}

	// 创建索引
	public void Index(ResultSet rs,File indexDir) {
		try {
			//File indexDir = new File("d:\\fileIndex");
			Analyzer analyzer = new IKAnalyzer();  
			IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_33,
					analyzer);
			
			conf.setOpenMode(OpenMode.CREATE);
			IndexWriter writer = new IndexWriter(FSDirectory.open(indexDir),
					conf);
			// IndexWriter writer = new IndexWriter("d:/index/", getAnalyzer(),
			// true);
			while (rs.next()) {
				// document中添加field字段
				Document doc = new Document();
				doc.add(new Field("id", rs.getString(1), Field.Store.YES,
						Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
				doc.add(new Field("title", rs.getString(2),
						Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
				doc.add(new Field("content", rs.getString(3),
						Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
				doc.add(new Field("author", rs.getString(4),
						Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
				doc.add(new Field("time", rs.getString(5),
						Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
				writer.addDocument(doc);
			}
			writer.optimize();
			writer.close();
		} catch (IOException e) {
			System.out.println(e);
		} catch (SQLException e) {
			System.out.println(e);
		}
	}


	// 查询
	public List<SearchResult> seacherStr(String queryString,String searchdictory) {
		List<SearchResult> list=null;
		TopDocs topDocs = null;
		Query query = null;
		IndexSearcher searcher = null;
		try {
			searcher = new IndexSearcher(FSDirectory.open(new File(searchdictory)), true);// read-only
			//String fields = "City";
			String [] fields = {"title","content"};  //,"author"
			String field="title";
	
			 //使用IKQueryParser查询分析器构造Query对象  
			
//			//声明BooleanClause.Occur[]数组,它表示多个条件之间的关系     
//            BooleanClause.Occur[] flags=new BooleanClause.Occur[]{BooleanClause.Occur.MUST,BooleanClause.Occur.MUST};   
			
            
             query = IKQueryParser.parseMultiField(fields, queryString);//多个
//         //在索引器中使用IKSimilarity相似度评估器  
           searcher.setSimilarity(new IKSimilarity()); 		
           // 准备高亮器
           Formatter formatter=new SimpleHTMLFormatter("<span class=\"highlighter\">","</span>");
           Scorer fragmentScorer=new QueryScorer(query);
           Highlighter highlighter=new Highlighter(formatter, fragmentScorer);
           Fragmenter fragmenter=new SimpleFragmenter(100);//高亮范围
           highlighter.setTextFragmenter(fragmenter);
          
			
			if (searcher != null) {
				topDocs = searcher.search(query, 100);// 100是显示队列的Size
				ScoreDoc[] hits = topDocs.scoreDocs;
				System.out.println("共有" + searcher.maxDoc() + "条索引,命中"
						+ hits.length + "条");
				list=new ArrayList<SearchResult>();
				for (int i = 0; i < hits.length; i++) {
					 ScoreDoc scoreDoc = topDocs.scoreDocs[i];//读取第几条记录  
					 int docSn=scoreDoc.doc;  
		               //文档内部编号    
			          Document document=searcher.doc(docSn);
			          
			          
			          //高亮
			          String content = document.get("content");//获取属性值
			          //如果当前属性值中没有出现关键字,则返回null
			          String hccontent=highlighter.getBestFragment(new IKAnalyzer(), "content", content);
			          
			          String title=document.get("title");
			          String hctitle=highlighter.getBestFragment(new IKAnalyzer(), "title", title);
			          System.out.println("hccontent:"+hccontent);
			          System.out.println("hctitle:"+hctitle);
			          
			          if(hccontent==null){
			        	  hccontent=document.get("content");
			          }
			          if(hctitle==null){
			        	  hctitle=document.get("title");
			          }
			          SearchResult rs=new SearchResult();
			          
			          rs.setId(document.get("id").toString());
			          rs.setTitle(hctitle);
			          rs.setContent(hccontent);
			          rs.setAuthor(document.get("author"));
			          rs.setTime(document.get("time"));
			          list.add(rs);
				}
				 
			}
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
 catch (InvalidTokenOffsetsException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return list;
	}
	
	
}

2.查询结果的实体
package dataFromOracle.entity;

public class SearchResult {
	private String id;
	private String title;
	private String content;
	private String author;
	private String time;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getTime() {
		return time;
	}

	public void setTime(String time) {
		this.time = time;
	}
}

3.servlet
package dataFromOracle.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.lucene.document.Document;

import dataFromOracle.dao.TestLucene;
import dataFromOracle.entity.SearchResult;

public class SearchServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		req.setCharacterEncoding("utf-8");
		String queryString=req.getParameter("queryString");//获得页面输入的查询关键字
		String queryType=req.getParameter("queryType");
		System.out.println(queryString);
		TestLucene tl=new TestLucene();
	
		String filedir="d:\\fileIndex";
		
		if(null!=queryType && "blogs".equals(queryType)){
			filedir+="\\blogs";
		}else if (null!=queryType && "news".equals(queryType)){
			filedir+="\\news";
		}else{
			filedir+="\\all";
		}
		//无法显示具体的内容
		List<SearchResult> list=tl.seacherStr(queryString,filedir);
		
		req.setAttribute("list", list);
		req.setAttribute("queryString", queryString);
		req.setAttribute("queryType", queryType);
		//resp.sendRedirect("show.jsp");
		RequestDispatcher rd=req.getRequestDispatcher("/show.jsp");
		rd.forward(req, resp);
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(arg0, arg1);
	}

}


4.生成索引--目前是分类的索引,我用的是分离索引库。生成索引这个步骤可以考虑做成定时任务
package dataFromOracle.build;

import java.io.File;
import java.sql.ResultSet;

import dataFromOracle.dao.TestLucene;

public class BuildIndex {
	public static void main(String[] args) {
		buildBlogsIndex();
		buildNewsIndex();
		buildAllIndex();
		
	}
	
	private static void buildBlogsIndex(){
		//获得数据库的数据
		TestLucene tl=new TestLucene();
		ResultSet rs=tl.getResult("select t.id,t.title,t.content,t.author,t.time from blogs t");
		//创建索引
		String filedir="d:\\fileIndex\\blogs";
		
		File indexDir = new File(filedir);
		tl.Index(rs,indexDir);
		System.out.println("buildBlogsIndex完成!");
	}
	private static void buildNewsIndex(){
		//获得数据库的数据
		TestLucene tl=new TestLucene();
		ResultSet rs=tl.getResult("select t.id,t.title,t.content,t.author,t.time from news t");
		//创建索引
		String filedir="d:\\fileIndex\\news";
		
		File indexDir = new File(filedir);
		tl.Index(rs,indexDir);
		System.out.println("buildNewsIndex完成!");
	}
	private static void buildAllIndex(){
		//获得数据库的数据
		TestLucene tl=new TestLucene();
		ResultSet rs=tl.getResult("select t.id,t.title,t.content,t.author,t.time from news t");
		//创建索引
		String filedir="d:\\fileIndex\\all";
		
		File indexDir = new File(filedir);
		tl.Index(rs,indexDir);
		System.out.println("buildAllIndex中的news完成");
		//获得数据库的数据
		rs=tl.getResult("select t.id,t.title,t.content,t.author,t.time from blogs t");
		//创建索引
		filedir="d:\\fileIndex\\blogs";
		
		indexDir = new File(filedir);
		tl.Index(rs,indexDir);
		System.out.println("buildAllIndex中的blogs完成!");
	}
	
}

5.数据库表结构--news表和blogs表字段一致
-- Create table
create table BLOGS
(
  ID      NUMBER(10) not null,
  TITLE   VARCHAR2(255) not null,
  CONTENT VARCHAR2(1024) not null,
  AUTHOR  VARCHAR2(255) not null,
  TIME    TIMESTAMP(6) not null,
  KEYWORD VARCHAR2(255),
  DIGEST  VARCHAR2(255)
);
-- Create/Recreate primary, unique and foreign key constraints 
alter table BLOGS
  add primary key (ID);

注:数据库连接的类没有贴出来,
分享到:
评论

相关推荐

    IKAnalyzer3.2.8.jar + doc(index.html)+demo 史上最全

    标题提到的 "IKAnalyzer3.2.8.jar" 是IKAnalyzer的特定版本,即3.2.8版的库文件,它可以被集成到Java项目中,为项目的中文分词功能提供支持。 描述中的 "doc(index.html)" 暗示了压缩包中包含了文档资料,通常这样...

    IKAnalyzer-3.2.8.jar

    IK Analyzer是一个开源的,基于java诧言开发的轻量级的中文分词工具包。 IK Analyzer 3.2.8特性 采用了特有的“正吐迭代最细粒度切分算法“,支持细粒度和最大词长两种切分模式;具有83万字/秒(1600KB/S)的高速...

    IKAnalyzer中文分词器V3.2.8使用手册

    自2006年12月发布1.0版以来,已经经历了多个大版本的迭代,目前最新版本为V3.2.8。最初,IKAnalyzer作为开源项目Lucene的一部分,主要服务于该搜索引擎库。随着时间的发展,IKAnalyzer逐渐演变为一个独立于Lucene...

    IKAnalyzer3.2.8

    IKAnalyzer是中国开源社区推出的一款高性能、易用的中文分词工具,主要针对Lucene等全文检索引擎进行设计和优化。它的全称为“Intelligent Chinese Analyzer for Lucene”,旨在提升中文在全文检索领域的处理效率和...

    IKAnalyzer3.2.8 源码

    通过深入研究IKAnalyzer3.2.8的源码,开发者可以了解中文分词的基本原理,学习如何优化分词算法,以及如何在实际项目中与搜索引擎框架集成,提升信息检索系统的效能。同时,源码阅读也是提升Java编程技能和理解软件...

    IK中文分词器详细介绍

    自2006年首次发布以来,IKAnalyzer已经历了多个版本的迭代和完善,最新版本为3.2.8版。该工具包最初设计是为了与Lucene搜索引擎集成使用,但随着时间的发展,IKAnalyzer已经能够作为一个独立的Java分词组件使用。 #...

    IK3.2.8原理及源码分析(原创)

    IK分词器是IKAnalyzer的核心组成部分,主要负责将输入的文本分解成一系列有意义的词语。其实现位于`org.wltea.analyzer.lucene.IKAnalyzer`类中,提供了两种主要的分词算法: - **最细粒度切分算法**:这是一种较...

    关于IKAnalyzer3.2.8扩展词典配置的个人心得和意见

    IKAnalyzer提供了丰富的功能和良好的扩展性,尤其在中文文本的分词准确性方面表现优异。 #### 二、IKAnalyzer3.2.8版本特点 IKAnalyzer3.2.8作为一款较为成熟的版本,具有以下特点: 1. **稳定性**: 经过多个版本...

    Apache Lucene全文检索和IKAnalyzer分词工具类

    说明:依赖jar包:lucene-core-2.3.2.jar、IKAnalyzer3.2.8.jar。 一、LuceneUtil 工具类代码: package com.zcm.lucene; import java.io.File; import java.io.IOException; import java.io.StringReader; import...

    IK Analyzer实现Java lucene中文分词相关资源架包

    IK Analyzer是基于lucene实现的分词开源框架 需要在项目中引入: IKAnalyzer.cfg.xml IKAnalyzer2012.jar lucene-core-4.3.0.jar stopword.dic

    实验报告(利用Nutch和IKanalyzer构造中文分词搜索引擎)

    尝试使用Nutch 0.9和IKAnalyzer 3.1.6GA组合,但由于版本兼容性问题导致失败,因此改用Nutch 1.2和IKAnalyzer 3.2.8,并将Tomcat升级到6.0.35版本。 在Nutch 1.2中集成IKAnalyzer,需要修改NutchAnalysis.jj文件,...

    IKAnalyzer使用不同版本中文分词的切词方式实现相同功能效果

    为了解决这个问题,我们转向了IKAnalyzer 3.2.8版本,并与Lucene 3.1.0版本搭配使用。在新的`analysisByIK3Point2`方法中,虽然基本步骤相似,但需要注意的是,与Lucene 2.x版本相比,部分接口名称和类型有所变化,...

    Lucene使用

    IKAnalyzer分词 2012版不支持,采用3.2.8版 在使用2012版时异常:ClassNotFoundException: org.apache.lucene.analysis.tokenattributes.CharTermAttribute 庖丁分词 使用 paoding-analysis-2.0.4-beta.zip 版时...

    最新Solr环境搭建与IKAnalyzer3分词整合.doc

    Solr 是一个基于 Lucene 的搜索服务器, IKAnalyzer 是一个开源的中文分词器,通过将其整合到 Solr 中,可以实现中文搜索的功能。 一、Solr 环境搭建 Solr 环境搭建需要 JRE 环境的支持,因此我们首先需要安装 ...

    IKAnalyzer.Solr

    3. IKAnalyzer3.2.8_bin.zip:这是版本号为3.2.8的二进制包,"bin"通常包含了可执行文件和其他运行所需文件,适合直接部署使用。 在使用这些IKAnalyzer版本时,你需要根据你的Solr版本和实际需求选择合适的版本进行...

    Lucene开发所需其他架包和中文分词器

    Lucene开发所需其他架包和中文分词器(solr3.5+IKAnalyzer3.2.8),没有加入Lucene包,需要可去http://archive.apache.org/dist/lucene/java/4.10.3/下载相应包。

    solr3.5配置及应用

    - 使用新定义的`text_ik`类型来替代原有的`text`类型,以启用中文分词功能。 以上就是关于Solr 3.5配置及应用的基础知识点介绍。通过这些步骤,用户可以快速搭建起一个基本的Solr搜索环境,并实现中文分词的支持,...

    ssh项目必备jar包(一)

    5. **IKAnalyzer3.2.8.jar**:这是IK Analyzer,一个基于Lucene的中文分词器。在SSH项目中,如果涉及到中文文本的搜索或分析,IK Analyzer能够帮助准确地进行分词,提高搜索结果的准确性。 6. **freemarker-2.3.19....

Global site tag (gtag.js) - Google Analytics