分享

Lucene简单实现文件索引及查询

 昵称33542116 2020-02-03

【承接上文】
1、问:Lucene优点?
答:a、Lucene定义了一套以9字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
b、在传统倒排索引的基础上,实现了分块索引。
【ps:这里说明一下什么是倒排索引】
实际应用中需要根据属性值来查找记录,这种索引表中的每一项都包括一个属性值和对应的记录地址。由于是由属性值来确定记录位置,因而被称为倒排索引。
c、用户无需编写代码即可使用系统强大的查询能力,默认实现布尔、模糊、分组查询等。
d、虽然Lucene使用Java语言,但是开源之后就有许多大牛使得其能运行在各种各样的平台上。
2、问:能不能别整那些虚头巴脑的,整点代码不香吗?
答:香,好滴。以idea为例。
《1、idea搭建项目》看图:
Lucene简单实现文件索引及查询Lucene简单实现文件索引及查询Lucene简单实现文件索引及查询Lucene简单实现文件索引及查询Lucene简单实现文件索引及查询
《2、添加Lucene依赖》:

<properties> <java.version>1.8</java.version> <lunece.version>4.10.2</lunece.version></properties><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!-- 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></dependencies>

《3、实例代码》

package frozen;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.StringField;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;import org.apache.lucene.util.Version;import org.junit.Test;import java.io.File;/** * 思路: * 1、创建文档对象 * 2、创建存储目录 * 3、创建分词器 * 4、索引 * 5、将文档交给索引 * 6、提交与关闭 * Frozen * 2020-2-2 */public class Frozen {        @Test        public void frozenLucene() throws Exception{                //1、创建文档对象                Document document = new Document();                /*                创建并添加字段信息。                参数:字段的名称、字段的值、是否存储,                Store.YES代表存储到文档列表。                Store.NO代表不存储                 */                document.add(new StringField('id', '1', Field.Store.YES));                /*                这里我们title字段需要用TextField,                即创建索引又会被分词。StringField会创建索引,但是不会被分词                 */                document.add(new TextField('title', '爸妈省心、自己舒心,10万级热门家轿推荐!', Field.Store.YES));                //2 索引目录类,指定索引在硬盘中的位置                Directory directory = FSDirectory.open(new File('E:\\frozen'));                //3 创建分词器对象                Analyzer analyzer = new StandardAnalyzer();                //4 索引写出工具的配置对象                IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, analyzer);                //5 创建索引的写出工具类。参数:索引的目录和配置信息                IndexWriter indexWriter = new IndexWriter(directory, conf);                //6 把文档交给IndexWriter                indexWriter.addDocument(document);                //7 提交                indexWriter.commit();                //8 关闭                indexWriter.close();                System.err.println('测试结束!!!');        }}

Lucene简单实现文件索引及查询
到这里,简单的一个Lucene文件索引就完成了
【你要查看索引可以利用工具,这里不做说明】
《4、IK分词器(重要)》
IK提供两种分词模式:智能模式和细粒度模式(智能:对应es的IK插件的ik_smart,细粒度:对应es的IK插件的ik_max_word)。
IK分词添加依赖
Lucene简单实现文件索引及查询
《5、查询Lucene索引》

/** 1、读取目录对象、2、索引读取工具、 3、索引搜索工具、4、查询解析器、5、查询对象、 6、开始搜索、7、其他 */ @Test public void frozenSearch() throws Exception { // 索引目录对象 Directory directory = FSDirectory.open(new File('E:\\frozen')); // 索引读取工具 IndexReader reader = DirectoryReader.open(directory); // 索引搜索工具 IndexSearcher searcher = new IndexSearcher(reader); // 创建查询解析器,两个参数:默认要查询的字段的名称,分词器 QueryParser parser = new QueryParser('title', new IKAnalyzer()); // 创建查询对象 Query query = parser.parse('10万级'); // 搜索数据,两个参数:查询条件对象要查询的最大结果条数 // 返回的结果是 按照匹配度排名得分前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); } }

Lucene简单实现文件索引及查询

《6、Lucene核心API》
1、QueryParser(单一字段的查询解析器)
2、MultiFieldQueryParser(多字段的查询解析器)
3、IndexSearch可以帮助我们实现:快速搜索、排序、打分等功能
4、通过IndexSearcher对象,我们可以搜索,获取结果:TopDocs对象
在TopDocs中,包含两部分信息:int totalHits :查询到的总条数、ScoreDoc[] scoreDocs : 得分文档对象的数组
5、ScoreDoc是得分文档对象,包含两部分数据:int doc :文档的编号----lucene给文档的一个唯一编号;float score :文档的得分信息
拿到编号后,我们还需要根据编号来获取真正的文档信息
【还有,查询结果高亮显示:略!】

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多