lucene官網:http://lucene.apache.org/
引入maven:
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.2.0</version>
</dependency>
1、創建索引
@Test
public void testCreate() throws Exception {
Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, config);
File file = new File("/Users/raoleilei/Downloads/jar");
File[] listFiles = file.listFiles();
for (File file1 : listFiles) {
Document document = new Document();
String fileName = file1.getName();
Field fieldName = new TextField("fileName", fileName, Field.Store.YES);
String filePath = file1.getPath();
Field fieldPath = new StoredField("filePath", filePath);
document.add(fieldName);
document.add(fieldPath);
indexWriter.addDocument(document);
}
indexWriter.close();
}
索引文件的查看:luke,https://github.com/DmitryKey/luke
2、刪除索引
@Test
public void testDelete()throws Exception{
Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
Query query = new TermQuery(new Term("fileName","java"));
Query query1 = new TermQuery(new Term("fileName","jar"));
indexWriter.deleteDocuments(query,query1);
indexWriter.close();
}
3、修改索引
@Test
public void testUpdate()throws Exception{
Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
Document document = new Document();
document.add(new TextField("fileA","你好",Field.Store.YES));
document.add(new TextField("fileB","世界",Field.Store.YES));
indexWriter.updateDocument(new Term("fileName","jenkins.war"),document);
indexWriter.close();
}
4、查詢索引
搜索使用的分詞器要和索引使用的分詞器一致。
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>8.2.0</version>
</dependency>
@Test
public void testQuery() throws Exception {
Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
Query query = new TermQuery(new Term("fileName", "jar"));
System.err.println(query);
TopDocs topDocs = indexSearcher.search(query, 2);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
System.err.println(document.get("fileName"));
System.err.println(document.get("filePath"));
}
indexReader.close();
}
@Test
public void testQueryAll() throws Exception {
Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
Query query = new MatchAllDocsQuery();
System.err.println(query);
print(indexSearcher, query);
indexReader.close();
}
@Test
public void test1() throws Exception {
Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
QueryParser queryParser = new QueryParser("fileName", new StandardAnalyzer());
Query query = queryParser.parse("fileName:java AND fileName:8.0.13");
System.err.println(query);
print(indexSearcher, query);
indexReader.close();
}
@Test
public void test2() throws Exception {
Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
String[] filed = {"fileName", ""};
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(filed, new StandardAnalyzer());
Query query = queryParser.parse("fileName:java AND fileName:8.0.13");
System.err.println(query);
print(indexSearcher, query);
indexReader.close();
}
public void print(IndexSearcher indexSearcher, Query query) throws Exception {
TopDocs topDocs = indexSearcher.search(query, 10);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
System.err.println(document.get("fileName"));
System.err.println(document.get("filePath"));
}
}
QueryParser 語法
1、基礎的查詢語法,關鍵字查詢:
域名+“:”+搜索的關鍵字,例如:fileName:java
2、範圍查詢:
域名+“:”+[最大值 TO 最小值],例如:size:[1 TO 100]
範圍查詢在lucene中支持數值類型,不支持字符串類型,在solr中支持字符串類型
3、組合條件查詢
必須滿足 +(AND)
可選 空格(OR)
不能滿足 -(NOT)