Lucene简介
来源:互联网 发布:oracle mysql 数据同步 编辑:程序博客网 时间:2024/06/08 17:40
简单介绍
Lucene is a Java full-text search engine. Lucene is not a complete application, but rather a code library and API that can easily be used to add search capabilities to applications.
这个是官网的介绍,来自:http://lucene.apache.org/core/7_1_0/index.html。简单来说即:Lucene是Apache下高性能,功能齐全的开源全文检索引擎工具包。
我们大概看看它的目录结构:
简单说明下几个核心库:
- core: lucene-core-7.1.0.jar,包括了常用的文档,索引,搜索,存储等相关核心代码。
analysis: 包括几种分析器,在这里我们使用通用的lucene-analyzers-common-7.1.0.jar即可。在中文方面比较出名的有:IK、庖丁,大家有兴趣可以了解下。
docs: 官方文档,包括一些入门教程。学新东西,推荐看官方文档一手资料,错误少而且还能学英语。
highlighter: 在搜索结果中高亮检索关键词。
queries: Lucene核心中用到的过滤器和查询器。
queryparser: 解析器和解析框架。
简单例子
我们先使用一个简单的文本索引、检索来实战下,对一个文件夹内的内容进行索引的创建,并根据关键字筛选文件,并读取其中的内容。
创建索引:
package cn.symon.lucene.base;import java.nio.file.Paths;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.document.TextField;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;public class IndexText { public static void main(String[] args) { try {// String text = "This is the text to be indexed.";// String text = "Welcome to Lucene world.";// String text = "Welcome to Hangzhou.";// String text = "A has indexed. B has indexed"; String text = "Welcome to Indexed world. It's very interesting!"; String indexDir = "textIndex"; // 1、打开存储目录,这里使用的是文本系统存储的,对应内存存储:RAMDirectory Directory dir = FSDirectory.open(Paths.get(indexDir)); // 2、使用标准通用的分析器,如果要对处理中文,请使用IK、庖丁,否则分词不准确 Analyzer analyzer = new StandardAnalyzer(); // 3、索引配置信息 IndexWriterConfig conf = new IndexWriterConfig(analyzer); // 4、构建索引器 IndexWriter indexWriter = new IndexWriter(dir, conf); // 4、构造待索引的文档 Document doc = new Document(); doc.add(new Field("content", text, TextField.TYPE_STORED)); // 5、将文本添加到索引中 indexWriter.addDocument(doc); // 6、释放资源 indexWriter.close(); dir.close(); } catch (Exception e) { e.printStackTrace(); } }}
进行查询:
package cn.symon.lucene.base;import java.nio.file.Paths;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.index.IndexReader;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;public class SearchText { public static void main(String[] args) { try { String indexDir = "textIndex"; String field = "content";// String keyword = "indexed";// String keyword = "Welcome"; // String keyword = "symon"; String keyword = "Hangzhou"; // 1、打开存储目录,这里使用的是文本系统存储的,对应内存存储:RAMDirectory Directory dir = FSDirectory.open(Paths.get(indexDir)); // 2、构建检索器 IndexReader indexReader = DirectoryReader.open(dir); IndexSearcher searcher = new IndexSearcher(indexReader); // 3、使用标准通用的分析器,如果要对处理中文,请使用IK、庖丁,否则分词不准确 Analyzer analyzer = new StandardAnalyzer(); // 4、构建查询器 QueryParser parser = new QueryParser(field, analyzer); Query query = parser.parse(keyword); // 5、根据关键词搜索2条文档的id TopDocs topDocs = searcher.search(query, 3); for(ScoreDoc scoreDoc : topDocs.scoreDocs) { // 根据文档id获取文档 Document doc = searcher.doc(scoreDoc.doc); System.out.println("result text: " + doc.get(field) + ", score: " + scoreDoc.score); } // 6、释放资源 indexReader.close(); dir.close(); } catch (Exception e) { e.printStackTrace(); } }}
maven依赖:
<dependencies> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>7.1.0</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>7.1.0</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>7.1.0</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-demo</artifactId> <version>7.1.0</version> </dependency> </dependencies>
简单过程
下面这幅图来自《Lucene in action》,描述了全文检索的一般过程。
简单说明下索引的过程
- 收集数据
- 词条化,包括去除停顿词、转换小写、复数还原等等,最终转化成可索引的标准文本
- 写入索引文件
当然在实际应用过程中很复杂。
倒排索引
倒排索引,顾名思义,它相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成——词典和倒排表。
- Lucene简介&Lucene示例
- Lucene简介&Lucene示例
- Lucene简介&Lucene示例
- LUCENE简介
- lucene简介
- Lucene 简介
- lucene--简介
- lucene 简介
- Lucene简介
- Lucene 简介
- Lucene简介
- Lucene简介
- lucene--简介
- Lucene 简介
- Lucene简介
- lucene简介
- lucene简介
- Lucene 简介
- debian 8.2 + apt-get + mongodb 3.2 + replica set
- JavaScript函数参数的传递
- 423. Reconstruct Original Digits from English
- 通过 jdk 自带的编、解码器进行BASE64编码、解码
- Java 常用异常整理
- Lucene简介
- React Native的按钮详解
- 05_留意i--与System.out.println()在多线程中的异常
- transform 和transition
- Git 常用命令
- Git工作流(Gitflow)管理
- Android ijkplayer的使用解析
- C++创建类并应用
- Android常用依赖包