Luence是基于Java开发的全文检索工具包。
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>8.2.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
@Test
public void createIndex() throws Exception {
//2. 创建一个Director对象,指定索引库保存的位置。
Directory directory = FSDirectory.open(new File("/home/gaolei/JavaProgram/Learn-Lucene/src/main/resources/index").toPath());
//3. 基于Director对象,创建一个IndexWriter对象
IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig());
//4. 读取磁盘上的文件,对应每个文件创建一个文档对象
File dir = new File("/home/gaolei/JavaProgram/Learn-Lucene/src/main/resources/file");
System.out.println(dir.getAbsolutePath());
System.out.println(dir.isDirectory());
File[] files = dir.listFiles();
for (File file : files) {
//取文件名
String fileName = file.getName();
//取文件路径
String filePath = file.getPath();
//文件的内容
String fileContent = FileUtils.readFileToString(file, "utf-8");
//文件大小
long fileSize = FileUtils.sizeOf(file);
//创建field
//参数1:域的名称
//参数2:域的内容
//参数3:是否存储
Field filedName = new TextField("name", fileName, Field.Store.YES);
Field fieldPath = new TextField("path", filePath, Field.Store.YES);
Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
Field fieldSize = new TextField("size", fileSize + "", Field.Store.YES);
//5. 向文档对象中添加域。
//创建文档对象
Document document = new Document();
document.add(filedName);
document.add(fieldPath);
document.add(fieldContent);
document.add(fieldSize);
//6. 把文档对象写入索引库。
indexWriter.addDocument(document);
}
//7. 关闭IndexWriter对象。
indexWriter.close();
}
//写resource里的文件,就这样写:"classpath:filename"
@Test
public void searchIndex() throws Exception {
// 1)创建一个Director对象,指定索引库的位置
Directory directory = FSDirectory.open(new File("/home/gaolei/JavaProgram/Learn-Lucene/src/main/resources/index").toPath());
// 2)创建一个IndexReader 对象
IndexReader indexReader = DirectoryReader.open(directory);
// 3)创建一个IndexSearcher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4)创建一个Query对象,TermQuery根据关键词查询
Query query = new TermQuery(new Term("content", "string"));
// 5)执行查询,得到一个TopDocs对象
//参数1查询对象 参数2:查询结果返回的最大记录数
TopDocs topd = indexSearcher.search(query, 10);
// 6)取查询结果的总记录数。
System.out.println("总记录数" + topd.totalHits);
// 7)取文档列表
ScoreDoc[] scoreDocs = topd.scoreDocs;
// 8)打印文档中的内容
for (ScoreDoc scoreDoc : scoreDocs) {
//取文档ID
int docId = scoreDoc.doc;
//根据ID 取文档对象
Document document = indexSearcher.doc(docId);
System.out.println(document.get("name"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
System.out.println("------------------------------------------");
}
// 9)关闭IndexReader对象
indexReader.close();
}
默认使用标准分析器,StandardAnalyzer。
使用Analyzer对象的tokenStream方法返回一个TokenStream对象,词对象中包含了最终分词结果。
实现步骤:
@Test
public void testTokenStream() throws Exception {
//1. 创建一个Analyzer对象,StandardAnalyzer对象
Analyzer analyzer = new StandardAnalyzer();
//2. 使用分析器对象的TokenStream方法获得一个TokenStream对象。
TokenStream tokenStream = analyzer.tokenStream("", "i want to fuck the world~");
//3. 向TokenStream对象中设置一个引用,相当于一个指针。
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
//4. 调用TokenStream对象的reset方法,如果不调用抛异常
tokenStream.reset();
//5. 使用while循环来遍历TokenStream对象
while (tokenStream.incrementToken()) {
System.out.println(charTermAttribute.toString());
}
//6. 关闭TokenStream对象。
tokenStream.close();
}
很棒的中文分词器
想使用ik分词器也很简单,在新建一个IndexWriterConfig对象的时候,传入一个ikAnalyzer对象参数进去就好。
原文:https://www.cnblogs.com/shiguangqingqingchui/p/12124870.html