搜索引擎学习总结

1.正向索引和反向索引

正向索引:也叫正排索引,正向索引是先遍历查找文档,然后在然后再文档内容中匹配搜索关键字,这种方法是遍历扫描方法,数据量大就会造成搜索慢的结果。

反向索引:也叫倒排索引,倒排索引结构包括索引和文档两部分,索引部分是经过分词之后存储的,倒排索引先在索引中匹配关键字,然后关联到对应的文档。常用于索引引擎

2.Lucene介绍

Lucene 是 Apache 软件基金会 Jakarta 项目组的一个子项目 ,使用Java开发,是一个成熟且免费开源的全文索引工具包,可以嵌入到各种应用中实现全文索引功能。就其本身而言,Lucene 是当前以及最近几年最受欢迎的免费 Java 信息检索程序库,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,定义了完整的搜索流程和索引流程。下图是Lucene的一个全文索引流程:

2.1核心概念

  • Index:一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时 候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。

  • Segment:segment是索引中最小的独立存储单元,一个索引文件由一个或多个段组成。segment帮忙动态更新索引,接耦了索引的读写逻辑。

  • Document:一个文档是一个可被索引的基础信息单元,也就是一条数据 ,比如:你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示,它由一个或者多个域(Field)组成。

  • Field:相当于是数据表的字段,对文档数据根据不同属性进行的分类标识,它是Document的组成部分,由名称(name)和值(value)组成。

  • Term:它是搜索的基本单位,一个Field会由一个或多个Term组成,Term是由Field经过Analyzer(分词器)产生,包含了分词内容和分词所属Field。

2.2索引流程

代码示例:
public void createIndex() throws Exception {
    // 采集数据
    BookDao dao = new BookDaoImpl();
	List<Book> list = dao.queryBooks();

    // 将采集到的数据封装到Document对象中
    List<Document> docList = new ArrayList<>();
    Document document;
    for (Book book : list) {
        document = new Document();
        // store:如果是yes,则说明存储到文档域中
        // 图书ID
        Field id = new TextField("id", book.getId().toString(), Store.YES);
        // 图书名称
        Field name = new TextField("name", book.getName(), Store.YES);
        // 图书价格
        Field price = new TextField("price", book.getPrice().toString(),Store.YES);
        // 图书图片地址
        Field pic = new TextField("pic", book.getPic(), Store.YES);
        // 图书描述
        Field description = new TextField("description",book.getDescription(), Store.YES);
    
        // 将field域设置到Document对象中
        document.add(id);
        document.add(name);
        document.add(price);
        document.add(pic);
        document.add(description);
    
        docList.add(document);
    }
    // 创建分词器,标准分词器
    Analyzer analyzer = new StandardAnalyzer();
    // 创建IndexWriter
    IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3,
                                                  analyzer);
    // 指定索引库的地址
    File indexFile = new File("\\Users\\demoyhui\\workspace");
    Directory directory = FSDirectory.open(indexFile);
    IndexWriter writer = new IndexWriter(directory, cfg);
    
    // 通过IndexWriter对象将Document写入到索引库中
    for (Document doc : docList) {
        writer.addDocument(doc);
    }
    // 关闭writer
    writer.close();
}
分析器:

分析器由一个分词器(Tokenizer)和零个或多个过滤器(TokenFilter)组成。主要包含下面的过程:

  • 将一块文本分成适合于倒排索引的独立的词条

  • 将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall 分析器执行上面的工作。

分析器就是在一个包里面组合了三种函数的一个包装器, 三种函数按照顺序被执行:

  • 字符过滤器:它的任务是在分词前整理字符串,比如一个字符过滤器可以用来去掉 HTML标签,或者将 & 转化成等;

  • 分词器:一个分析器有且仅一个分词器,分词器把字符串分解成词汇单元(token),并输出token流;

  • Token 过滤器:token流按照顺序通过每个 token 过滤器,这个过程会进行一些符号过滤、停用词过滤以及大小写转换等。

