跟我一起云计算(4)——lucene

简介: 了解lucene的基本概念 这一部分可以参考我以前写的博客: http://www.cnblogs.com/skyme/tag/lucene/ lucene是什么 下图是一个很好的说明: 1、lucene是构建索引、查询、高亮、拼写检查的类库。

了解lucene的基本概念

这一部分可以参考我以前写的博客:

http://www.cnblogs.com/skyme/tag/lucene/

lucene是什么

下图是一个很好的说明:

image

1、lucene是构建索引、查询、高亮、拼写检查的类库。

2、它不是一个爬虫。

3、不提供分布式的索引。

lucene全文搜索处理流程

image

lucene的索引和查询

这是用4.6版本构建的lucene构建索引和查询的示例:

public static void main(String[] args) throws IOException, ParseException {
        // 一、创建索引
        // 内存索引模板
        Directory dir = new RAMDirectory();
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);

        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46,
                analyzer);
        IndexWriter indexWriter = new IndexWriter(dir, config);

        Document doc = new Document();
        String title = "标题";
        String content = "被索引的内容";
        Field f1 = new Field("title", title, TextField.TYPE_STORED);
        Field f2 = new Field("content", content, TextField.TYPE_STORED);
        doc.add(f1);
        doc.add(f2);

        indexWriter.addDocument(doc);
        indexWriter.close();

        // 二、搜索
        DirectoryReader directoryReader = DirectoryReader.open(dir);
        IndexSearcher indexSearcher = new IndexSearcher(directoryReader);

        QueryParser parser = new QueryParser(Version.LUCENE_46, "content",
                analyzer);
        Query query = parser.parse("内容");

        TopDocs topDocs = indexSearcher.search(query, null, 100);
        ScoreDoc[] hits = topDocs.scoreDocs;

        System.out.println("查询结果数:" + hits.length);

        for (int n = 0; n < hits.length; n++) {
            Document hitDoc = indexSearcher.doc(hits[n].doc);
            System.out.println("搜索的结果title:" + hitDoc.get("title"));
        }
    }

上面是一个简单的在内存中构建索引并且进行查询的例子。

然后看一下lucene索引用到的类:

image

再看一下查询用到的类:

image

理解索引过程

索引的过程可以简述为:

image

lucene加权

这部分内容可以参考:

http://www.cnblogs.com/hongten/archive/2013/02/01/hongten_lucene_baidu.html

Directory子类

FSDirectory

FSDirectory是Lucene对文件系统的操作,它有下面三个子类SimpleFSDirectory、MmapDirectory、NIOFSDirectory;

FSDirectory是一个抽象类,具体实现由子类来完成。

1、SimpleFSDirectory

最简单的FSDirectory子类,使用java.io.*API将文件存入文件系统中,不能很好支持多线程操作。因为要做到这点就必须在内部加入锁,而java.io.*并不支持按位置读取。

2、NIOFSDirectory

使用java.io.*API所提供的位置读取接口,能很好的支持除Windows之外的多线程操作,原因是Sun的JRE在Windows平台上长期存在问题。

   NIOFSDirectory在Windows操作系统的性能比较差,甚至可能比SimpleFSDirecory的性能还差。

3、MmapDirectory

使用内存映射的I/O接口进行读操作,这样不需要采取锁机制,并能很好的支持多线程读操作。但由于内存映射的I/O所消耗的地址空间是与索引尺寸相等,所以建议最好只是用64位JRE。

QueryParser

queryparser的解析过程:

image

1、使用queryparser完成解析搜索请求

2、基本格式如:

QueryParser parser=new QueryParser("字段名称","分析器实例");

Query q=parser.parse("关键词")

3、例如:解析一个关键字太阳

QueryParser parser=new QueryParser("context",new StandardAnalyzer());

Query q=parser.parse("太阳");

IndexSearcher searcher=new IndexSearcher(indexpath);

Hits hit=searcher.search(q);

4、解析多个关键字太阳、月亮

QueryParser parser=new QueryParser("context",new StandardAnalyzer());

Query q=parser.parse("太阳 月亮");

IndexSearcher searcher=new IndexSearcher(indexpath);

Hits hit=searcher.search(q);

4、带参数的多个关键字解析

QueryParser parser=new QueryParser("context",new StandardAnalyzer());

Query q=parser.parse("太阳 月亮");

parser.setDefaultOperator(QueryParser.Opertator.AND);//同时含有多个关键字,如果是QueryParser.Opertator.OR表示或者

IndexSearcher searcher=new IndexSearcher(indexpath);

Hits hit=searcher.search(q);

IndexSearcher

下图是搜索用到的相关的类:

image

lucene的扩展工程

1、solr

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。

image

2、ElasticSearch

ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。支持通过HTTP使用JSON进行数据索引。

image

3、IndexTank

IndexTank是一套基于Java的索引-实时全文搜索引擎实现,它的设计分离了相关性标记和文档内容,因为相关性标记的生命周期和文档本身是不一样的,特别是在用户创建的内容的情况下,例如分享次数,Like按钮,+1按钮等等。

