ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

lucene4.10.4全文检索技术的使用java版

2021-04-13 21:54:06  阅读:168  来源: 互联网

标签:java lucene4.10 indexWriter lucene 全文检索 add new document String


总结下如何使用lucene全文搜索

 首先导入依赖

 <!--核心包-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>4.10.4</version>
        </dependency>
        <!--对分词索引查询解析-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>4.10.4</version>
        </dependency>
        <!--一般分词器,适用于英文分词-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>4.10.4</version>
        </dependency>
        <!--检索关键字高亮显示 -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-highlighter</artifactId>
            <version>4.10.4</version>
        </dependency>
        <dependency>
            <groupId>com.janeluo</groupId>
            <artifactId>ikanalyzer</artifactId>
            <version>2012_u6</version>
        </dependency>

创建工具类LuceneUtil工具类

public class LuceneUtil {
    private final static Logger logger = LoggerFactory.getLogger(LuceneUtil.class);
    public static IndexWriter getIndexWriter(String mainLogsIndexDir) throws IOException {
        Path path = Paths.get(mainLogsIndexDir);
        File indexFile = path.toFile();
        if(!indexFile.exists()) {
            //如果文件夹不存在,则创建
            indexFile.mkdirs();
        }
        FSDirectory fsDirectory = FSDirectory.open(indexFile);
        IKAnalyzer ikAnalyzer = new IKAnalyzer();
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_10_4,ikAnalyzer);
        IndexWriter indexWriter = new IndexWriter(fsDirectory, indexWriterConfig);
        if(IndexWriter.isLocked(fsDirectory )){
            indexWriter.close();
            IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_4 , ikAnalyzer );
            return new IndexWriter(fsDirectory, config);
        }
        return indexWriter;
    }

    public static IndexSearcher getIndexSearcher(String indexDirectory){
        Path path = Paths.get(indexDirectory);
        File file = path.toFile();
        if (!file.exists()) {
            //如果文件夹不存在,则创建
            file.mkdirs();
        }
        try {
            FSDirectory directory = FSDirectory.open(file);
            IndexReader reader = DirectoryReader.open(directory);
            return new IndexSearcher(reader);
        } catch (IOException e) {
            logger.error(e.getMessage(),e);
            return null;
        }
    }
}

添加文档到索引库

            List<Document> docs = new ArrayList<>();
            LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(file));
            String[] split = file.getName().split("\\.");
            String name = split[0];
            String line;
            while ((line = lineNumberReader.readLine()) != null) {
                int lineNumber = lineNumberReader.getLineNumber();
                Document document = new Document();
                document.add(new StringField("recordId", recordId, Field.Store.YES));
                document.add(new StringField("subRecordId", subRecordId, Field.Store.YES));
                document.add(new StringField("fileName", name, Field.Store.YES));
                document.add(new LongField("lineNumber",lineNumber,Field.Store.YES));
                document.add(new TextField("content",line, Field.Store.YES));
                docs.add(document);
            }
            IndexWriter indexWriter = LuceneUtil.getIndexWriter(moduleLogsIndexDir);
            indexWriter.addDocuments(docs);
            indexWriter.close();
            lineNumberReader.close();

从索引库查询结果

IndexSearcher logsIndexSearcher = LuceneUtil.getIndexSearcher(logIndexDir);
// 总查询条件
BooleanQuery booleanQuery = new BooleanQuery();
// subrecordId
String subRecordId = logPageDTO.getSubRecordId();
booleanQuery.add(new TermQuery(new Term("subRecordId", subRecordId)), BooleanClause.Occur.MUST);
TopDocs topDocs = logsIndexSearcher.search(booleanQuery, querySize, sort);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
ScoreDoc lastScoreDoc;
int last = (pageNum - 1) * pageSize - 1;
// 查询第一页的时候scoreDoc传null
if (last < 0) {
   lastScoreDoc = null;
} else {
    lastScoreDoc = scoreDocs[last];
}
// 注意searchAfter与search的区别
topDocs = logsIndexSearcher.searchAfter(lastScoreDoc, booleanQuery,                                     pageSize, sort);
List<LogItemVO> logItemList = new ArrayList<>();
scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
      Document doc = logsIndexSearcher.doc(scoreDoc.doc);
      LogItemVO logItemVO = new LogItemVO();
      logItemVO.setFileName(doc.get("fileName"));
      logItemVO.setLineNum(Long.parseLong(doc.get("lineNumber")));
      logItemVO.setContent(doc.get("content"));
      logItemList.add(logItemVO);
 }

 

标签:java,lucene4.10,indexWriter,lucene,全文检索,add,new,document,String
来源: https://blog.51cto.com/u_13585440/2704220

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有