前言

使用lucene创建索引时如果指定了解析器,则需要读写都使用这个解析器,目前我发现也就是在处理中文这块比较麻烦,像你在使用solr时如果配置了ik分词,则需要把index清空重新创建才能继续搜索。

本篇引用lucene-6.4.0和4.x的几个关键类会有不同的地方。

创建索引

  public void index(){

         Directory dir=null;
Analyzer analyzer=null;
IndexWriterConfig config=null;
IndexWriter indexWriter=null;
try{
/**
* SimpleFSDirectory 不能很好支持多线程操作
* **/
dir =new SimpleFSDirectory(Paths.get(INDEX_URL)); analyzer=new StandardAnalyzer();
config =new IndexWriterConfig(analyzer);
/**
* IndexWriter(Directory d,IndexWriterConfig config)
* **/
indexWriter =new IndexWriter(dir,config); indexWriter.deleteAll();
List<UploadBook> books =bookDao.listAllBooks();
Document document=null; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for(UploadBook book:books){
document=new Document();
document.add(new Field("id",book.getId().toString(), TextField.TYPE_STORED));
document.add(new Field("ip",book.getIp(), TextField.TYPE_STORED));
document.add(new Field("title",book.getOriginFileName(), TextField.TYPE_STORED)); document.add(new Field("content", PdfReader.read(INDEX_PDF+book.getNewFileName()),TextField.TYPE_STORED));
document.add(new Field("createtime",formatter.format(book.getCreateTime()), TextField.TYPE_STORED)); indexWriter.addDocument(document);
} indexWriter.commit(); System.out.println("======索引创建完成,公创建"+books.size()+"条索引========");
}catch (IOException ex){
ex.printStackTrace();
}
catch(Exception ex){
ex.printStackTrace();
}finally {
if(indexWriter !=null){
try{
indexWriter.close();
}catch (IOException ex){
System.out.println("======indexWriter close exception========");
}
}
} }

读取索引

  public static List<Book> search2(String kw){
Directory dir=null;
Analyzer analyzer=null;
List<Book> list = new ArrayList<Book>();
try{
dir= FSDirectory.open(Paths.get("e:\\soso\\index"));
analyzer=new StandardAnalyzer(); DirectoryReader reader =DirectoryReader.open(dir);
IndexSearcher searcher=new IndexSearcher(reader); QueryParser parser=new QueryParser("content",analyzer);
Query query =parser.parse(kw); ScoreDoc[] docs=searcher.search(query,100).scoreDocs; for (int i = 0; i < docs.length; i++) {
Document firstHit = searcher.doc(docs[i].doc); Book book=new Book();
book.setId(Integer.parseInt(firstHit.getField("id").stringValue()));
book.setIp(firstHit.getField("ip").stringValue()); String title=firstHit.getField("title").stringValue();
title=title.substring(0,title.lastIndexOf("."));
book.setTitle(title); String content=firstHit.getField("content").stringValue();
if(content.length()>=500){
content=content.substring(0,500)+"......";
}
book.setContent(content); SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-mm");
Date date =format.parse(firstHit.getField("createtime").stringValue());
book.setCreateTime(format.format(date)); list.add(book); } }catch(Exception ex){ }finally {
try{
dir.close(); }catch(IOException ex){
ex.printStackTrace();
}
} return list;
}

