es相关概念

发布时间 2023-04-13 10:13:20作者: 小兵要进步

1、什么是ElasticSearch?

ES就是全文检索引擎。

2、什么是全文检索

1)数据的分类

1、结构化数据

数据类型固定、长度固定、格式固定。例如数据库中的数据。

2、非结构化数据

数据类型不固定、长度不固定、格式不固定。

2)结构化数据的查询

可以直接使用sql语句查询。查询速度很快。

3)非结构化数据的查询

例如:从磁盘文件中找出包含“spring”单词的文件。

方案1:使用顺序扫描的方式

存在的问题:如果数据量非常庞大,花费的时间非常长。

方案2:把非结构化数据变成结构化数据。然后建立索引。

先把文章内容进行分词处理,得到一个基础的单词列表。去除标点符号、转换大小写、去除停用词,并记录单词和文档的对应关系。得到一个最终的单词列表。然后基于单词列表创建一个索引。查询时直接查询索引找到对应的单词,根据单词和文档的的对应关系找到查询的文档列表。

这个先创建索引然后再查询索引的过程就叫做全文检索。

停用词:无意义的词

索引是一次创建可以多次使用,表现为每次查询速度非常快。

索引就是一个独立的数据结构,相当于一本书的目录。

 

3、全文检索的流程

1)创建索引

1、获得原始文档

原始文档就是我们要在哪些内容中进行搜索,这个内容就是原始文档。

文件搜索:磁盘上的文件

搜索引擎:整个互联网的网页

电商搜索:商品数据

微博搜索:微博数据

2、对应每个原始文档创建Document对象

每个原始文档对应一个Document对象,一个Document中包含多个field,field中包含了文档的属性信息。

对应每个原始文档的属性创建一个Field,把属性保存到field中。

例如:文件的属性有文件名、文件内容、文件的路径、文件大小等。

field包含两部分内容:

field的名称

field的内容

field包含三个特征:

1、是否分词

是否需要对field中的内容进行分词处理。

2、是否索引

分词之后一定要索引,不分词也可以创建索引。只要在field上有查询的需求就应该创建索引。

3、是否存储

是否要把field中的内容保存到磁盘。不影响查询。判断标准,是否要展示给用户看

每个document都有一个唯一的id,可以用户指定也可以系统生成。

3、分析文档

只针对需要分词的field进行分析处理。

1)对原始内容进行字符串拆分

2)去除标点符号

3)去除停用词

4)转换大小写

最终得到一个单词列表。对应每个关键词都封装成一个Term对象。

term中包含两部分内容:

1、关键词本身

2、关键词所在的field

例如:

name:spring name:java name:match

content:spring

不同的field中拆分出的同一个单词是不同的term。

4、创建索引

基于第三步得到的单词列表,创建索引。并且保存到磁盘。

索引库中包含三部分内容:

1)索引:单词列表

2)文档对象:Document

3)关键词和文档的对应关系

2)查询索引

1、用户输入查询条件

2、根据用户输入的查询条件封装成Query对象

把用户输入的内容进行分词处理,得到一个单词列表。

基于单词列表创建查询条件。

1)要查询的内容

2)在哪个field上查询

例如:

在文件内容中包含java关键词

文件名中包含spring关键词

 

3、基于Query对象查询索引

根据关键词找到索引中对应的位置。

根据关键词和文档的对应关系找到文档id列表。

根据id找到对应的Document对象。

4、展示结果

把document对象中的内容展示给用户。

 

4、概念说明

   Relational DB -> Databases -> Tables -> Rows -> Columns

       Elasticsearch -> Indices   -> (Types)  -> Documents -> Fields

1 索引 index

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并

且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。

 

2 类型 type

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客

平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。

 

3 文档 document

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表

示,而JSON是一个到处存在的互联网数据交互格式。在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。

 

4 字段Field

相当于是数据表的字段,对文档数据根据不同属性进行的分类标识

 

5 映射 mapping: mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其它就是处理es里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。