文档章节

Lucene 心得

 挨踢精英
发布于 2015/01/09 17:27
字数 836
阅读 14
收藏 0
public void createIndex1(Connection conn, AttachInfoDTO1 main) throws SQLException {
  //定义
  IndexWriter writer = null;
  //文件路径
  Directory directory = null;
  // 索引文件夹
  File dir = new File("PICCAssets/index");
  String path = dir.getAbsolutePath();
  String path1 = path.replace("bin", "webapps");
  try {
   directory = FSDirectory.open(new File(path1));
   writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new IKAnalyzer()));
   Document doc = null;
   File f = null;
   InputStream br = null;
   if (main != null) {
    int fileid = main.getId();
    String dname = main.getFileUrl();
    String rname = "http://192.168.1.10:8080/PICCAssets/" + dname;
    FtpTask ftp = new FtpTask();
    String path11 = dname.substring(0, dname.lastIndexOf("/") + 1);
    String file = dname.substring(dname.lastIndexOf("/") + 1);
    ftp.connectServer(path11);
    br = );
      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    String author = main.getStaffName();
    if ((author == null) || (("").equals(author))) {
     author = "系统管理员";
    }
    doc = new Document();
    Metadata metadata = new Metadata();
    doc.add(new Field("content", new Tika().parseToString(br), Field.Store.YES, Field.Index.ANALYZED, TermVector.WITH_POSITIONS_OFFSETS));
    doc.add(new Field("title", main.getAttachName(), Field.Store.YES, Field.Index.ANALYZED, TermVector.WITH_POSITIONS_OFFSETS));
    doc.add(new Field("author", author, Field.Store.YES, Field.Index.ANALYZED, TermVector.WITH_POSITIONS_OFFSETS));
    doc.add(new Field("rid", Integer.toString(main.getId()), Field.Store.YES, Field.Index.ANALYZED, TermVector.WITH_POSITIONS_OFFSETS));
    doc.add(new Field("filename", main.getAttachName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
    doc.add(new Field("path", dname, Field.Store.YES, Field.Index.NOT_ANALYZED));
    doc.add(new Field("dpath", rname, Field.Store.YES, Field.Index.NOT_ANALYZED));
    doc.add(new Field("dtype", main.getFileTypeLever1(), Field.Store.YES, Field.Index.NOT_ANALYZED));
    doc.add(new Field("date",  main.getUploadDate(), Field.Store.YES, Field.Index.NOT_ANALYZED));
    int page = 0;
    try {
     page = Integer.parseInt(metadata.get("xmpTPg:NPages"));
    } catch (NumberFormatException e) {
    }
    if (doc != null) {
     try {
      writer.addDocument(doc);
     } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
     }
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  } finally {
   if (writer != null) {
    try {
     writer.close();
    } catch (CorruptIndexException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }

删除全部索引

 /**
  * 删除全部索引
  * 
  * @throws Exception
  */
 public void deleteAllIndex() throws Exception {
  IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
  IndexWriter indexWriter = new IndexWriter(FileIndexUtils.getDirectory(), config);
  indexWriter.deleteAll();
  indexWriter.close();
 }

删除单个索引

/**
  * 删除单个索引
  * 
  * @throws Exception
  */
 public void deleteOneIndex(String uid) throws Exception {
  IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
  IndexWriter indexWriter = new IndexWriter(FileIndexUtils.getDirectory(), config);
  indexWriter.deleteDocuments(new Term("rid", uid));
  indexWriter.close();
 }

//高亮查询索引对应的文档 以及组合查询

@SuppressWarnings({ "rawtypes", "unused" })
 public PagerDTO<LuceneDTO> searchPage(String key, int starttime, int endtime, String dtype, int pageIndex, int pageSize) { // String
  Analyzer luceneAnalyzer = new IKAnalyzer();
  PagerDTO<LuceneDTO> pages = new PagerDTO<LuceneDTO>();
  List<LuceneDTO> l = new ArrayList<LuceneDTO>();
  LuceneDTO bean = null;
  try {
   // 索引文件夹
   IndexSearcher searcher = new IndexSearcher(IndexReader.open(FileIndexUtils.getDirectory()));
   BooleanQuery query0 = new BooleanQuery();
   // 日期区间
   NumericRangeQuery q2 = NumericRangeQuery.newIntRange("date", starttime, endtime, true, true);
   // 关键字查询
   MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_35, new String[] { "title", "content" }, luceneAnalyzer);
   if (key == null || "".equals(key)) {
    query0.add(new TermQuery(new Term("dtype", dtype)), Occur.SHOULD);
   } else {
    Query queryKey = parser.parse(key);
    query0.add(new TermQuery(new Term("dtype", dtype)), Occur.MUST);
    query0.add(queryKey,  Occur.MUST);
   }
   // 先获取上一页的最后一个元素
   ScoreDoc lastSd = getLastScoreDoc(pageIndex, pageSize, query0, searcher);
   // 通过最后一个元素搜索下页的pageSize个元素
   TopDocs tds = searcher.searchAfter(lastSd, query0, pageSize);
   int totalRecord = tds.totalHits;
   // 搜素开始时间
   Date beginTime = new Date();
   for (ScoreDoc sd : tds.scoreDocs) {
    Document doc = searcher.doc(sd.doc);
    String path = doc.get("path");
    String filen = path.split("/")[2];
    String filename = filen.substring(0, filen.lastIndexOf(".")) + ".swf";
    /**
     * 按照http远程读取文件方式,没有储存在索引上
     */
    String content = doc.get("content");
    String htitle = doc.get("title");
    QueryScorer scorer = new QueryScorer(query0);
    Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);
    Formatter formatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");
    Highlighter lighter = new Highlighter(formatter, scorer);
    lighter.setTextFragmenter(fragmenter);
    // 设置高亮字数多少
    lighter.setTextFragmenter(new SimpleFragmenter(200));
    /*
     * 设置高亮,如果有关键字就加亮,没有就返回空,所以要加判断
     */
    String str = lighter.getBestFragment(luceneAnalyzer, "f", content);
    String titlel = lighter.getBestFragment(luceneAnalyzer, "s", htitle);
    bean = new LuceneDTO();
    if (titlel != null) {
     bean.setTitle(titlel);
    } else {
     bean.setTitle(htitle);
    }
    if (str != null) {
     bean.setStr(str);
    } else {
     if (content.length() != 0 && content.length() > 250) {
      String content1 = content.substring(0, 250);
      bean.setStr(content1);
     } else {
      bean.setStr(content);
     }
    }
    bean.setDate(doc.get("date"));
    bean.setType(doc.get("title").substring(doc.get("title").lastIndexOf(".") + 1));
    bean.setPath(doc.get("author"));
    bean.setFilename(filename);
    bean.setDpath(doc.get("dpath"));
    bean.setRid(doc.get("rid"));
    l.add(bean);
   }
   // 搜索完成时间
   Date endTime = new Date();
   DecimalFormat format = new DecimalFormat("0.000");
   double timeOfSearch = (endTime.getTime() - beginTime.getTime()) * 0.001;
   int totalPage = (totalRecord - 1) / pageSize + 1;
   pages.setTimeOfSearch(format.format(timeOfSearch));
   pages.setTotalPage(totalPage);
   pages.setTotalRecord(totalRecord);
   pages.setPageIndex(pageIndex);
   pages.setPageSize(pageSize);
   pages.setDatas(l);
   searcher.close();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (InvalidTokenOffsetsException e) {
   e.printStackTrace();
  } catch (ParseException e) {
   e.printStackTrace();
  }
  return pages;
 }
/**
  * 根据页码和分页大小获取上一次的最后一个ScoreDoc
  */
 private ScoreDoc getLastScoreDoc(int pageIndex, int pageSize, Query query, IndexSearcher searcher) throws IOException {
  if (pageIndex == 1)
   return null;// 如果是第一页就返回空
  int num = pageSize * (pageIndex - 1);// 获取上一页的数量
  TopDocs tds = searcher.search(query, num);
  return tds.scoreDocs[num - 1];
 }

© 著作权归作者所有

粉丝 2
博文 32
码字总数 8431
作品 0
株洲
私信 提问
Lucene 3.0.0 的TokenStream与Analyzer

如果你看的Lucene相关的书是很老版本的, 比如说2.4或者更早, 那么对于这个版本中的Analyzer可能就不那么容易接受了, 我也是看的这本书, 比较古老的版本. 今天读了一下源代码, 大概说说心得,...

红薯
2010/01/18
2.4K
2
服务器(3)--搭建单机版Solr服务器+配置中文分析器

背景:学习到Solr这部分内容,整理一下思路,这篇文章重点介绍了一下单机版的Solr服务器的搭建过程,还有中文分析器的配置,下一篇文章中重点介绍Solr集群的搭建步骤。 一、Solr Solr是一个独...

u013043341
2017/05/29
0
0
当ES赶超Redis,这份ES进修攻略不容错过!

从4月DB-Engines最新发布的全球数据库排名中,我们赫然发现ElasticSearch逆袭超越了Redis,从原先的第9名上升至第8名,而Redis则落后一名,排在了其后。 事实上,这场逆袭并不算太让人意外。...

DBAplus社群
2018/04/15
0
0
lucene 6.0 常用类与方法

1.目录 org.apache.lucene.store.Directory 指定索引所在目录。 org.apache.lucene.store.RAMDirectory 存放于内存中的目录。 org.apache.lucene.store.RAMDirectory.RAMDirectory(FSDirect......

OSC一霸
2016/07/12
207
0
Lucene 5.1.0 发布,Java 搜索引擎

Lucene 5.1.0 发布,此版本现已提供在:http://www.apache.org/dyn/closer.cgi/lucene/java/5.1.0。 更新内容如下: 新特性 (9) LUCENE-6066: Added DiversifiedTopDocsCollector to misc f......

chaun
2015/06/03
3K
12

没有更多内容

加载失败,请刷新页面

加载更多

Node.getTextContent() not found 解决办法【不需要调整builder path下面包顺序】

新导入的工程,w3c的getTextContent找不到,response的setCharacterEncoding找不到,网上很多教程都是“调整工程builder path的lib包顺序把jre、tomcat调到上面即可”,但是进入项目的build...

嘿嘿嘿IT
15分钟前
0
0
全站加速(DCDN)- IP应用加速产品解读

5月22日下午15点,阿里云全站加速(DCDN)-IP应用加速如期发布。IP应用加速是阿里云自主研发的一款更高效、更安全、更便捷的动态加速产品,结合阿里云CDN本身的资源优势,利用就近接入、智能...

zhaowei121
29分钟前
0
0
一次奇怪的StackOverflowError问题查找之旅

一次奇怪的StackOverflowError问题查找之旅 公司最近买了一套老代码,在测试环境部署的时候发生了nested exception is java.lang.StackOverflowError的异常,当时看到这个异常首先想到是栈内...

不学无数的程序员
33分钟前
1
0
我为什么飞行 10000 公里去西班牙参加 KubeCon?

2019 年 5 月 20 日至 23 日, 由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 KubeCon + CloudNativeCon EU(欧洲场)即将在热情洋溢的巴塞罗那盛装启幕。 作为云计算领...

阿里云官方博客
37分钟前
0
0
奇技淫巧之判断入参是否为undefined

前言 作为一个程序员,coding是每天必做的事情之一,今天埃尔斯在阅读腾讯AlloyTeam 的一个开源项目AlloyTouch,发现了一个有意思的小技巧,就是对undefined的精准判断。源码地址:https://g...

菜菜行进中
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部