MAVEN地址
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>9.1.0</version>
</dependency>
生成Lucene索引文件
public void createLuceneIndex() throws IOException {
//设置lucene索引存储的文档位置
String newLuceneIndexPath = "../indexFolderPath";
// 1.创建Directory对象,设置索引文件地址
Directory directory = FSDirectory.open(new File(newLuceneIndexPath).toPath());
// 2.生成Directory对象的IndexWriter索引编辑器对象
IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig());
// 3.设置存储数据的类型
//作为索引KEY类型
FieldType indexKeyFieldType = new FieldType();
indexKeyFieldType.setIndexOptions(IndexOptions.DOCS);//设置索引选项
indexKeyFieldType.setStored(true);//是否储存
indexKeyFieldType.setTokenized(false);//是否分词
//作为索引VALUE类型
FieldType indexValFieldType= new FieldType();
indexValFieldType.setStored(true);//是否储存
indexValFieldType.setTokenized(false);//是否分词
Field field1 = new Field("INDEX_KEY", "key", indexKeyFieldType);//KEY
StoredField field2 = new StoredField("SORT_KEY", "1", indexKeyFieldType);//排序KEY
SortedDocValuesField sortField = new SortedDocValuesField("SORT_KEY", new BytesRef("1"));//排序文档值设置
Field field3 = new Field("IN_KEY", "inkey", indexValFieldType);//IN QUERY KEY
Field field4 = new Field("INDEX_VALUE", "value", indexValFieldType);//值设置
Document fileDocument = new Document();
// 4.设置索引添加到文档中
fileDocument.add(field1);
fileDocument.add(field2);
fileDocument.add(sortField);
fileDocument.add(field3);
fileDocument.add(field4);
// 5.将文档加入到索引库中
indexWriter.addDocument(fileDocument);
// 6.关闭打开的资源
indexWriter.close();
directory.close();
}
查询索引文件
public void selectIndex()throws IOException {
//1.Directory对象做成
Directory directory = FSDirectory.open(new File("../indexFolderPath").toPath());
//2.生成Directory对象的IndexWriter索引编辑对象
IndexReader indexReader = DirectoryReader.open(directory);
//3.生成IndexSearcher对象的indexReader索引读取对象
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
//4.查询对象query做成,指定查询的属性和对应的值
Query query =new TermQuery(new Term("INDEX_KEY", "key"));
//in search
BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder();
booleanQueryBuilder.add(query, Occur.MUST);//必须
// in条件
BooleanQuery.Builder booleanShouldQueryBuilder = new BooleanQuery.Builder();
Query inQuery1 =new TermQuery(new Term("IN_KEY", "inkey1"));
booleanShouldQueryBuilder.add(inQuery1, Occur.SHOULD);//or
Query inQuery2 =new TermQuery(new Term("IN_KEY", "inkey2"));
booleanShouldQueryBuilder.add(inQuery2, Occur.SHOULD);//or
booleanQueryBuilder.add(booleanShouldQueryBuilder.build(), Occur.MUST);
//5.获取查询对象
TotalHitCountCollector counter = new TotalHitCountCollector();
indexSearcher.search(booleanQueryBuilder.build(),counter);
if (counter.getTotalHits() !=0) {
TopDocs topDocs = indexSearcher.search(booleanQueryBuilder.build(), counter.getTotalHits());
//6.循环查询
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for(ScoreDoc s:scoreDocs) {
int id = s.doc;
Document document = indexSearcher.doc(id);
String key = document.get("INDEX_KEY");
System.out.println(key);
}
}
//7.关闭资源
indexReader.close();
}