同一个域中相同的语汇单元(Token)对应同一个Term(词),它记录了语汇单元的内容及所在域的域名等,还包括来该token出现的频率及位置。

  • 不同的域中拆分出来的相同的单词对应不同的term

  • 相同的域中拆分出来的相同的单词对应相同的term

索引文件逻辑结构
索引文件物理结构

正排信息存储在:段(segments_N) -> field (.fnm/.fdx/.fdt) -> term (./tvx/.tvd/.tvf) 倒排信息存储在:term(.tim) ->document(.doc/.pos)

2.3搜索流程

相关度排序

搜索匹配到的多个文档集需要根据相关度进行先后排序,相关度越高的文档排序就会越靠前,TF-IDF是一个搜索领域最常用的相关度计算算法

TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。

1)词频计算:

考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化。

2)计算逆文档频率:

3)TF-IDF计算:

可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语料库文档中的出现次数成反比

3.搜索引擎简介

目前市面上流行的搜索引擎软件,主流的就两款:Elasticsearch 和 Solr,这两款都是基于Lucene 搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作 修改、添加、保存、查询等等都十分类似。

3.1 Solr

Solr是apache的顶级开源项目,它是使用java开发,基于lucene的全文检索服务器,同时比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化,Solr是一个全文检索服务器,可以单独对外提供搜索和索引功能。

SolrCloud是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。

3.2 ElasticSearch

和Solr一样ElasticSearch也是一个基于Lucene库的搜索引擎。同样使用Java开发的,同时它是一个分布式、高扩展、高实时的搜索与数据分析引擎。

3.3 OpenSearch

OpenSearch是AWS基于 Elasticsearch的开源分支推出的项目,OpenSearch 项目由 OpenSearch (fork ElasticSearch 7.10.2) 和 OpenSearch Dashboards (fork Kibana 7.10.2) 组成,包括企业安全、告警、机器学习、SQL、索引状态管理等功能。OpenSearch 项目中的所有软件均采用了 Apache License 2.0 开源许可协议。

参考:

https://36kr.com/p/1391055344270083

https://www.oschina.net/news/137178/aws-opensearch

4.ElasticSearch

4.1核心概念

在ElasticSearch中,除了在Lucene中介绍的一些核心概念,还需要了解以下一些概念:

  • Type:在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。

  • Mapping:mapping 是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引、是否被存储等等;

  • Shards:一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有 10 亿文档数据 的索引占据 1TB 的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力, 每一份就称之为分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上;

  • Replicas:在一个网络 / 云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复 制分片(副本)。

4.2集群架构

节点类型
  • 主节点(Master Node):主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。Elasticsearch 中的主节点的工作量相对较轻;

  • 数据节点(Data Node):数据节点负责数据的存储和相关具体操作,比如索引数据的创建、修改、删除、搜索、聚合。因此,数据节点对机器配置要求比较高,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统 CPU、内存 和 I/O 的性能消耗都很大;

  • 协调节点(Coordinating Node):协调节点是一种角色,集群中的任何节点都可以充当协调节点的角色。当一个节点 A 收到用户的查询请求后,会把查询语句分发到其他的节点,然后合并各个节点返回的查询结果,最好返回一个完整的数据集给用户,在这个过程中,节点 A 扮演的就是协调节点的角色。

  • 客户端节点(Client Node):就是既不做候选主节点也不做数据节点的节点,只负责请求的分发、汇总等,也就是上面说到的协调节点的角色,单独增加这样的节点更多地是为了提高并发性。

4.3索引写入流程

动态更新索引
  1. 新文档被收集到内存索引缓存

  1. 不时地, 缓存被提交(1) 一个新的段—一个追加的倒排索引—被写入磁盘。(2) 一个新的包含新段名字的 提交点 被写入磁盘(3) 磁盘进行 同步 — 所有在文件系统缓存中等待的写入都刷新到磁盘,以确保它们被写入物理文件

  1. 新的段被开启,让它包含的文档可见以被搜索

  1. 内存缓存被清空,等待接收新的文档

近实时搜索

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值