4、Katta

Katta是一个可扩展的、故障容错的、分布式实施访问的数据存储。

Katta可用于大量、重复、索引的碎片,以满足高负荷和巨大的数据集。这些索引可以是不同的类型。当前该实现在Lucene和Hadoop mapfiles。

image

5、bobo-browse

bobo-browse是一用java写的lucene扩展组件,通过它可以很方便在lucene上实现分组统计功能。

比如说搜索电脑,可以得到cpu是intel的有几条命中记录,cpu是amd的有几条命中记录。

6、Compass

Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架。Compass包括:

  • 搜索引擎抽象层(使用Lucene搜索引荐),
  • OSEM(Object/Search Engine Mapping)支持,
  • 事务管理,
  • 类似于Google的简单关键字查询语言,
  • 可扩展与模块化的框架,
  • 简单的API

7、Summa

Summa是一种由java开发的,快速模块化和可扩展的搜索引擎。Summa有如下特点:

  • 综合搜索Summa能够同时访问许多不同的数据和资料来源,并以一个统一的接口公开
  • 模块化设计Summa搜索系统由一系列独立模块组成,这样使得它更简单容易地被维护和升级
  • 可扩展性Summa支持分布式架构而且能够按比例的扩大或缩小以处理任何数量的数据
  • 开放标准Summa基于现代web技术与标准,不包含任何私有代码或原理
  • 故障容错如果某单一数据资源或服务出错,Summa将会继续运行而不受出错部分限制

8、Constellio

Constellio是一个开源的搜索解决方案,适合企业级的搜索。基于Apache Solr项目构建,使用Lucene做为搜索引擎,并提供基于Web的网页和文档的检索。可选择文档类型、文件夹以及文件名进行检索。

应用

下面给出一个我们实际过程中的使用模型,用于比对系统中的类目关系:

类目品牌匹配过滤

上图中的匹配过滤功能使用lucene完成。

目录
相关文章
|
1月前
|
运维 Cloud Native Apache
云计算新宠:探索Apache Doris的云原生策略
云计算新宠:探索Apache Doris的云原生策略
32 2
|
4月前
|
存储 弹性计算 大数据
【云计算与大数据技术】Google、亚马逊、IBM、阿里云等云计算应用平台介绍讲解(超详细)
【云计算与大数据技术】Google、亚马逊、IBM、阿里云等云计算应用平台介绍讲解(超详细)
161 0
|
11月前
|
存储 缓存 监控
【云计算技术】Salesforce 5大性能问题
【云计算技术】Salesforce 5大性能问题
|
存储 数据采集 分布式计算
云计算之分布式计算
云计算之分布式计算
334 0
云计算之分布式计算
|
存储 机器学习/深度学习 人工智能
云计算、大数据已经过时?不,正是因为它们RPA才能大流行
云计算、大数据已经过时?不,正是因为它们RPA才能大流行 站在云计算、大数据、人工智能的肩膀上,RPA才能走得更远
184 0
云计算、大数据已经过时?不,正是因为它们RPA才能大流行
|
弹性计算 分布式计算 物联网
分布式计算——云计算
本文章说明了自我介绍、ECS使用攻略以及使用阿里云的总结收获和未来展望。
|
大数据 数据处理 分布式计算
Google的大数据为什么这么牛逼?
近年来,大数据技术的发展,不论是技术迭代,还是生态圈的繁荣,都远超我们的想象。从 Spark 成为 Hadoop 生态的一部分,到 Flink 横空出世挑战 Spark 成为大数据处理领域的新星,再到如今 Google 又决心用 Apache Beam 一统天下。大数据技术的发展可谓跌宕起伏,波澜壮
1052 0
|
安全 数据安全/隐私保护 云计算
Google的云计算,你真的安全吗?
Google文档在3月7日发生了大批用户文件外泄事件。美国隐私保护组织就此提请政府对Google采取措施,使其加强云计算产品的安全性。 云计算可以让用户在全球任何一个角落更新文档,并与他人共享。
1204 0
|
存储 数据中心 云计算
Google 云计算的灾难恢复技术
灾难恢复是个令人不快的话题,但必须面对。拿一个公司的邮件系统为例,有的公司会对过去的邮件进行备份,备份的频率或许是每日或每周,灾难发生后,将备份的数据恢复到系统,尽管可以恢复一些,但这种周期性的备份只保证已备份的数据的安全,最近一次备份到灾难发生之间的数据却是彻底没有了。
973 0
|
运维 监控 安全
云计算简介
云计算简介: 云计算:一群提供服务的计算机的整体 提供服务(通信网络) 云服务:用户按需消费、使用 云计算运维做什么: 7*24 小时快速响应 故障处理 备份恢复 系统安全 软件部署 监控报警 架构调优 统计分析 脚本开发(自动化) 发展方向: 资深运.
1529 0