lucene全文检索包括双层PDF

实现效果:创建索引后可以模糊检索或者文件检索

 实现过程

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.调用存储权限不足

执行:最后两句就行。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值