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

【承接上文】
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值