Lucene初次使用

因为最近接触了搜索相关的知识,我接触到了Lucene这个*,这个*可以实现全文检索的功能,所以我觉得写一个个人资料检索的demo来练练手。
其中我是用了Lucene8.5.2,我们需要添加以下的依赖文件

<dependencies>
     <!-- lucene核心库 -->
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>${lunece.version}</version>
    </dependency>
    <!-- Lucene的查询解析器 -->
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-queryparser</artifactId>
        <version>${lunece.version}</version>
    </dependency>
    <!-- lucene的默认分词器库 -->
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-analyzers-common</artifactId>
        <version>${lunece.version}</version>
    </dependency>
    <!-- lucene的高亮显示 -->
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-highlighter</artifactId>
        <version>${lunece.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-memory</artifactId>
        <version>${lunece.version}</version>
    </dependency>

    <dependency>
        <groupId>com.github.magese</groupId>
        <artifactId>ik-analyzer</artifactId>
        <version>8.3.0</version>
    </dependency>
</dependencies>

生成测试文档

首先我们先用python生成了一个csv文件,其中包含了姓名,地址,身份证号和邮箱地址
Lucene初次使用

生成索引

首先我们需要先生成索引才能进行文档的全文检索
下面代码创建了一个索引的对象,并使用了IK分词器进行分词

IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new IKAnalyzer());
IndexWriter indexWriter = new IndexWriter(index, indexWriterConfig);

然后我们需要把个人资料添加到索引中

BufferedReader bufferedReader = new BufferedReader(new FileReader("test.csv"));

while (true) {
    String line = bufferedReader.readLine();
    if (line == null) {
        break;
    }
    String[] split = line.split(",");
    Document doc = new Document();
    doc.add(new Field("name", split[0], TextField.TYPE_STORED));
    doc.add(new Field("address", split[1], TextField.TYPE_STORED));
    doc.add(new Field("idCard", split[2], TextField.TYPE_STORED));
    doc.add(new Field("email", split[3], TextField.TYPE_STORED));
    indexWriter.addDocument(doc);
}

其中Lucene的一个文档由若干个字段组成,每个字段的类型可以是文本(text)类型,字节(byte)类型或者是数字(numeric)类型,每个字段也可以设置为是否索引,不索引将无法被搜索到

最后我们需要indexWriter.close()才能真正把索引写到硬盘中

搜索

开始搜索前我们需要把索引从硬盘读到内存中

IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(index));

然后我们需要创建一个搜索的解析器,将我们的查询进行解析

QueryParser parser = new QueryParser("address", analyzer);
Query query = parser.parse(keyWords);

接着就可以进行搜索了,这里我们搜索了前100条数据

TopDocs topDocs = searcher.search(query, 100);

然后我们输出了一下查询结果,并对关键字进行了代码高亮

SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("[", "]");
QueryScorer scorer = new QueryScorer(query);//计算查询结果最高的得分
Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);//根据得分算出一个片段
Highlighter highlighter = new Highlighter(simpleHTMLFormatter, scorer);
highlighter.setTextFragmenter(fragmenter);//设置显示高亮的片段

for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
    Document doc = searcher.doc(scoreDoc.doc);
    String address = doc.get("address");
    TokenStream tokenStream =  analyzer.tokenStream("address", new StringReader(address));
    String summary = highlighter.getBestFragment(tokenStream, address);
    System.out.println(summary);
}

Lucene初次使用

上一篇:phpstorm


下一篇:js04-表格的全选与不选