lucene

倒排索引:

在这里插入图片描述

lucene:是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会提供和支持。

Lucene提供了一个简单却强大的应用程序接口(API),能够做全文索引和搜寻,在Java开发环境里Lucene是一个成熟的免费开放源代码工具

Lucene并不是现成的搜索引擎产品,但可以用来制作搜索引擎产品(相当于他是制作搜索引擎产品的工具)

 

Lucene、Solr、Elasticsearch之间的关系

Lucene:底层的API,工具包

Solr:基于Lucene开发的企业级的搜索引擎产品

Elasticsearch:基于Lucene开发的企业级的搜索引擎产品

 

 Lucene的基本使用

使用Lucene的API来实现对索引的增(创建索引)、删(删除索引)、改(修改索引)、查(搜索数据)

一.创建索引
创建索引的流程

文档Document:数据库中一条具体的记录

字段Field:数据库中的每个字段

目录对象Directory:物理存储位置

写出器的配置对象:需要分词器和lucene的版本

 

在idea的一个小案例

1.添加依赖:

<properties>
        <lunece.version>4.10.2</lunece.version>

    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </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>
        <dependency>
            <groupId>com.janeluo</groupId>
            <artifactId>ikanalyzer</artifactId>
            <version>2012_u6</version>
        </dependency>

    </dependencies>

2.

 //1 创建文档对象
//2 创建存储目录
//3 创建分词器
//4 创建索引写入器的配置对象
//5 创建索引写入器对象
//6 将文档交给索引写入器
//7 提交
//8 关闭

创建有多条文档的文件:

    @Test
    public void TestCreate(){

        try {
            ArrayList<Document> documents = new ArrayList<Document>();

            //1 创建多个文档对象
            Document document1 = new Document();
            document1.add(new StringField("id","1", Field.Store.YES));
            document1.add(new TextField("title","谷歌地图之父跳槽facebook",Field.Store.YES));
            documents.add(document1);

            Document document2 = new Document();
            document2.add(new StringField("id","2", Field.Store.YES));
            document2.add(new TextField("title","谷歌地图之父加盟FaceBook",Field.Store.YES));
            documents.add(document2);

            Document document3 = new Document();
            document3.add(new StringField("id","3", Field.Store.YES));
            document3.add(new TextField("title","谷歌地图创始人拉斯离开谷歌加盟Facebook",Field.Store.YES));
            documents.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));
            documents.add(document4);

            Document document5 = new Document();
            document5.add(new StringField("id","5", Field.Store.YES));
            document5.add(new TextField("title","谷歌地图之父拉斯加盟社交网站Facebook",Field.Store.YES));
            documents.add(document5);
            //2 创建存储目录
            FSDirectory directory = FSDirectory.open(new File("d:/lucenedata"));
            //3 创建分词器
            IKAnalyzer analyzer = new IKAnalyzer();
            //4 创建索引写入器的配置对象
            IndexWriterConfig config = new IndexWriterConfig(Version.LATEST,analyzer);
            //再运行项目时文件内容会被覆盖
            config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
            //5 创建索引写入器对象
            IndexWriter writer = new IndexWriter(directory, config);
            //6 将文档交给索引写入器
            writer.addDocuments(documents);
            //7 提交
            writer.commit();
            //8 关闭
            writer.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

3.根据索引进行查询:

    @Test
    public void TestSearch(){
        try {
            // 索引目录对象
            FSDirectory directory = FSDirectory.open(new File("d:/lucenedata"));
            // 索引读取工具,将数据全部读取到reader里
            DirectoryReader reader = DirectoryReader.open(directory);
            // 索引搜索工具
            IndexSearcher searcher = new IndexSearcher(reader);
            // 创建查询解析器,两个参数:默认要查询的字段的名称,分词器
            QueryParser parser = new QueryParser("title",new IKAnalyzer());
            // 创建查询对象
            Query query = parser.parse("谷歌");

            // 搜索数据,两个参数:查询条件对象要查询的最大结果条数
            // 返回的结果是 按照匹配度排名得分前N名的文档信息(包含查询到的总条数信息、所有符合条件的文档的编号信息)。
            TopDocs topdocs = searcher.search(query, 4);
            System.out.println("本次搜索共找到" + topdocs.totalHits + "条数据");
            // 获取得分文档对象(ScoreDoc)数组.SocreDoc中包含:文档的编号、文档的得分
            ScoreDoc[] scoreDocs = topdocs.scoreDocs;
            for (ScoreDoc scoreDoc :scoreDocs){
                //取出文档编号
             int DocID= scoreDoc.doc;
//                System.out.println("id......"+DocID);

             //利用编号去找文档
                Document doc = reader.document(DocID);
                System.out.println(doc.get("id"));
                System.out.println(doc.get("title"));



            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值