- 浏览: 204136 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zoutuo1986:
翻过的帖子,这篇讲配置最细
solr -
18612536750:
Struts2 标签,取得Map的某一个key对应value值 -
zhangzhihua5:
solr -
xiaguangme:
“capacity才是真正的Entry数组的大小,即真实的En ...
源码阅读之Map和Set -
qiyang199132:
我擦民工 都没人来。。 我来捧场了
JSP 防止重复提交 防止重复刷新 防止后退问题以及处理方式
1.创建索引和查询
2.查询结果的实体
3.servlet
4.生成索引--目前是分类的索引,我用的是分离索引库。生成索引这个步骤可以考虑做成定时任务
5.数据库表结构--news表和blogs表字段一致
注:数据库连接的类没有贴出来,
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);
注:数据库连接的类没有贴出来,
- Lucene.rar (7.6 MB)
- 下载次数: 63
发表评论
-
Lucene
2011-11-27 20:40 3603一个搜索功能:要求将所有包括搜索字段的文章的标题列出来(文章的 ... -
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎
2011-10-26 09:33 1459SSH + Lucene + 分页 + 排序 + 高亮 模拟简 ... -
org.apache.lucene.analysis.TokenStream.incrementToken()Z
2011-10-25 14:06 2709在使用lucene3与IKAnalyzer集成的时候可能会出现 ... -
Lucene多字段搜索
2011-10-24 17:08 3886最近在学习Lucene的过程中遇到了需要多域搜索并排序的问题, ...
相关推荐
标题提到的 "IKAnalyzer3.2.8.jar" 是IKAnalyzer的特定版本,即3.2.8版的库文件,它可以被集成到Java项目中,为项目的中文分词功能提供支持。 描述中的 "doc(index.html)" 暗示了压缩包中包含了文档资料,通常这样...
IK Analyzer是一个开源的,基于java诧言开发的轻量级的中文分词工具包。 IK Analyzer 3.2.8特性 采用了特有的“正吐迭代最细粒度切分算法“,支持细粒度和最大词长两种切分模式;具有83万字/秒(1600KB/S)的高速...
自2006年12月发布1.0版以来,已经经历了多个大版本的迭代,目前最新版本为V3.2.8。最初,IKAnalyzer作为开源项目Lucene的一部分,主要服务于该搜索引擎库。随着时间的发展,IKAnalyzer逐渐演变为一个独立于Lucene...
IKAnalyzer是中国开源社区推出的一款高性能、易用的中文分词工具,主要针对Lucene等全文检索引擎进行设计和优化。它的全称为“Intelligent Chinese Analyzer for Lucene”,旨在提升中文在全文检索领域的处理效率和...
通过深入研究IKAnalyzer3.2.8的源码,开发者可以了解中文分词的基本原理,学习如何优化分词算法,以及如何在实际项目中与搜索引擎框架集成,提升信息检索系统的效能。同时,源码阅读也是提升Java编程技能和理解软件...
自2006年首次发布以来,IKAnalyzer已经历了多个版本的迭代和完善,最新版本为3.2.8版。该工具包最初设计是为了与Lucene搜索引擎集成使用,但随着时间的发展,IKAnalyzer已经能够作为一个独立的Java分词组件使用。 #...
IK分词器是IKAnalyzer的核心组成部分,主要负责将输入的文本分解成一系列有意义的词语。其实现位于`org.wltea.analyzer.lucene.IKAnalyzer`类中,提供了两种主要的分词算法: - **最细粒度切分算法**:这是一种较...
IKAnalyzer提供了丰富的功能和良好的扩展性,尤其在中文文本的分词准确性方面表现优异。 #### 二、IKAnalyzer3.2.8版本特点 IKAnalyzer3.2.8作为一款较为成熟的版本,具有以下特点: 1. **稳定性**: 经过多个版本...
说明:依赖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是基于lucene实现的分词开源框架 需要在项目中引入: IKAnalyzer.cfg.xml IKAnalyzer2012.jar lucene-core-4.3.0.jar stopword.dic
尝试使用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 3.2.8版本,并与Lucene 3.1.0版本搭配使用。在新的`analysisByIK3Point2`方法中,虽然基本步骤相似,但需要注意的是,与Lucene 2.x版本相比,部分接口名称和类型有所变化,...
IKAnalyzer分词 2012版不支持,采用3.2.8版 在使用2012版时异常:ClassNotFoundException: org.apache.lucene.analysis.tokenattributes.CharTermAttribute 庖丁分词 使用 paoding-analysis-2.0.4-beta.zip 版时...
Solr 是一个基于 Lucene 的搜索服务器, IKAnalyzer 是一个开源的中文分词器,通过将其整合到 Solr 中,可以实现中文搜索的功能。 一、Solr 环境搭建 Solr 环境搭建需要 JRE 环境的支持,因此我们首先需要安装 ...
3. IKAnalyzer3.2.8_bin.zip:这是版本号为3.2.8的二进制包,"bin"通常包含了可执行文件和其他运行所需文件,适合直接部署使用。 在使用这些IKAnalyzer版本时,你需要根据你的Solr版本和实际需求选择合适的版本进行...
Lucene开发所需其他架包和中文分词器(solr3.5+IKAnalyzer3.2.8),没有加入Lucene包,需要可去http://archive.apache.org/dist/lucene/java/4.10.3/下载相应包。
- 使用新定义的`text_ik`类型来替代原有的`text`类型,以启用中文分词功能。 以上就是关于Solr 3.5配置及应用的基础知识点介绍。通过这些步骤,用户可以快速搭建起一个基本的Solr搜索环境,并实现中文分词的支持,...
5. **IKAnalyzer3.2.8.jar**:这是IK Analyzer,一个基于Lucene的中文分词器。在SSH项目中,如果涉及到中文文本的搜索或分析,IK Analyzer能够帮助准确地进行分词,提高搜索结果的准确性。 6. **freemarker-2.3.19....