实现效果:创建索引后可以模糊检索或者文件检索
实现过程
1.引入坐标
<!--lucene strat-->
<!--核心包-->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>7.6.0</version>
</dependency>
<!--对分词索引查询解析-->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>7.6.0</version>
</dependency>
<!--检索关键字高亮显示 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>7.6.0</version>
</dependency>
<dependency>
<groupId>com.jianggujin</groupId>
<artifactId>IKAnalyzer-lucene</artifactId>
<version>8.0.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2.前端代码
创建索引请求后台:url: baseURL + "lucene/synLuceneArchiveCreatIndex?_" + $.now(),
删除索引后台:url: baseURL + "lucene/deleteLuceneArchiveIndexAll?_" + $.now(),
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>全文检索</title>
<#include "/header.html">
<link rel="stylesheet" type="text/css" href="${request.contextPath}/statics/css/ry-ui.css"/>
<link rel="stylesheet" type="text/css" href="${request.contextPath}/statics/libs/jquery-layout/jquery.layout-latest.css"/>
<link rel="stylesheet" type="text/css" href="${request.contextPath}/statics/plugins/My97DatePicker/skin/WdatePicker.css">
<script src="${request.contextPath}/statics/plugins/boot/js/lrz.all.bundle.js"></script>
<script src="${request.contextPath}/statics/libs/jquery-layout/jquery.layout-latest.js"></script>
</head>
<style>
a {
color: #000000;
text-align: center;
}
.nav-tabs>li.active>a{
background-color: #EEEEEE !important;
}
.ui-jqgrid .ui-jqgrid-bdiv {
height: 420px !important;
}
.ui-paging-info{
display: none!important;;
}
</style>
<body>
<ul class="nav nav-tabs">
<li class="active" style="width:100%;"><a href="#home" data-toggle="tab" onclick="likeReload()">模糊查询</a></li>
</ul>
<div id="rrapp" v-cloak>
<div class="tab-content">
<div class="tab-pane active" id="home" style="padding-top: 10px;">
<div class="grid-btn">
<div class="form-group col-sm-2">
<input type="text" class="form-control" v-model="q.searchWord" placeholder="关键字">
</div>
<#if shiro.hasPermission("archive:archiveinfo:luceneList")>
<a class="btn btn-primary" @click="queryType">模糊检索(全目录)</a>
<a class="btn btn-primary" @click="queryArchiveTitle">题名检索</a>
<a class="btn btn-primary" @click="queryArchiveNo">档号检索</a>
<!-- <a class="btn btn-primary" @click="clearkey">重置</a>-->
<a class="btn btn-primary" @click="queryFile">文件检索</a>
</#if>
<a class="btn btn-info" @click="add">
<i class="fa fa-paper-plane"></i>重新创建索引
</a>
<a class="btn btn-danger btn-del" @click="del">
<i class="fa fa-remove"></i> 删除索引
</a>
</div>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="jqGrid"></table>
<div id="jqGridPager"></div>
</div>
</div>
</div>
<script type="text/javascript" src="${request.contextPath}/statics/plugins/My97DatePicker/WdatePicker.js?v=4.8"></script>
<script src="${request.contextPath}/statics/js/modules/lucene/lucene.js?_${.now?long}"></script>
</body>
</html>
var ztreeDept;
var vm = new Vue({
el: '#rrapp',
data: {
archiveInfo: {},
q: {
searchKeyStr: '',
archiveTitle:'',
archiveNo:'',
archiveFile:'',
},
qClasss: [
{text: '所有', value: ''}
],
qRetentions: [
{text: '所有', value: ''}
],
},
methods: {
clearkey: function () {
vm.q.archiveFile=vm.q.searchKeyStr = vm.q.archiveTitle = vm.q.archiveNo = vm.q.searchWord = '';
$("#jqGrid").setGridParam().hideCol("content");
vm.reload();
},
queryArchiveTitle: function () {
vm.showList = true;
vm.q.archiveTitle = vm.q.searchWord;
vm.q.archiveFile=vm.q.searchKeyStr = vm.q.archiveNo = '';
$("#jqGrid").setGridParam().hideCol("content");
vm.reload();
},
queryArchiveNo: function () {
vm.showList = true;
vm.q.archiveNo = vm.q.searchWord;
vm.q.archiveFile=vm.q.searchKeyStr = vm.q.archiveTitle = '';
$("#jqGrid").setGridParam().hideCol("content");
vm.reload();
},
queryType: function () {
vm.showList = true;
vm.q.searchKeyStr = vm.q.searchWord;
vm.q.archiveFile=vm.q.archiveTitle = vm.q.archiveNo = '';
$("#jqGrid").setGridParam().showCol("content");
vm.reload();
},
queryFile: function(){
vm.showList = true;
vm.q.archiveFile = vm.q.searchWord;
vm.q.searchKeyStr=vm.q.archiveTitle = vm.q.archiveNo = '';
$("#jqGrid").setGridParam().showCol("content");
vm.reload();
},
reload: function () {
vm.showList = true;
var page = $("#jqGrid").jqGrid('getGridParam', 'page');
$("#jqGrid").jqGrid('setGridParam', {
postData: {'searchKeyStr': vm.q.searchKeyStr,'archiveTitle':vm.q.archiveTitle,'archiveNo':vm.q.archiveNo,'archiveFile':vm.q.archiveFile},
page: 1
}).trigger("reloadGrid");
},
doSearch: function () {
vm.showList = true;
$("#jqGrid").jqGrid('setGridParam', {
postData: {'searchKeyStr': vm.q.searchKeyStr,'archiveTitle':vm.q.archiveTitle,'archiveNo':vm.q.archiveNo,'archiveFile':vm.q.archiveFile},
page: 1
}).trigger("reloadGrid");
},
reFresh: function () {
vm.q.searchKeyStr = '';
vm.q.archiveTitle = '';
vm.q.archiveNo = '';
vm.q.archiveFile='',
vm.doSearch();
},
add: function () {//提交编辑信息 url: baseURL + 'lucene/searchLuceneArchive',
$("#jqGrid").setGridParam().hideCol("content");
var _this = this;
layer.load(2);
$.ajax({
type: "POST",
url: baseURL + "lucene/synLuceneArchiveCreatIndex?_" + $.now(),
contentType: "application/json",
data: [],
success: function (r) {
layer.closeAll("loading");
if (r.code == 0) {
alert('操作成功', function (index) {
$("#jqGrid").trigger("reloadGrid");
});
} else {
alert(r.msg);
}
},
error: function () {
layer.closeAll("loading");
layer.closeAll("loading");
layer.alert("创建失败");
}
});
},
del: function () {//提交编辑信息 url: baseURL + 'lucene/searchLuceneArchive',
$("#jqGrid").setGridParam().hideCol("content");
var _this = this;
layer.load(2);
$.ajax({
type: "POST",
url: baseURL + "lucene/deleteLuceneArchiveIndexAll?_" + $.now(),
contentType: "application/json",
data: [],
success: function (r) {
layer.closeAll("loading");
if (r.code == 0) {
alert('操作成功', function (index) {
$("#jqGrid").trigger("reloadGrid");
});
} else {
alert(r.msg);
}
},
error: function () {
layer.closeAll("loading");
layer.closeAll("loading");
layer.alert("操作失败");
}
});
},
},
created: function () {
}
});
function likeReload() {
vm.q.searchKeyStr = vm.q.archiveTitle = vm.q.archiveNo =vm.q.archiveFile= vm.q.searchWord = '';
vm.clearkey();
}
function cardReload() {
vm.q.searchKeyStr = vm.q.archiveTitle = vm.q.archiveNo =vm.q.archiveFile= vm.q.searchWord = '';
vm.reFresh();
}
/
$(function () {
$("#jqGrid").jqGrid({
url: baseURL + 'lucene/searchLuceneArchive',
datatype: "json",
colModel:[
{label: 'id', name: 'id', index: 'id', width: 150, key: true, hidden: true},
{label: 'archiveCatalog', name: 'archiveCatalog', index: 'archiveCatalog', width: 100,hidden: true},
{
label: '档案分类',
name: 'tableType',
index: 'tableType',
width: 200,
sortable: false,
formatter: function (value, options, row) {
if (value == 'ws_info') {
return '<span class="label label-success">文书档案--简化方法整理</span>';
} else if (value == 'ws_ajinfo') {
return '<span class="label label-success">文书档案--传统方法整理(案卷)</span>';
} else if (value == 'ws_jninfo') {
return '<span class="label label-success">文书档案--传统方法整理(卷内)</span>';
} else if (value == 'ht_info') {
return '<span class="label label-success">合同档案</span>';
} else if (value == 'kj_info') {
return '<span class="label label-success">会计档案</span>';
} else if (value == 'jj_ajinfo') {
return '<span class="label label-success">基建档案--基建档案(案卷)</span>';
} else if (value == 'jj_jninfo') {
return '<span class="label label-success">基建档案--基建档案(卷内)</span>';
} else if (value == 'kej_info') {
return '<span class="label label-success">科技档案--科技档案(项目)</span>';
} else if (value == 'kej_ajinfo') {
return '<span class="label label-success">科技档案--科技档案(案卷)</span>';
} else if (value == 'kej_jninfo') {
return '<span class="label label-success">科技档案--科技档案(卷内)</span>';
} else if (value == 'sx_info') {
return '<span class="label label-success">声像档案(案卷)</span>';
} else if (value == 'sx_jninfo') {
return '<span class="label label-success">声像档案(卷内)</span>';
}else if (value == 'rs_info') {
return '<span class="label label-success">人事档案</span>';
} else if (value == 'sw_info') {
return '<span class="label label-success">实物档案</span>';
} else if (value == 'zidingyidangan') {
return '<span class="label label-success">自定义档案</span>';
} else if (value == 'jj_info') {
return '<span class="label label-success">基建档案--基建工程档案</span>';
} else {
return '<span class="label label-success">' + value + '</span>';
}
}
},
{label: '题名', name: 'archiveTitle', index: 'archiveTitle', sortable: false,width: 300},
{label: '档号', name: 'archiveNo', index: 'archiveNo', sortable: false,width: 200},
{label: '归档年度', name: 'filingYear', index: 'filingYear', sortable: false,width: 100},
{label: '责任者', name: 'responsibleBy', index: 'responsibleBy',sortable: false, width: 100},
{label: '存放位置', name: 'folderLocation', index: 'folderLocation', sortable: false,width: 200},
{
label: '状态', name: 'status', index: 'status', width: 100, sortable: false,formatter: function (value, options, row) {
if (value == 1) {
return '<span class="label label-success">正常</span>';
} else if (value == 2) {
return '<span class="label label-success">失效</span>';
} else if (value == 3) {
return '<span class="label label-danger">待销毁</span>';
} else if (value == 4) {
return '<span class="label label-danger">已销毁</span>';
}
}
},
{label: '检索内容', name: 'content', index: 'content', width: 850,sortable: false,hidden:true},
],
viewrecords: true,
multiboxonly: true,
altRows: true,
rowNum: 10,
rowList: [10, 30, 50],
rownumbers: true,
rownumWidth: 25,
autowidth: false,
shrinkToFit: false,
autoScroll: true, //开启水平滚动条
pager: "#jqGridPager",
jsonReader: {
root: "page.list",
page: "page.currPage",
total: "page.totalPage",
records: "page.totalCount"
},
prmNames: {
page: "page",
rows: "limit",
order: "order"
},
postData: {'searchKeyStr': vm.q.searchKeyStr,'archiveTitle':vm.q.archiveTitle,'archiveNo':vm.q.archiveNo,'archiveFile':vm.q.archiveFile},
gridComplete: function () {
},
onSelectRow: function (rowId, status) {
},
ondblClickRow: function (rowId, iRow, iCol, e) {
var row = $("#jqGrid").jqGrid('getRowData', rowId);
var id = row.id;
if (id == null) {
return;
}
var tableType = row.tableType;
var archiveCatalog = row.archiveCatalog;
var _this = this;
var htmlName = '';
if (archiveCatalog == 'ws_info') {
htmlName = 'archiveinfo_addws.html';
} else if (archiveCatalog == 'ws_ajinfo') {
htmlName = 'archiveinfo_addwsaj.html';
} else if (archiveCatalog == 'ws_jninfo') {
htmlName = 'archiveinfo_addwsjn.html';
} else if (archiveCatalog == 'ht_info') {//合同
htmlName = 'archiveinfo_addht.html';
} else if (archiveCatalog == 'kj_zb') {
htmlName = 'archiveinfo_addkj_zb.html';
} else if (archiveCatalog == 'kj_pz') {
htmlName = 'archiveinfo_addkj.html';
} else if (archiveCatalog == 'kj_bb') {
htmlName = 'archiveinfo_addkj_bb.html';
} else if (archiveCatalog == 'kj_sjbg') {
htmlName = 'archiveinfo_addkj_sjbg.html';
} else if (archiveCatalog == 'jj_info') {//基建工程档案
htmlName = 'archiveinfo_addjj.html';
} else if (archiveCatalog == 'jj_ajinfo') {//基建(案卷)
htmlName = 'archiveinfo_addjjaj.html';
} else if (archiveCatalog == 'jj_jninfo') {//基建(卷内)
htmlName = 'archiveinfo_addjjjn.html';
} else if (archiveCatalog == 'kej_info') {//科技档案
htmlName = 'archiveinfo_addKeji.html';
} else if (archiveCatalog == 'kej_ajinfo') {//科技档案(案卷)
htmlName = 'archiveinfo_addKejiaj.html';
} else if (archiveCatalog == 'kej_jninfo') {//科技档案(卷内)
htmlName = 'archiveinfo_addKejijn.html';
} else if (archiveCatalog == 'sx_info') {//声像档案
htmlName = 'archiveinfo_addsx.html';
} else if (archiveCatalog == 'sx_jninfo') {//声像档案(卷内)
htmlName = 'archiveinfo_addsxjn.html';
}else if (archiveCatalog == 'rs_info') {//人事档案
htmlName = 'archiveinfo_addrs.html';
}else if (archiveCatalog == 'sw_info') {//实物档案
htmlName = 'archiveinfo_addsw.html';
} else if (archiveCatalog == 'zidingyidangan') {//自定义档案
htmlName = 'archiveinfo_addcustom.html';
}
if(htmlName==''){layer.open({time:1000,content:'无具体信息'});return;}
var murl = baseURL + "modules/archive/" + htmlName + "?doWork=NO&archiveId=" + id + "&_" + $.now();
layer.open({
type: 2,
offset: 'auto',
skin: 'layui-layer-lan',
title: tableType + " + 信息查看",
area: ['100%', '100%'],
shade: 0.3,
shadeClose: false,
content: murl,
end: function () {
}
});
}
});
$(window).resize(function () {
$("#jqGrid").setGridWidth($(window).width());
});
function goResize() {
$("#jqGrid").setGridWidth($(window).width() - 20);
}
function goResizeEx() {
$("#jqGrid").setGridWidth($(window).width() - 20);
}
$("#jqGrid").setGridWidth($(window).width() - 20);
$("#jqGrid").setGridHeight($(window).height() - 50);
});
/
//
//
function pickedBeginTime() {
$dp.$('beginTime').value = $dp.cal.getNewDateStr();
vm.q.beginTime = $dp.cal.getNewDateStr();
}
//
function pickedEndTime() {
$dp.$('endTime').value = $dp.cal.getNewDateStr();
vm.q.endTime = $dp.cal.getNewDateStr();
}
3.后台代码
Controller代码块
@RequestMapping("/searchLuceneArchive")
private R searchLuceneArchive(@RequestParam Map<String, Object> params) throws IOException, ParseException {
PageUtils page = service.searchLuceneArchive(params);
return R.ok().put("page", page);
}
/**
* @param
* @return
* @throws ParseException
* @throws IOException
*/
@RequestMapping("/synLuceneArchiveCreatIndex")
@Transactional
private R synLuceneArchiveCreatIndex() throws IOException, ParseException {
service.deleteLuceneArchiveIndexAll();
service.analyzingTemplate();
service.synLuceneArchiveCreatIndex();
return R.ok();
}
/**
* @param
* @return
* @throws ParseException
* @throws IOException
*/
@RequestMapping("/deleteLuceneArchiveIndexAll")
private R deleteLuceneArchiveIndexAll() throws IOException, ParseException {
service.deleteLuceneArchiveIndexAll();
return R.ok();
}
service层
package com.framework.modules.lucene.service;
import com.framework.common.utils.PageUtils;
import java.io.IOException;
import java.util.Map;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.StatementType;
import org.apache.lucene.queryparser.classic.ParseException;
import org.springframework.data.repository.query.Param;
public interface ILuceneService {
/**
* 启动后将同步LuceneArchive表,并创建index
* @throws IOException
*/
public void synLuceneArchiveCreatIndex() throws IOException;
public PageUtils searchLuceneArchive(Map<String, Object> params) throws IOException, ParseException;
public void deleteLuceneArchiveIndexAll() throws IOException;
/**
* 获取档号总数
* @param params
* @return
*/
public int countObject(Map<String, Object> params);
public String analyzingTemplate();
}
package com.framework.modules.lucene.service.impl;
import com.baomidou.mybatisplus.plugins.Page;
import com.framework.common.utils.PageUtils;
import com.framework.common.utils.Query;
import com.framework.modules.lucene.dao.ILuceneDao;
import com.framework.modules.lucene.entity.LuceneArchive;
import com.framework.modules.lucene.entity.LuceneArchiveAnnex;
import com.framework.modules.lucene.mapper.LuceneArchiveAnnexMapper;
import com.framework.modules.lucene.mapper.LuceneArchiveMapper;
import com.framework.modules.lucene.service.ILuceneService;
import org.apache.lucene.queryparser.classic.ParseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class LuceneServiceImpl implements ILuceneService {
@Autowired
private ILuceneDao luceneDao;
@Autowired
private LuceneArchiveMapper mapper;
@Autowired
private LuceneArchiveAnnexMapper annexmapper;
@Override
public void synLuceneArchiveCreatIndex() throws IOException {
List<LuceneArchive> allLuceneArchive = mapper.getAllLuceneArchive();
List<LuceneArchiveAnnex> allLuceneAnnexArchive = annexmapper.getAllLuceneArchiveAnnex();
luceneDao.createLuceneArchiveIndex(allLuceneAnnexArchive,allLuceneArchive);
}
@Override
public PageUtils searchLuceneArchive(Map<String, Object> params) throws IOException, ParseException {
Page<LuceneArchive> page = new Query<LuceneArchive>(params).getPage();
List<LuceneArchive> list = this.luceneDao.searchLuceneArchive(page ,params);
page.setRecords(list);
return new PageUtils(page);
}
@Override
public void deleteLuceneArchiveIndexAll() throws IOException {
luceneDao.deleteLuceneArchiveIndexAll();
}
@Override
public int countObject(Map<String, Object> params) {
return mapper.countObject(params);
}
@Override
public String analyzingTemplate() {
return mapper.analyzingTemplate();
}
}
dao层
package com.framework.modules.lucene.dao;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.framework.modules.lucene.entity.LuceneArchive;
import com.framework.modules.lucene.entity.LuceneArchiveAnnex;
import org.apache.lucene.queryparser.classic.ParseException;
import org.springframework.data.repository.query.Param;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public interface ILuceneDao {
/**
* 创建索引
* @param luceneArchiveList
* @throws IOException
*/
public void createLuceneArchiveIndex(List<LuceneArchiveAnnex> luceneAnnexArchiveList, List<LuceneArchive> luceneArchiveList) throws IOException;
/**
* 查询索引
* @param page
* @return
* @throws IOException
* @throws ParseException
*/
public List<LuceneArchive> searchLuceneArchive(Pagination page , @Param("params") Map<String, Object> params) throws IOException, ParseException;
/**
* 添加一个新索引
* @param luceneArchive
* @throws IOException
*/
public void addLuceneArchiveIndex(LuceneArchive luceneArchive) throws IOException;
/**
* 通过id删除商品索引
* @param id
* @throws IOException
*/
public void deleteLuceneArchiveIndexById(String id) throws IOException;
/**
* 删除全部索引
* @param
* @throws IOException
*/
public void deleteLuceneArchiveIndexAll() throws IOException;
}
package com.framework.modules.lucene.dao.impl;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.framework.common.config.SysBaseConfig;
import com.framework.modules.lucene.config.LuceneConfig;
import com.framework.modules.lucene.dao.ILuceneDao;
import com.framework.modules.lucene.entity.LuceneArchive;
import com.framework.modules.lucene.entity.LuceneArchiveAnnex;
import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery.Builder;
import org.apache.lucene.search.highlight.*;
import org.apache.lucene.store.Directory;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.poifs.filesystem.FileMagic;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository(value = "luceneDao")
public class LuceneDaoImpl implements ILuceneDao {
@Autowired(required = false)
private IndexWriter indexWriter;
@Autowired
private Analyzer analyzer;
@Autowired
private SearcherManager searcherManager;
@Autowired
private LuceneConfig luceneConfig;
@Autowired
private SysBaseConfig sysBaseConfig;
@Override
public void createLuceneArchiveIndex(List<LuceneArchiveAnnex> luceneAnnexArchiveList, List<LuceneArchive> luceneArchiveList) throws IOException {
List<Document> docs = new ArrayList<Document>();
for (LuceneArchive p : luceneArchiveList) {
Document doc = new Document();
doc.add(new StringField("id", p.getId() + "", Field.Store.YES));
doc.add(new TextField("tempNo", p.getTempNo() == null ? "" : p.getTempNo(), Field.Store.YES));
doc.add(new TextField("archiveTitle1", p.getArchiveTitle() == null ? "" : p.getArchiveTitle(), Field.Store.YES));
doc.add(new StringField("archiveTitle", p.getArchiveTitle() == null ? "" : p.getArchiveTitle(), Field.Store.YES));
doc.add(new TextField("archiveType", p.getArchiveType() == null ? "" : p.getArchiveType(), Field.Store.YES));
doc.add(new TextField("securityClass", p.getSecurityClass() == null ? "" : p.getSecurityClass(), Field.Store.YES));
doc.add(new TextField("fileNo", p.getFileNo() == null ? "" : p.getFileNo(), Field.Store.YES));
doc.add(new TextField("responsibleBy", p.getResponsibleBy() == null ? "" : p.getResponsibleBy(), Field.Store.YES));
doc.add(new TextField("fileTime", p.getFileTime() == null ? "" : p.getFileTime(), Field.Store.YES));
doc.add(new TextField("pageNo", p.getPageNo() == null ? "" : p.getPageNo(), Field.Store.YES));
doc.add(new TextField("numberNo", p.getNumberNo() == null ? "" : p.getNumberNo(), Field.Store.YES));
doc.add(new TextField("fondsNo", p.getFondsNo() == null ? "" : p.getFondsNo(), Field.Store.YES));
doc.add(new TextField("contentNo", p.getContentNo() == null ? "" : p.getContentNo(), Field.Store.YES));
doc.add(new TextField("archiveNo1", p.getArchiveNo() == null ? "" : p.getArchiveNo(), Field.Store.YES));
doc.add(new StringField("archiveNo", p.getArchiveNo() == null ? "" : p.getArchiveNo(), Field.Store.YES));
doc.add(new TextField("filingYear", p.getFilingYear() == null ? "" : p.getFilingYear(), Field.Store.YES));
doc.add(new TextField("filingDept", p.getFilingDept() == null ? "" : p.getFilingDept(), Field.Store.YES));
doc.add(new TextField("filingDate", p.getFilingDate() == null ? "" : p.getFilingDate(), Field.Store.YES));
doc.add(new TextField("retention", p.getRetention() == null ? "" : p.getRetention(), Field.Store.YES));
doc.add(new TextField("folderLocation", p.getFolderLocation() == null ? "" : p.getFolderLocation(), Field.Store.YES));
doc.add(new TextField("remark", p.getRemark() == null ? "" : p.getRemark(), Field.Store.YES));
doc.add(new TextField("boxNo", p.getBoxNo() == null ? "" : p.getBoxNo(), Field.Store.YES));
doc.add(new TextField("folderLocation", p.getFolderLocation() == null ? "" : p.getFolderLocation(), Field.Store.YES));
doc.add(new TextField("referenceNo", p.getReferenceNo() == null ? "" : p.getReferenceNo(), Field.Store.YES));
doc.add(new TextField("fileEndtime", p.getFileEndtime() == null ? "" : p.getFileEndtime(), Field.Store.YES));
doc.add(new TextField("catalogNo", p.getCatalogNo() == null ? "" : p.getCatalogNo(), Field.Store.YES));
doc.add(new TextField("nativeFilesno", p.getNativeFilesno() == null ? "" : p.getNativeFilesno(), Field.Store.YES));
doc.add(new TextField("entityClass", p.getEntityClass() == null ? "" : p.getEntityClass(), Field.Store.YES));
doc.add(new TextField("checkDate", p.getCheckDate() == null ? "" : p.getCheckDate(), Field.Store.YES));
doc.add(new TextField("tableType", p.getTableType() == null ? "" : p.getTableType(), Field.Store.YES));
doc.add(new TextField("archiveCatalog", p.getArchiveCatalog() == null ? "" : p.getArchiveCatalog(), Field.Store.YES));
doc.add(new TextField("volumeFlag", p.getVolumeFlag() == null ? "" : p.getVolumeFlag(), Field.Store.YES));
doc.add(new TextField("parameter1", p.getParameter1() == null ? "" : p.getParameter1(), Field.Store.YES));
doc.add(new TextField("parameter2", p.getParameter2() == null ? "" : p.getParameter2(), Field.Store.YES));
doc.add(new TextField("parameter3", p.getParameter3() == null ? "" : p.getParameter3(), Field.Store.YES));
doc.add(new TextField("parameter4", p.getParameter4() == null ? "" : p.getParameter4(), Field.Store.YES));
doc.add(new TextField("parameter5", p.getParameter5() == null ? "" : p.getParameter5(), Field.Store.YES));
doc.add(new TextField("parameter6", p.getParameter6() == null ? "" : p.getParameter6(), Field.Store.YES));
doc.add(new TextField("parameter7", p.getParameter7() == null ? "" : p.getParameter7(), Field.Store.YES));
doc.add(new TextField("parameter8", p.getParameter8() == null ? "" : p.getParameter8(), Field.Store.YES));
doc.add(new TextField("parameter9", p.getParameter9() == null ? "" : p.getParameter9(), Field.Store.YES));
doc.add(new TextField("parameter10", p.getParameter10() == null ? "" : p.getParameter10(), Field.Store.YES));
doc.add(new TextField("parameter11", p.getParameter11() == null ? "" : p.getParameter11(), Field.Store.YES));
doc.add(new TextField("parameter12", p.getParameter12() == null ? "" : p.getParameter12(), Field.Store.YES));
doc.add(new TextField("parameter13", p.getParameter13() == null ? "" : p.getParameter13(), Field.Store.YES));
doc.add(new TextField("parameter14", p.getParameter14() == null ? "" : p.getParameter14(), Field.Store.YES));
doc.add(new TextField("parameter15", p.getParameter15() == null ? "" : p.getParameter15(), Field.Store.YES));
doc.add(new TextField("parameter16", p.getParameter16() == null ? "" : p.getParameter16(), Field.Store.YES));
doc.add(new TextField("parameter17", p.getParameter17() == null ? "" : p.getParameter17(), Field.Store.YES));
doc.add(new TextField("parameter18", p.getParameter18() == null ? "" : p.getParameter18(), Field.Store.YES));
doc.add(new TextField("parameter19", p.getParameter19() == null ? "" : p.getParameter19(), Field.Store.YES));
doc.add(new TextField("content",p.toString().replaceAll("null","''"), Field.Store.YES));
// 保存price,
Integer status = p.getStatus();
// 建立倒排索引
doc.add(new IntPoint("status", status));
// 正排索引用于排序、聚合
doc.add(new FloatDocValuesField("status", status));
// 存储到索引库
doc.add(new StoredField("status", status));
docs.add(doc);
}
// 将文档添加到索引
indexWriter.addDocuments(docs);
//
//文件索引
File targetFileDir=new File(sysBaseConfig.getProfile());
if (!targetFileDir.isDirectory() || !targetFileDir.exists()) {
return;
}
// 保存Lucene索引文件的路径
Directory directory =luceneConfig.directory();
// 创建索引实例
IndexWriter fileWriter =luceneConfig.indexWriter(directory,analyzer);
// 获取所有需要建立索引的文件
ArrayList<File> fileList =new ArrayList<File>();
getFiles(fileList,targetFileDir.getPath());
for (int i = 0; i < fileList.size(); i++) {
// 文件的完整路径 files[i].toString()
// 获取文件名称
String fileName = fileList.get(i).getName();
// 获取文件后缀名,将其作为文件类型
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()).toLowerCase();
Document doc = new Document();
FileInputStream in = new FileInputStream(fileList.get(i));
FieldType fieldType = new FieldType();
fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
fieldType.setStored(true);
fieldType.setTokenized(true);
if (fileType != null && !fileType.equals("")) {
if (fileType.equals("doc") || fileType.equals("docx")) {
InputStream is = new BufferedInputStream(in);
if (FileMagic.valueOf(is) == FileMagic.OLE2) {
WordExtractor wordExtractor = new WordExtractor(is);
doc.add(new Field("contents", wordExtractor.getText(), fieldType));
// 关闭文档
wordExtractor.close();
} else if (FileMagic.valueOf(is) == FileMagic.OOXML) {
// 获取docx的word文档
XWPFWordExtractor xwpfWordExtractor = new XWPFWordExtractor(new XWPFDocument(is));
// 创建Field对象,并放入doc对象中
doc.add(new Field("contents", xwpfWordExtractor.getText(), fieldType));
// 关闭文档
xwpfWordExtractor.close();
}
} else if (fileType.equals("pdf")) {
try {
// 获取pdf文档
PDFParser parser = new PDFParser(in);
parser.parse();
PDDocument pdDocument = parser.getPDDocument();
PDFTextStripper stripper = new PDFTextStripper();
// 创建Field对象,并放入doc对象中
doc.add(new Field("contents", stripper.getText(pdDocument), fieldType));
// 关闭文档
pdDocument.close();
} catch (Exception e) {
System.out.println(fileList.get(i).getAbsolutePath());
}
} else if (fileType.equals("txt")) {
String txtFile = FileUtils.readFileToString(fileList.get(i));
// 创建Field对象,并放入doc对象中
doc.add(new Field("contents", txtFile, fieldType));
} else {
continue;
}
// 创建文件名的域,并放入doc对象中
doc.add(new Field("filename", fileList.get(i).getName(), fieldType));
// 创建时间的域,并放入doc对象中
List<LuceneArchiveAnnex> resultList = new ArrayList<LuceneArchiveAnnex>();
String pathname = fileList.get(i).getPath();
String key = pathname.substring(pathname.lastIndexOf("uploadfiles\\") + 12, pathname.length()).replaceAll("\\\\", "\\/");
resultList = luceneAnnexArchiveList.stream().filter(s ->s.getPathName().equals(key)).collect(Collectors.toList());
if (resultList.size() > 0) {
LuceneArchiveAnnex luceneArchive = resultList.get(0);
if (luceneArchive.getId() == null) {
continue;
}
doc.add(new StringField("id", luceneArchive.getId() == null ? "" : luceneArchive.getId(), Field.Store.YES));
doc.add(new StringField("archiveTitle", luceneArchive.getArchiveTitle() == null ? "" : luceneArchive.getArchiveTitle(), Field.Store.YES));
doc.add(new StringField("archiveNo", luceneArchive.getArchiveNo() == null ? "" : luceneArchive.getArchiveNo(), Field.Store.YES));
doc.add(new TextField("filingYear", luceneArchive.getFilingYear() == null ? "" : luceneArchive.getFilingYear(), Field.Store.YES));
doc.add(new TextField("folderLocation", luceneArchive.getFolderLocation() == null ? "" : luceneArchive.getFolderLocation(), Field.Store.YES));
doc.add(new TextField("responsibleBy", luceneArchive.getResponsibleBy() == null ? "" : luceneArchive.getResponsibleBy(), Field.Store.YES));
doc.add(new TextField("archiveType", luceneArchive.getArchiveType() == null ? "" : luceneArchive.getArchiveType(), Field.Store.YES));
doc.add(new TextField("tableType", luceneArchive.getTableType() == null ? "" : luceneArchive.getTableType(), Field.Store.YES));
doc.add(new TextField("archiveCatalog", luceneArchive.getArchiveCatalog() == null ? "" : luceneArchive.getArchiveCatalog(), Field.Store.YES));
Integer status = luceneArchive.getStatus();
// 建立倒排索引
doc.add(new IntPoint("status", status));
// 正排索引用于排序、聚合
doc.add(new FloatDocValuesField("status", status));
// 存储到索引库
doc.add(new StoredField("status", status));
}
// 写入IndexWriter
fileWriter.addDocument(doc);
}
}
fileWriter.commit();
indexWriter.commit();
}
@Override
public List<LuceneArchive> searchLuceneArchive(Pagination page, @Param("params") Map<String, Object> params) throws IOException, ParseException {
searcherManager.maybeRefresh();
IndexSearcher indexSearcher = searcherManager.acquire();
Builder builder = new BooleanQuery.Builder();
Sort sort = new Sort();
List<LuceneArchive> pList = new ArrayList<LuceneArchive>();
//多个模糊查询 MultiFieldQueryParser
Query query = null;
TopDocs topDocs = null;
String file="";
if (params != null) {
// 模糊匹配,匹配词
String keyStr = (String) params.get("searchKeyStr");
String archiveTitle = (String) params.get("archiveTitle");
String archiveNo = (String) params.get("archiveNo");
String archiveFile = (String) params.get("archiveFile");
keyStr=keyStr.replaceAll("\\/","").replaceAll("\\\\","");
if (keyStr != null && !"".equals(keyStr)) {
// 输入空格,不进行模糊查询47
String[] stringQuery = {keyStr, keyStr, keyStr, keyStr,
keyStr, keyStr, keyStr, keyStr, keyStr, keyStr,
keyStr, keyStr, keyStr, keyStr, keyStr, keyStr,
keyStr, keyStr, keyStr, keyStr, keyStr, keyStr,
keyStr, keyStr, keyStr, keyStr, keyStr, keyStr,
keyStr, keyStr, keyStr, keyStr, keyStr, keyStr,
keyStr, keyStr, keyStr, keyStr, keyStr, keyStr,
keyStr, keyStr, keyStr, keyStr, keyStr, keyStr, keyStr};
String[] fields = {"tempNo", "archiveTitle1", "archiveType", "securityClass",
"fileNo", "responsibleBy", "fileTime", "pageNo", "numberNo",
"fondsNo", "contentNo", "archiveNo1", "filingYear", "filingDept", "filingDate",
"retention", "folderLocation", "remark", "boxNo", "referenceNo", "fileEndtime",
"catalogNo", "nativeFilesno", "entityClass", "checkDate", "tableType", "archiveCatalog",
"volumeFlag", "parameter1", "parameter2", "parameter3", "parameter4", "parameter5",
"parameter6", "parameter7", "parameter8", "parameter9", "parameter10", "parameter11", "parameter12"
, "parameter13", "parameter14", "parameter15", "parameter16", "parameter17", "parameter18", "parameter19"};
Occur[] occ = {Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD,
Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD,
Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD,
Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD,
Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD,
Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD,
Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD,
Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD,
Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD, Occur.SHOULD,
Occur.SHOULD, Occur.SHOULD, Occur.SHOULD};
query = MultiFieldQueryParser.parse(stringQuery, fields, occ, analyzer);
//获取上一页的最后一个元素
ScoreDoc lastScoreDoc = getLastScoreDoc(page.getCurrent(), page.getSize(), query, indexSearcher, sort);
//通过最后一个元素搜索下页的pageSize个元素
topDocs = indexSearcher.searchAfter(lastScoreDoc, query, page.getSize(), sort);
file=keyStr;
} else if (archiveTitle != null && !"".equals(archiveTitle)) {
// 输入空格,不进行模糊查询
String[] stringQuery = {archiveTitle, archiveTitle};
String[] fields = {"archiveTitle", "archiveTitle1"};
Occur[] occ = {Occur.SHOULD, Occur.SHOULD};
if (!"".equals(archiveTitle.replaceAll(" ", ""))) {
query = MultiFieldQueryParser.parse(stringQuery, fields, occ, analyzer);
}
//获取上一页的最后一个元素
ScoreDoc lastScoreDoc = getLastScoreDoc(page.getCurrent(), page.getSize(), query, indexSearcher, sort);
//通过最后一个元素搜索下页的pageSize个元素
topDocs = indexSearcher.searchAfter(lastScoreDoc,query, page.getSize(), sort);
file=archiveTitle;
} else if (archiveNo != null && !"".equals(archiveNo)) {
// 输入空格,不进行模糊查询
String[] stringQuery = {archiveNo, archiveNo};
String[] fields = {"archiveNo", "archiveNo1"};
Occur[] occ = {Occur.SHOULD, Occur.SHOULD};
if (!"".equals(archiveNo.replaceAll(" ", ""))) {
query = MultiFieldQueryParser.parse(stringQuery, fields, occ, analyzer);
}
//获取上一页的最后一个元素
ScoreDoc lastScoreDoc = getLastScoreDoc(page.getCurrent(), page.getSize(), query, indexSearcher, sort);
//通过最后一个元素搜索下页的pageSize个元素
topDocs = indexSearcher.searchAfter(lastScoreDoc, query, page.getSize(), sort);
file=archiveNo;
} else if (archiveFile != null && !"".equals(archiveFile)) {
Directory dir =luceneConfig.directory();
// //创建 IndexSearcher对象,相比IndexWriter对象,这个参数就要提供一个索引的目录就行了
DirectoryReader ireader = DirectoryReader.open(dir);
IndexSearcher indexSearch = new IndexSearcher(ireader);
QueryParser queryParser = new QueryParser("contents", analyzer);
//生成Query对象
if (!"".equals(archiveFile.replaceAll(" ", ""))) {
query = queryParser.parse(archiveFile);
}
//获取上一页的最后一个元素
ScoreDoc lastScoreDoc = getLastScoreDoc(page.getCurrent(), page.getSize(), query, indexSearcher, sort);
//通过最后一个元素搜索下页的pageSize个元素
topDocs = indexSearch.searchAfter(lastScoreDoc, query, page.getSize(), sort);
file=archiveFile;
} else {
topDocs = indexSearcher.search(builder.build(), page.getCurrent() * page.getSize(), sort);
}
page.setTotal((int) topDocs.totalHits);
ScoreDoc[] hits = topDocs.scoreDocs;
// 准备高亮工具
Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter("<span style=\"color:red;\">", "</span>"), new QueryScorer(query));
for (int i = 0; i < hits.length; i++) {
Document doc = indexSearcher.doc(hits[i].doc);
LuceneArchive luceneArchive = new LuceneArchive();
if (archiveFile == null || "".equals(archiveFile)) {
luceneArchive.setId(doc.get("id"));
luceneArchive.setTempNo(doc.get("tempNo"));
luceneArchive.setArchiveTitle(doc.get("archiveTitle"));
luceneArchive.setArchiveType(doc.get("archiveType"));
luceneArchive.setSecurityClass(doc.get("securityClass"));
luceneArchive.setFileNo(doc.get("fileNo"));
luceneArchive.setResponsibleBy(doc.get("responsibleBy"));
luceneArchive.setFileTime(doc.get("fileTime"));
luceneArchive.setPageNo(doc.get("pageNo"));
luceneArchive.setNumberNo(doc.get("numberNo"));
luceneArchive.setFondsNo(doc.get("fondsNo"));
luceneArchive.setContentNo(doc.get("contentNo"));
luceneArchive.setArchiveNo(doc.get("archiveNo"));
luceneArchive.setFilingYear(doc.get("filingYear"));
luceneArchive.setFilingDept(doc.get("filingDept"));
luceneArchive.setFilingDate(doc.get("filingDate"));
luceneArchive.setRetention(doc.get("retention"));
luceneArchive.setFolderLocation(doc.get("folderLocation"));
luceneArchive.setRemark(doc.get("remark"));
luceneArchive.setBoxNo(doc.get("boxNo"));
luceneArchive.setReferenceNo(doc.get("referenceNo"));
luceneArchive.setFileEndtime(doc.get("fileEndtime"));
luceneArchive.setCatalogNo(doc.get("catalogNo"));
luceneArchive.setNativeFilesno(doc.get("nativeFilesno"));
luceneArchive.setEntityClass(doc.get("entityClass"));
luceneArchive.setCheckDate(doc.get("checkDate"));
luceneArchive.setTableType(doc.get("tableType"));
luceneArchive.setArchiveCatalog(doc.get("archiveCatalog"));
luceneArchive.setVolumeFlag(doc.get("volumeFlag"));
luceneArchive.setParameter1(doc.get("parameter1"));
luceneArchive.setParameter2(doc.get("parameter2"));
luceneArchive.setParameter3(doc.get("parameter3"));
luceneArchive.setParameter4(doc.get("parameter4"));
luceneArchive.setParameter5(doc.get("parameter5"));
luceneArchive.setParameter6(doc.get("parameter6"));
luceneArchive.setParameter7(doc.get("parameter7"));
luceneArchive.setParameter8(doc.get("parameter8"));
luceneArchive.setParameter9(doc.get("parameter9"));
luceneArchive.setParameter10(doc.get("parameter10"));
luceneArchive.setParameter11(doc.get("parameter11"));
luceneArchive.setParameter12(doc.get("parameter12"));
luceneArchive.setParameter13(doc.get("parameter13"));
luceneArchive.setParameter14(doc.get("parameter14"));
luceneArchive.setParameter15(doc.get("parameter15"));
luceneArchive.setParameter16(doc.get("parameter16"));
luceneArchive.setParameter17(doc.get("parameter17"));
luceneArchive.setParameter18(doc.get("parameter18"));
luceneArchive.setParameter19(doc.get("parameter19"));
luceneArchive.setStatus(Integer.parseInt(doc.get("status")));
}
if(file!=null && !file.equals("")) {
String title = doc.get("" + file);
try {
if (!"".equals(archiveTitle.replaceAll(" ", ""))) {
String str = highlighter.getBestFragment(analyzer, title, doc.get("archiveTitle"));//获取高亮的片段,可以对其数量进行限制
if(str!=null){ luceneArchive.setArchiveTitle(str);}
}
if (!"".equals(archiveNo.replaceAll(" ", ""))) {
String str = highlighter.getBestFragment(analyzer, title, doc.get("archiveNo"));//获取高亮的片段,可以对其数量进行限制
if(str!=null){luceneArchive.setArchiveNo(str);}
}else if(!"".equals(archiveFile.replaceAll(" ", ""))){
if(doc.get("id")==null){
continue;
}
luceneArchive.setId(doc.get("id"));
String str = highlighter.getBestFragment(analyzer, title, doc.get("contents"));
if(str==null){str=doc.get("contents");}
luceneArchive.setContent(str);
luceneArchive.setArchiveTitle(doc.get("archiveTitle"));
luceneArchive.setFilingYear(doc.get("filingYear"));
luceneArchive.setArchiveNo(doc.get("archiveNo"));
luceneArchive.setResponsibleBy(doc.get("responsibleBy"));
luceneArchive.setFolderLocation(doc.get("folderLocation"));
luceneArchive.setArchiveType(doc.get("archiveType"));
luceneArchive.setTableType(doc.get("tableType"));
luceneArchive.setArchiveCatalog(doc.get("archiveCatalog"));
luceneArchive.setStatus(Integer.parseInt(doc.get("status")));
} else{
String str = highlighter.getBestFragment(analyzer, title, doc.get("content"));//获取高亮的片段,可以对其数量进行限制
if(str==null){str=doc.get("content");}
luceneArchive.setContent(str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
pList.add(luceneArchive);
}
}
return pList;
}
@Override
public void addLuceneArchiveIndex(LuceneArchive luceneArchive) throws IOException {
Document doc = new Document();
doc.add(new StringField("id", luceneArchive.getId() + "", Field.Store.YES));
doc.add(new TextField("tempNo", luceneArchive.getTempNo() == null ? "" : luceneArchive.getTempNo(), Field.Store.YES));
doc.add(new TextField("archiveTitle1", luceneArchive.getArchiveTitle() == null ? "" : luceneArchive.getArchiveTitle(), Field.Store.YES));
doc.add(new StringField("archiveTitle", luceneArchive.getArchiveTitle() == null ? "" : luceneArchive.getArchiveTitle(), Field.Store.YES));
doc.add(new TextField("archiveType", luceneArchive.getArchiveType() == null ? "" : luceneArchive.getArchiveType(), Field.Store.YES));
doc.add(new TextField("securityClass", luceneArchive.getSecurityClass() == null ? "" : luceneArchive.getSecurityClass(), Field.Store.YES));
doc.add(new TextField("fileNo", luceneArchive.getFileNo() == null ? "" : luceneArchive.getFileNo(), Field.Store.YES));
doc.add(new TextField("responsibleBy", luceneArchive.getResponsibleBy() == null ? "" : luceneArchive.getResponsibleBy(), Field.Store.YES));
doc.add(new TextField("fileTime", luceneArchive.getFileTime() == null ? "" : luceneArchive.getFileTime(), Field.Store.YES));
doc.add(new TextField("pageNo", luceneArchive.getPageNo() == null ? "" : luceneArchive.getPageNo(), Field.Store.YES));
doc.add(new TextField("numberNo", luceneArchive.getNumberNo() == null ? "" : luceneArchive.getNumberNo(), Field.Store.YES));
doc.add(new TextField("fondsNo", luceneArchive.getFondsNo() == null ? "" : luceneArchive.getFondsNo(), Field.Store.YES));
doc.add(new TextField("contentNo", luceneArchive.getContentNo() == null ? "" : luceneArchive.getContentNo(), Field.Store.YES));
doc.add(new TextField("archiveNo1", luceneArchive.getArchiveNo() == null ? "" : luceneArchive.getArchiveNo(), Field.Store.YES));
doc.add(new StringField("archiveNo", luceneArchive.getArchiveNo() == null ? "" : luceneArchive.getArchiveNo(), Field.Store.YES));
doc.add(new TextField("filingYear", luceneArchive.getFilingYear() == null ? "" : luceneArchive.getFilingYear(), Field.Store.YES));
doc.add(new TextField("filingDept", luceneArchive.getFilingDept() == null ? "" : luceneArchive.getFilingDept(), Field.Store.YES));
doc.add(new TextField("filingDate", luceneArchive.getFilingDate() == null ? "" : luceneArchive.getFilingDate(), Field.Store.YES));
doc.add(new TextField("retention", luceneArchive.getRetention() == null ? "" : luceneArchive.getRetention(), Field.Store.YES));
doc.add(new TextField("folderLocation", luceneArchive.getFolderLocation() == null ? "" : luceneArchive.getFolderLocation(), Field.Store.YES));
doc.add(new TextField("remark", luceneArchive.getRemark() == null ? "" : luceneArchive.getRemark(), Field.Store.YES));
doc.add(new TextField("boxNo", luceneArchive.getBoxNo() == null ? "" : luceneArchive.getBoxNo(), Field.Store.YES));
doc.add(new TextField("referenceNo", luceneArchive.getReferenceNo() == null ? "" : luceneArchive.getReferenceNo(), Field.Store.YES));
doc.add(new TextField("fileEndtime", luceneArchive.getFileEndtime() == null ? "" : luceneArchive.getFileEndtime(), Field.Store.YES));
doc.add(new TextField("catalogNo", luceneArchive.getCatalogNo() == null ? "" : luceneArchive.getCatalogNo(), Field.Store.YES));
doc.add(new TextField("nativeFilesno", luceneArchive.getNativeFilesno() == null ? "" : luceneArchive.getNativeFilesno(), Field.Store.YES));
doc.add(new TextField("entityClass", luceneArchive.getEntityClass() == null ? "" : luceneArchive.getEntityClass(), Field.Store.YES));
doc.add(new TextField("checkDate", luceneArchive.getCheckDate() == null ? "" : luceneArchive.getCheckDate(), Field.Store.YES));
doc.add(new TextField("tableType", luceneArchive.getTableType() == null ? "" : luceneArchive.getTableType(), Field.Store.YES));
doc.add(new TextField("archiveCatalog", luceneArchive.getArchiveCatalog() == null ? "" : luceneArchive.getArchiveCatalog(), Field.Store.YES));
doc.add(new TextField("volumeFlag", luceneArchive.getVolumeFlag() == null ? "" : luceneArchive.getVolumeFlag(), Field.Store.YES));
doc.add(new TextField("parameter1", luceneArchive.getParameter1() == null ? "" : luceneArchive.getParameter1(), Field.Store.YES));
doc.add(new TextField("parameter2", luceneArchive.getParameter2() == null ? "" : luceneArchive.getParameter2(), Field.Store.YES));
doc.add(new TextField("parameter3", luceneArchive.getParameter3() == null ? "" : luceneArchive.getParameter3(), Field.Store.YES));
doc.add(new TextField("parameter4", luceneArchive.getParameter4() == null ? "" : luceneArchive.getParameter4(), Field.Store.YES));
doc.add(new TextField("parameter5", luceneArchive.getParameter5() == null ? "" : luceneArchive.getParameter5(), Field.Store.YES));
doc.add(new TextField("parameter6", luceneArchive.getParameter6() == null ? "" : luceneArchive.getParameter6(), Field.Store.YES));
doc.add(new TextField("parameter7", luceneArchive.getParameter7() == null ? "" : luceneArchive.getParameter7(), Field.Store.YES));
doc.add(new TextField("parameter8", luceneArchive.getParameter8() == null ? "" : luceneArchive.getParameter8(), Field.Store.YES));
doc.add(new TextField("parameter9", luceneArchive.getParameter9() == null ? "" : luceneArchive.getParameter9(), Field.Store.YES));
doc.add(new TextField("parameter10", luceneArchive.getParameter10() == null ? "" : luceneArchive.getParameter10(), Field.Store.YES));
doc.add(new TextField("parameter11", luceneArchive.getParameter11() == null ? "" : luceneArchive.getParameter11(), Field.Store.YES));
doc.add(new TextField("parameter12", luceneArchive.getParameter12() == null ? "" : luceneArchive.getParameter12(), Field.Store.YES));
doc.add(new TextField("parameter13", luceneArchive.getParameter13() == null ? "" : luceneArchive.getParameter13(), Field.Store.YES));
doc.add(new TextField("parameter14", luceneArchive.getParameter14() == null ? "" : luceneArchive.getParameter14(), Field.Store.YES));
doc.add(new TextField("parameter15", luceneArchive.getParameter15() == null ? "" : luceneArchive.getParameter15(), Field.Store.YES));
doc.add(new TextField("parameter16", luceneArchive.getParameter16() == null ? "" : luceneArchive.getParameter16(), Field.Store.YES));
doc.add(new TextField("parameter17", luceneArchive.getParameter17() == null ? "" : luceneArchive.getParameter17(), Field.Store.YES));
doc.add(new TextField("parameter18", luceneArchive.getParameter18() == null ? "" : luceneArchive.getParameter18(), Field.Store.YES));
doc.add(new TextField("parameter19", luceneArchive.getParameter19() == null ? "" : luceneArchive.getParameter19(), Field.Store.YES));
// 保存price,
Integer status = luceneArchive.getStatus();
// 建立倒排索引
doc.add(new IntPoint("status", status));
// 正排索引用于排序、聚合
doc.add(new FloatDocValuesField("status", status));
// 存储到索引库
doc.add(new StoredField("status", status));
indexWriter.addDocument(doc);
indexWriter.commit();
}
@Override
public void deleteLuceneArchiveIndexById(String id) throws IOException {
indexWriter.deleteDocuments(new Term("id", id));
indexWriter.commit();
}
@Override
public void deleteLuceneArchiveIndexAll() throws IOException {
//文字索引删除
indexWriter.deleteAll();
indexWriter.commit();
//indexWriter.close();
//文件索引删除
// searchUtils.indexDelAll(new File(sysBaseConfig.getProfile(), "luceneIndex"));
}
/**
* 根据页码和分页大小获取上一次最后一个ScoreDoc
* @param pageIndex
* @param pageSize
* @param query
* @param indexSearcher
* @return
* @throws IOException
*/
private ScoreDoc getLastScoreDoc(int pageIndex, int pageSize, Query query, IndexSearcher indexSearcher, Sort sort) throws IOException {
if (pageIndex == 1) return null;//如果是第一页返回空
int num = pageSize * (pageIndex - 1);//获取上一页的数量
TopDocs tds = indexSearcher.search(query, num, sort);
return tds.scoreDocs[num - 1];
}
private void getFiles(ArrayList<File> fileList,String path) {
File[] allFiles = new File(path).listFiles();
for (int i = 0; i < allFiles.length; i++) {
File file = allFiles[i];
if (file.isFile()) {
fileList.add(file);
} else {
getFiles(fileList, file.getAbsolutePath());
}
}
}
}
package com.framework.modules.lucene.config;
import com.framework.common.config.SysBaseConfig;
import org.apache.lucene.analysis.Analyzer;
/*import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;*/
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.ControlledRealTimeReopenThread;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
@Configuration
public class LuceneConfig {
@Autowired
private SysBaseConfig sysBaseConfig;
/**
* 创建一个 Analyzer 实例
*
* @return
*/
@Bean
public Analyzer analyzer() {
return new IKAnalyzer(false);/*SmartChineseAnalyzer();*/
}
/**
* 索引位置
*
* @return
* @throws IOException
*/
@Bean
public Directory directory() throws IOException {
Path path = Paths.get(sysBaseConfig.getLucenePath());
File file = path.toFile();
if(!file.exists()) {
//如果文件夹不存在,则创建
file.mkdirs();
}
return FSDirectory.open(path);
}
/**
* 创建indexWriter
*
* @param directory
* @param analyzer
* @return
* @throws IOException
*/
@Bean
public IndexWriter indexWriter(Directory directory, Analyzer analyzer) throws IOException {
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
// 清空索引
indexWriter.deleteAll();
indexWriter.commit();
return indexWriter;
}
/**
* SearcherManager管理
*
* @param directory
* @return
* @throws IOException
*/
@Bean
public SearcherManager searcherManager(Directory directory, IndexWriter indexWriter) throws IOException {
SearcherManager searcherManager = new SearcherManager(indexWriter, false, false, new SearcherFactory());
ControlledRealTimeReopenThread cRTReopenThead = new ControlledRealTimeReopenThread(indexWriter, searcherManager,
5.0, 0.025);
cRTReopenThead.setDaemon(true);
//线程名称
cRTReopenThead.setName("更新IndexReader线程");
// 开启线程
cRTReopenThead.start();
return searcherManager;
}
}
mybatis
表结构就不写了。此文章只供参考。
遇到问题:
1.调用存储权限不足
执行:最后两句就行。