|
Java使用Lucene实现全文检索的完整示例代码,包含索引创建和搜索功能
LuceneDemo.java
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.analysis.standard.StandardAnalyzer;
- import org.apache.lucene.document.*;
- import org.apache.lucene.index.*;
- import org.apache.lucene.search.*;
- import org.apache.lucene.store.Directory;
- import org.apache.lucene.store.FSDirectory;
- import java.nio.file.Paths;
- public class LuceneDemo {
- // 创建索引
- public static void createIndex(String indexPath, String[] docs) throws Exception {
- Directory dir = FSDirectory.open(Paths.get(indexPath));
- Analyzer analyzer = new StandardAnalyzer();
- IndexWriterConfig config = new IndexWriterConfig(analyzer);
- IndexWriter writer = new IndexWriter(dir, config);
- for (String doc : docs) {
- Document document = new Document();
- document.add(new TextField("content", doc, Field.Store.YES));
- document.add(new StringField("id", "doc" + System.currentTimeMillis(), Field.Store.YES));
- writer.addDocument(document);
- }
- writer.close();
- }
- // 执行搜索
- public static void search(String indexPath, String queryStr) throws Exception {
- Directory dir = FSDirectory.open(Paths.get(indexPath));
- IndexReader reader = DirectoryReader.open(dir);
- IndexSearcher searcher = new IndexSearcher(reader);
-
- Analyzer analyzer = new StandardAnalyzer();
- QueryParser parser = new QueryParser("content", analyzer);
- Query query = parser.parse(queryStr);
- TopDocs results = searcher.search(query, 10);
- System.out.println("找到 " + results.totalHits + " 个结果");
-
- for (ScoreDoc scoreDoc : results.scoreDocs) {
- Document doc = searcher.doc(scoreDoc.doc);
- System.out.println("ID: " + doc.get("id"));
- System.out.println("内容: " + doc.get("content"));
- System.out.println("得分: " + scoreDoc.score);
- }
- reader.close();
- }
- public static void main(String[] args) throws Exception {
- String indexPath = "lucene_index";
- String[] docs = {
- "华为荣耀8手机",
- "苹果iPhone 13 Pro Max",
- "三星Galaxy S22 Ultra"
- };
-
- createIndex(indexPath, docs);
- search(indexPath, "华为 OR 苹果");
- }
- }
复制代码该示例演示了Lucene的基本使用流程,包括索引创建和搜索功能。 对于更复杂的搜索需求,以下是布尔查询的示例代码: BooleanQueryDemo.java - public class BooleanQueryDemo {
- public static void main(String[] args) throws Exception {
- Directory dir = FSDirectory.open(Paths.get("lucene_index"));
- IndexReader reader = DirectoryReader.open(dir);
- IndexSearcher searcher = new IndexSearcher(reader);
- // 创建多个子查询
- TermQuery query1 = new TermQuery(new Term("content", "华为"));
- TermQuery query2 = new TermQuery(new Term("content", "苹果"));
-
- // 构建布尔查询
- BooleanQuery.Builder builder = new BooleanQuery.Builder();
- builder.add(query1, BooleanClause.Occur.SHOULD); // OR条件
- builder.add(query2, BooleanClause.Occur.SHOULD);
-
- TopDocs results = searcher.search(builder.build(), 10);
- // 处理结果...
- }
- }
复制代码此代码展示了如何使用BooleanQuery实现"与或非"逻辑查询
如果需要实现范围查询,可以使用以下代码
RangeQueryDemo.java
- public class RangeQueryDemo {
- public static void main(String[] args) throws Exception {
- // 创建数值范围查询
- Query priceQuery = LongPoint.newRangeQuery("price", 1000, 5000);
-
- // 创建日期范围查询
- Query dateQuery = LongPoint.newRangeQuery("date",
- LocalDate.of(2025,1,1).toEpochDay(),
- LocalDate.of(2025,12,31).toEpochDay());
- }
- }
复制代码范围查询适用于数值和日期类型的字段过滤。 以上代码展示了Lucene的核心功能实现,包括基本搜索、布尔查询和范围查询等常见场景。实际应用中还需要考虑中文分词优化(如使用IKAnalyzer)、索引优化和搜索结果高亮等高级功能
|
|