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》,描述了全文检索的一般过程。

这里写图片描述

这里写图片描述

简单说明下索引的过程

  • 收集数据
  • 词条化,包括去除停顿词、转换小写、复数还原等等,最终转化成可索引的标准文本
  • 写入索引文件

当然在实际应用过程中很复杂。


倒排索引

倒排索引,顾名思义,它相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成——词典和倒排表。

这里写图片描述

这里写图片描述

这里写图片描述

原创粉丝点击