Lucene实战之基于StandardAnalyzer读写索引的更多相关文章

  1. Lucene实战构建索引

    搭建lucene的步骤这里就不详细介绍了,无外乎就是下载相关jar包,在eclipse中新建java工程,引入相关的jar包即可 本文主要在没有剖析lucene的源码之前实战一下,通过实战来促进研究 ...

  2. lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3

    前言:上一章中我们已经实现了索引器的创建,但是我们没有索引文档,本章将会讲解如何生成字段.创建索引文档,给字段加权以及保存文档到索引器目录 luncene5.5.3集合jar包下载地址:http:// ...

  3. Lucene实战之初体验

    前言 最早做非结构化数据搜索时用的还是lucene.net,一直说在学习java的同时把lucene这块搞一搞,这拖了2年多了,终于开始搞这块了. 开发环境 idea2016.lucene6.0.jd ...

  4. Lucene实战(第2版)》

    <Lucene实战(第2版)>基于Apache的Lucene 3.0,从Lucene核心.Lucene应用.案例分析3个方面详细系统地介绍了Lucene,包括认识Lucene.建立索引.为 ...

  5. 3.2 Lucene实战:一个简单的小程序

    在讲解Lucene索引和检索的原理之前,我们先来实战Lucene:一个简单的小程序! 一.索引小程序 首先,new一个java project,名字叫做LuceneIndex. 然后,在project ...

  6. 深度学习实战篇-基于RNN的中文分词探索

    深度学习实战篇-基于RNN的中文分词探索 近年来,深度学习在人工智能的多个领域取得了显著成绩.微软使用的152层深度神经网络在ImageNet的比赛上斩获多项第一,同时在图像识别中超过了人类的识别水平 ...

  7. C++ MFC实现基于RFID读写器的上位机软件

    C++ MFC实现基于RFID读写器的上位机软件 该博客涉及的完整工程托管在https://github.com/Wsine/UpperMonitor,觉得好请给个Star (/▽\=) 运行和测试环 ...

  8. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...

  9. R语言实战实现基于用户的简单的推荐系统(数量较少)

    R语言实战实现基于用户的简单的推荐系统(数量较少) a<-c(1,1,1,1,2,2,2,2,3,3,3,4,4,4,5,5,5,5,6,6,7,7) b<-c(1,2,3,4,2,3,4 ...

随机推荐

  1. 词向量之word2vec实践

    首先感谢无私分享的各位大神,文中很多内容多有借鉴之处.本次将自己的实验过程记录,希望能帮助有需要的同学. 一.从下载数据开始 现在的中文语料库不是特别丰富,我在之前的文章中略有整理,有兴趣的可以看看. ...

  2. foreach退出循环(新人请多多关照~)

    今天做一个关于人员信息修改的页面时,我用foreach获取数据库数据时发现,用if else判断输入的内容时,会一个一个的做对比,导致错误提醒时会弹出与数据库内容行数相同条的提醒,最后发现将数据直接命 ...

  3. 获取IP地址方法

    function getip() {     static $ip = '';     $ip = $_SERVER['REMOTE_ADDR'];     if(isset($_SERVER['HT ...

  4. MYSQL 开发总结

    1.mysql中,VARCHAR(N)中的N代表的是字符数,而不是字节数.例如VARCHAR(255)表示可以保存255的中文 2.过大的长度会消耗更多的内存.VARCHAR(N),存储时是按照数据实 ...

  5. IDEA中MyBaits的Mapper文件颜色问题

    IDEA中MyBaits的Mapper文件颜色问题 在IDEA中Mapper文件的展示 包含的警告及其解决方案 然后我们就完成了,效果如下 在IDEA中Mapper文件的展示 在IDEA中,Mappe ...

  6. 启动 mysql 时报错

    通过mysql -u用户名 -p密码 的命令连接 Mysql数据库时 报错 "can't connect to local mysql serverthrough  socket'/var/ ...

  7. samba 配置文件解析

    [global] #定义全局策略 workgroup=MYGROUP #定义工作组 netbios name=MYSERVER #指定NetBios名称 interfaces=lo 192.168.1 ...

  8. ES6-字符串扩展-padStart(),padEnd()

    ES6 引入了字符串补全长度的功能,如果某个字符串不够指定长度,会在头部活尾部补全. padStart() 用于头部补全: padEnd() 用于尾部补全. 上面代码中,padStart 和 padE ...

  9. Spring事务管理(详解+实例)

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  10. 周末,说声php的setter&getter(魔术)方法,你们辛苦了

    php 作为快速迭代项目的语言,其牛逼性质自不必多说.今天咱们要来说说php语言几个魔术方法,当然了,本文主要以setter&getter方法说明为主. 首先,咱们得知道什么叫魔术方法? 官方 ...