因为最近接触了搜索相关的知识,我接触到了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文件,其中包含了姓名,地址,身份证号和邮箱地址
首先我们需要先生成索引才能进行文档的全文检索
下面代码创建了一个索引的对象,并使用了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);
}
原文:https://www.cnblogs.com/taoting/p/13199855.html