`
yuan_bin1990
  • 浏览: 4422 次
社区版块
存档分类
最新评论

lucene 3.6 全文检索

阅读更多

/**

  *索引字段,可根据需要修改

*/

package com.beyondbit.entity;

import java.util.Date;

public class ResultInfo {

 private Long id;   //主健id
 private String ct_title;   //标题
 private String ct_brief;   //摘要
 private String ct_content;   //内容
 private String sj_name;    //栏目   or  分类名称
 private String url;       //静态文件地址
 private String topid;     //呼叫中心下的栏目id  or  知识分类下的分类id   该栏目为 呼叫中心、知识分类下的第二级
 private Date create_time;   //知识     or  信息的发布日期
 private String recommend;  //是否推荐   1推荐
 private Integer bscredit;   //企业信用值
 public ResultInfo(){
  
 }
 
 public ResultInfo(Long id, String ct_title,String ct_brief,String ct_content,
   String sj_name,String url,String topid,Date create_time,String recommend,Integer bscredit) {
  super();
  this.id = id;
  this.ct_title = ct_title;
  this.ct_brief=ct_brief;
  this.ct_content = ct_content;
  this.sj_name = sj_name;
  this.url=url;
  this.topid=topid;
  this.create_time = create_time;
  this.recommend=recommend;
  this.bscredit=bscredit;
 }
 //此处省略get  ,set方法 

}

package com.beyondbit.util;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.DateTools.Resolution;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;
import org.springframework.transaction.annotation.Transactional;
import org.wltea.analyzer.lucene.IKAnalyzer;

import com.beyondbit.entity.ResultInfo;

 

/**

  *操作索引的类

   */
public class LuceneContent {
 
 public static final String LUCENE_PATH="lucene";

 public  Document createDocument(ResultInfo c) {
  Document doc = new Document();
  doc.add(new Field("id",c.getId().toString(), Field.Store.YES,Field.Index.NOT_ANALYZED));
  doc.add(new Field("title",c.getCt_title()==null?"":c.getCt_title(),Field.Store.YES, Field.Index.ANALYZED));
  doc.add(new Field("brief",c.getCt_brief()==null?"":c.getCt_brief(),Field.Store.YES, Field.Index.ANALYZED));
  doc.add(new Field("content",c.getCt_content()==null?"":c.getCt_content(),Field.Store.YES, Field.Index.ANALYZED));
  doc.add(new Field("url",c.getUrl()==null?"":c.getUrl(),Field.Store.YES,Field.Index.NOT_ANALYZED));
  doc.add(new Field("sjname",c.getSj_name()==null?"":c.getSj_name(),Field.Store.YES, Field.Index.ANALYZED));
  doc.add(new Field("topid",c.getTopid()==null?"":c.getTopid(),Field.Store.YES,Field.Index.ANALYZED));
  doc.add(new Field("date", DateTools.dateToString(c.getCreate_time(), Resolution.DAY), Field.Store.YES,Field.Index.NOT_ANALYZED));
  doc.add(new Field("recommend",c.getRecommend()==null?"0":c.getRecommend().toString(), Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
  doc.add(new Field("bscredit",c.getBscredit()==null?"0":c.getBscredit().toString(), Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
  return doc;
 }
 
 /**
  * 创建索引文件
  * @param content
  * @throws IOException
  */
 @Transactional(readOnly = true)
 public void createIndex(ResultInfo content) throws IOException {
  Directory dir = new SimpleFSDirectory(new File(Constants.luceneIndex));
  createIndex(content, dir);
 }

 
 /**
  * 创建索引文件
  * @param content
  * @param dir
  * @throws IOException
  */
 @Transactional(readOnly = true)
 public void createIndex(ResultInfo content, Directory dir) throws IOException {
  boolean exist = IndexReader.indexExists(dir);
  IndexWriterConfig iwconfig=new IndexWriterConfig(Version.LUCENE_36,new IKAnalyzer());
  IndexWriter writer=new IndexWriter(dir, iwconfig);
  try {
   writer.addDocument(createDocument(content));
  } finally {
   writer.close();
  }
 }
 
 /**
  * 删除索引文件
  * @param contentId
  * @throws IOException
  * @throws ParseException
  */
 @Transactional(readOnly = true)
 public void deleteIndex(Long contentId) throws IOException,
   ParseException {
  Directory dir = new SimpleFSDirectory(new File(Constants.luceneIndex));
  deleteIndex(contentId, dir);
 }
 
 /**
  * 根据索引文件id删除一条索引文件的信息
  * @param contentId
  * @param dir  索引文件的存放目录
  * @throws IOException
  * @throws ParseException
  */
 @Transactional(readOnly = true)
 public void deleteIndex(Long contentId, Directory dir)
   throws IOException, ParseException {
  boolean exist = IndexReader.indexExists(dir);
  if (exist) {
   IndexWriterConfig iwconfig=new IndexWriterConfig(Version.LUCENE_36,new IKAnalyzer());
   IndexWriter writer=new IndexWriter(dir, iwconfig);
   try {
    delete(contentId, writer);
   } finally {
    writer.close();
   }
  }
 }
 
 /**
  * 根据一条索引文件的id删除索引文件
  * @param contentId
  * @param writer
  * @throws CorruptIndexException
  * @throws IOException
  * @throws ParseException
  */
 public  void delete(Long contentId, IndexWriter writer)
   throws CorruptIndexException, IOException, ParseException {
  writer.deleteDocuments(new Term("id", contentId.toString()));
 }
 
 /**
  * 更新索引文件
  * @param content
  * @throws IOException
  * @throws ParseException
  */
 public void updateIndex(ResultInfo content) throws IOException, ParseException {
  Directory dir = new SimpleFSDirectory(new File(Constants.luceneIndex));
  updateIndex(content, dir);
 }

 /**
  * 更新索引文件
  * @param content
  * @param dir  索引文件存放的目录
  * @throws IOException
  * @throws ParseException
  */
 public void updateIndex(ResultInfo content, Directory dir) throws IOException,
   ParseException {
  boolean exist = IndexReader.indexExists(dir);
  IndexWriterConfig iwconfig=new IndexWriterConfig(Version.LUCENE_36,new IKAnalyzer());
  IndexWriter writer=new IndexWriter(dir, iwconfig);
  try {
   if (exist) {
    delete(content.getId(), writer);
   }
   writer.addDocument(createDocument(content));
  } finally {
   writer.close();
  }
 }
}

 

public String execute() throws Exception {
  page.setPageSize(getCookieCount());
  Query query=null;
  Analyzer analyzer=new IKAnalyzer();
  try {
   IndexSearcher searcher =new IndexSearcher(IndexReader.open(FSDirectory.open(new File(PropertyManager.getProperty("articleindex")))));
   TopScoreDocCollector topCollector = TopScoreDocCollector.create(searcher.maxDoc(),false);
   
   if(content==null||content.equals("")){
    QueryParser parse = new MultiFieldQueryParser(Version.LUCENE_36,new String[]{"title","content"}, analyzer);
    query=parse.parse(keyword);
   }
   if(content!=null&&content.equals("1")){
    if(sjid.equals("0")){
     //到全文中检索关健字
     query=MultiFieldQueryParser.parse(Version.LUCENE_36,new String[]{keyword},new String[]{"content"},new BooleanClause.Occur[]{BooleanClause.Occur.MUST},analyzer);
    }else{
     //根据关健字和栏目去查找
     query=MultiFieldQueryParser.parse(Version.LUCENE_36,new String[]{keyword,sjid},new String[]{"content","topid"},new BooleanClause.Occur[]{BooleanClause.Occur.MUST,BooleanClause.Occur.MUST},analyzer);
    }
   }if(content!=null&&content.equals("2")){
    if(sjid.equals("0")){
     //到标题中检索关健字
     query=MultiFieldQueryParser.parse(Version.LUCENE_36,new String[]{keyword},new String[]{"title"},new BooleanClause.Occur[]{BooleanClause.Occur.MUST},analyzer);
    }else{
     //根据关健字和栏目去查找
     query=MultiFieldQueryParser.parse(Version.LUCENE_36,new String[]{keyword,sjid},new String[]{"title","topid"},new BooleanClause.Occur[]{BooleanClause.Occur.MUST,BooleanClause.Occur.MUST},analyzer);
    }
   }
   searcher.search(query, topCollector);
   SimpleHTMLFormatter simpleHtmlFormatter = new SimpleHTMLFormatter("<font color=\"red\">", "</font>");
   Highlighter highlighter = new Highlighter(simpleHtmlFormatter,new QueryScorer(query));
   ScoreDoc[] docs=topCollector.topDocs((page.getPageNo()-1)*page.getPageSize(),page.getPageSize()).scoreDocs;
   ResultInfo info = null;
   for (int i = 0; i < docs.length; i++) {
    Document doc=searcher.doc(docs[i].doc);
    String content2 = doc.get("content");
    String title2 = doc.get("title");
    TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(content2));
    TokenStream tokenStream1 = analyzer.tokenStream("title", new StringReader(title2));
    String content = highlighter.getBestFragment(tokenStream,content2);
    String title = highlighter.getBestFragment(tokenStream1, title2);
    info = new ResultInfo();
    info.setId(Long.parseLong(doc.get("id")));
    info.setCt_title(title==null?title2:title);
    info.setCt_content(content==null?content2:content);
    info.setUrl(doc.get("url")==null?"":doc.get("url"));
    info.setSj_name(doc.get("sjname")==null?"":doc.get("sjname"));
       info.setCreate_time(DateTools.stringToDate(doc.get("date")));
    infos.add(info);
    info = null;
   }
   page.setTotalCount(topCollector.getTotalHits());
   //subs=subjectMananger.getAllLeafSubject();
  }catch (Exception e) {
   e.printStackTrace();
  }
  return SUCCESS;
 }

 

还可以对查询结果用sort进行排序,如:

String[] fields = { "title","brief","content" };

QueryParser  parse = new MultiFieldQueryParser(Version.LUCENE_36,fields, analyzer);

//keyword为关需要查找的关健字
    Query query=parse.parse(keyword);

 //下面这条语句表示先按recommend进行降序排列,false表示升序,再按title的匹配度进行排序
    Sort sort=new Sort(new SortField[]{new SortField("recommend",SortField.INT,true),new SortField("title",SortField.SCORE,false),new SortField("content",SortField.SCORE,false)});
    TopFieldDocs topFieldDocs = searcher.search(query,searcher.maxDoc(), sort);

   

   //设置高亮显示
    SimpleHTMLFormatter simpleHtmlFormatter = new SimpleHTMLFormatter("<font color=\"red\">", "</font>");
    Highlighter highlighter = new Highlighter(simpleHtmlFormatter,new QueryScorer(query));
    ScoreDoc[] docs=topFieldDocs.scoreDocs;
    for (int i =(page.getPageNo()-1)*page.getPageSize(); i <page.getPageNo()*page.getPageSize(); i++) {
     if(i<docs.length){
      Document doc=searcher.doc(docs[i].doc);
      String content2 = doc.get("content");
      String title2 = doc.get("title");
      String content=null;
      String title=null;
      if(content2!=null&&!content2.equals("")){
       TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(content2));

       //为了自己能够控制显示的长度必须加上下面这行代码,上面一行代码执行后会自动截取一长度
       highlighter.setTextFragmenter(new SimpleFragmenter(content2.length()));
       content = highlighter.getBestFragment(tokenStream,content2);
      }if(title2!=null&&!title2.equals("")){
       TokenStream tokenStream1 = analyzer.tokenStream("title", new StringReader(title2));
       title = highlighter.getBestFragment(tokenStream1, title2);
      }
      info = new ResultInfo();
      info.setId(Long.parseLong(doc.get("id")));
      info.setCt_title(title==null?title2:title);
      info.setCt_content(content==null?content2:content);
      info.setUrl(doc.get("url")==null?"":doc.get("url"));
      info.setSj_name(doc.get("name")==null?"":doc.get("name"));
      info.setCreate_time(DateTools.stringToDate(doc.get("date")));
      info.setRecommend(doc.get("recommend")==null?"":doc.get("recommend"));
      infos.add(info);
      info = null;
     }
    }

分享到:
评论

相关推荐

    lucene3.6 搜索例子

    Lucene 3.6作为一款强大的全文搜索库,提供了完整的搜索解决方案,包括高效的索引构建、灵活的查询语法和丰富的高级特性。开发者可以根据项目需求,利用Lucene构建出满足特定业务场景的搜索系统。在实践中,理解并...

    lucene3.6.jar

    总的来说,“lucene3.6.jar”与IkAnalyzer的结合,为开发者提供了一套强大的中文全文检索解决方案,既兼顾了搜索的效率,又保证了分词的准确性。通过深入理解和熟练运用这两个工具,可以在各种Java应用中实现高效且...

    lucene3.6工程原文件

    总结,Lucene 3.6 是一个强大的全文检索工具,通过理解它的基本概念、主要组件以及不同类型的查询,开发者可以快速构建起自己的全文搜索引擎。对于初学者而言,这个版本提供了足够的学习资源和实践机会,是深入理解...

    Lucene 3.6 学习笔记

    Lucene 是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发。本文将深入探讨Lucene 3.6版本中的关键概念、功能以及实现方法。 ### 第一章 Lucene 基础 #### 1.1 索引部分的核心类 - `Directory`: 用于存储...

    lucene 3.6 检索文件 pdf word ppt excel txt html xml

    《Lucene 3.6 全文检索技术详解与应用》 Lucene 是一个高性能、全文本搜索引擎库,由Apache软件基金会开发。在版本3.6中,它提供了强大的文件检索功能,支持对多种文件类型的搜索,包括PDF、Word、PPT、Excel、TXT...

    基于Lucene3.6进行全文检索的小案例

    在本文中,我们将深入探讨如何使用Apache Lucene 3.6版本进行全文检索的开发。Apache Lucene是一个高性能、全文本搜索库,它为开发者提供了强大的文本搜索功能,使得在各种应用中实现复杂而高效的搜索引擎成为可能。...

    IKAnalyzer修复源码,Lucene3.6 Jar及使用示例

    IKAnalyzer是一款广受...结合Lucene3.6,开发者可以构建出更精准、高效的中文搜索系统。通过学习和使用这些资料,不仅可以了解IKAnalyzer和Lucene的基础知识,还能掌握如何处理中文文本信息,以及如何优化搜索性能。

    基于lucene3.6平台搜索工具相关包及使用说明

    总结,Lucene 3.6提供了一整套强大的搜索工具,通过理解其核心组件和使用流程,开发者可以构建出高效、灵活的全文搜索引擎。无论是小型项目还是大规模应用,Lucene都能提供稳定且高效的解决方案。在实际应用中,结合...

    lucene3.6实例(索引和查询)

    在网上找了实例,但是发现不能使用,只能简历索引。...lucene3.6版本,能够建立索引,能搜索。inderwriter,indexsearch. 其中包C下的helloword实例能用,其余的全是网上不能用的。直接下载 可以运行

    lucene 3.6

    通过学习 Lucene 3.6,你可以掌握全文检索的核心原理,这对于构建自己的搜索引擎或者在项目中实现高效文本搜索功能至关重要。记得结合源代码分析,加深对概念的理解,同时不断实践,才能更好地掌握这一强大的搜索...

    lucene3.6 的源代码

    总的来说,通过对Lucene 3.6源代码的学习,我们可以深入理解全文检索的底层机制,掌握如何高效地构建、查询和优化搜索系统。这对于开发自己的搜索引擎或者在现有项目中集成搜索功能具有极高的价值。同时,这也有助于...

    lucene3.6+IKAnalyzer2012FF_u1

    在信息技术领域,搜索引擎是数据检索的核心工具,而Lucene作为Apache软件基金会的开源全文搜索引擎库,因其强大的搜索功能和灵活性,被广泛应用于各种项目中。本次我们关注的是Lucene 3.6版本,它在前一版本的基础上...

    lucene3.6的入门案例

    Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询、评分等,广泛应用于各种项目和产品中。在这个入门案例中,我们将深入理解如何使用 Lucene 3.6 版本来构建...

    lucene3.6入门实例教程

    《Lucene 3.6 入门实例教程》是一份专...总之,《Lucene 3.6 入门实例教程》是学习Lucene的理想资源,它将理论知识与实践操作紧密结合,使开发者能够快速掌握全文检索技术,为构建高效、精准的搜索应用打下坚实的基础。

    第一个Lucene 3.6 (3.X) 入门实例

    Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它为Java开发者提供了强大的文本检索功能,广泛应用于搜索引擎、信息检索系统等场景。在3.6版本中,Lucene引入了诸多改进和优化,提高了搜索效率和用户...

    lucene-3.6

    《Lucene 3.6 全文搜索引擎技术详解》 Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。在3.6版本中,Lucene为开发者提供了强大的文本搜索功能,使得在网站或应用程序中实现高效、精确的全文搜索成为...

    lucene3.6源码

    Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护,被广泛应用于各种搜索引擎的构建。Lucene 3.6.1是其历史版本之一,虽然现在有更新的版本,但3.6.1版本因其稳定性及对基础原理的清晰展现,仍然是...

    lucene-3.6.1

    《深入剖析Lucene 3.6.1:搜索引擎构建的核心技术》...总结,Lucene 3.6.1是一个强大的全文检索工具,其核心技术和优化特性使其在搜索引擎开发中不可或缺。通过深入理解和运用,开发者可以创建出高效、精准的搜索系统。

    lucene_3.6.1_API

    Lucene是Apache软件基金会的一个开源项目,它是一个全文搜索引擎库,提供了高性能、可扩展的信息检索服务。Lucene 3.6.1是其历史版本之一,虽然现在有更新的版本,但3.6.1仍具有重要的学习价值,尤其对于那些需要...

Global site tag (gtag.js) - Google Analytics