maven配置:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId> <artifactId>lucene-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <lunece.version>6.1.0</lunece.version> </properties> <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>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies><build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build></project>
示例代码:
package com.k6k4.lucence; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.*; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.*; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.File; import java.io.IOException; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; public class Test { public static void main(String[] args) throws Exception { create(); testSearch(); } // 批量创建索引 public static void create() throws Exception{ // 创建文档的集合 Collection<Document> docs = new ArrayList<>(); // 创建文档对象 Document document1 = new Document(); document1.add(new StringField("id", "1", Field.Store.YES)); document1.add(new TextField("title", "谷歌地图之父跳槽facebook", Field.Store.YES)); docs.add(document1); // 创建文档对象 Document document2 = new Document(); document2.add(new StringField("id", "2", Field.Store.YES)); document2.add(new TextField("title", "谷歌地图之父加盟FaceBook", Field.Store.YES)); docs.add(document2); // 创建文档对象 Document document3 = new Document(); document3.add(new StringField("id", "3", Field.Store.YES)); document3.add(new TextField("title", "谷歌地图创始人拉斯离开谷歌加盟Facebook", Field.Store.YES)); docs.add(document3); // 创建文档对象 Document document4 = new Document(); document4.add(new StringField("id", "4", Field.Store.YES)); document4.add(new TextField("title", "谷歌地图之父跳槽Facebook与Wave项目取消有关", Field.Store.YES)); docs.add(document4); // 创建文档对象 Document document5 = new Document(); document5.add(new StringField("id", "5", Field.Store.YES)); document5.add(new TextField("title", "谷歌地图之父拉斯加盟社交网站Facebook", Field.Store.YES)); docs.add(document5); // 索引目录类,指定索引在硬盘中的位置 Directory directory = FSDirectory.open(Paths.get("d:\\indexDir")); // 引入IK分词器 Analyzer analyzer = new StandardAnalyzer(); // 索引写出工具的配置对象 IndexWriterConfig conf = new IndexWriterConfig( analyzer); // 设置打开方式:OpenMode.APPEND 会在索引库的基础上追加新索引。OpenMode.CREATE会先清空原来数据,再提交新的索引 conf.setOpenMode(IndexWriterConfig.OpenMode.CREATE); // 创建索引的写出工具类。参数:索引的目录和配置信息 IndexWriter indexWriter = new IndexWriter(directory, conf); // 把文档集合交给IndexWriter indexWriter.addDocuments(docs); // 提交 indexWriter.commit(); // 关闭 indexWriter.close(); } public static void testSearch() throws Exception { // 索引目录对象 Directory directory = FSDirectory.open(Paths.get("d:\\indexDir")); // 索引读取工具 IndexReader reader = DirectoryReader.open(directory); // 索引搜索工具 IndexSearcher searcher = new IndexSearcher(reader); // 创建查询解析器,两个参数:默认要查询的字段的名称,分词器 QueryParser parser = new QueryParser("title", new StandardAnalyzer()); // 创建查询对象 Query query = parser.parse("谷歌"); // 搜索数据,两个参数:查询条件对象要查询的最大结果条数 // 返回的结果是 按照匹配度排名得分前N名的文档信息(包含查询到的总条数信息、所有符合条件的文档的编号信息)。 TopDocs topDocs = searcher.search(query, 10); // 获取总条数 System.out.println("本次搜索共找到" + topDocs.totalHits + "条数据"); // 获取得分文档对象(ScoreDoc)数组.SocreDoc中包含:文档的编号、文档的得分 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for (ScoreDoc scoreDoc : scoreDocs) { // 取出文档编号 int docID = scoreDoc.doc; // 根据编号去找文档 Document doc = reader.document(docID); System.out.println("id: " + doc.get("id")); System.out.println("title: " + doc.get("title")); // 取出文档得分 System.out.println("得分: " + scoreDoc.score); } } }