es相关概念
1、什么是ElasticSearch?
ES就是全文检索引擎。
2、什么是全文检索
1)数据的分类
1、结构化数据: 数据类型固定、长度固定、格式固定。例如数据库中的数据。
2、非结构化数据: 数据类型不固定、长度不固定、格式不固定。
2)结构化数据的查询: 可以直接使用sql语句查询。查询速度很快。
3)非结构化数据的查询 例如:从磁盘文件中找出包含“spring”单词的文件。
方案1:使用顺序扫描的方式 存在的问题:如果数据量非常庞大,花费的时间非常长。
方案2:把非结构化数据变成结构化数据。然后建立索引。先把文章内容进行分词处理,得到一个基础的单词列表。去除标点符号、转换大小写、去除停用词,并记录单词和文档的对应关系。得到一个最终的单词列表。然后基于单词列表创建一个索引。查询时直接查询索引找到对应的单词,根据单词和文档的的对应关系找到查询的文档列表。这个先创建索引然后再查询索引的过程就叫做全文检索。
停用词:无意义的词
索引是一次创建可以多次使用,表现为每次查询速度非常快。索引就是一个独立的数据结构,相当于一本书的目录。
3、全文检索的流程
1)创建索引:
获得原始文档: 原始文档就是我们要在哪些内容中进行搜索,这个内容就是原始文档。文件搜索:磁盘上的文件 搜索引擎:整个互联网的网页 电商搜索:商品数据 微博搜索:微博数据.
创建Document对象: 每个原始文档对应一个Document对象,一个Document中包含多个field,field中包含了文档的属性信息。对应每个原始文档的属性创建一个Field,把属性保存到field中。例如:文件的属性有文件名、文件内容、文件的路径、文件大小等。 每个document都有一个唯一的id,可以用户指定也可以系统生成。field包含两部分内容:field的名称 field的内容. field包含三个特征:是否分词: 是否需要对field中的内容进行分词处理。是否索引: 分词之后一定要索引,不分词也可以创建索引。只要在field上有查询的需求就应该创建索引。是否存储: 是否要把field中的内容保存到磁盘。不影响查询。判断标准,是否要展示给用户看.
分析文档: 只针对需要分词的field进行分析处理。1对原始内容进行字符串拆分 2去除标点符号 3去除停用词 4转换大小写. 最终得到一个单词列表。对应每个关键词都封装成一个Term对象。term中包含两部分内容:1、关键词本身 2、关键词所在的field.
例如:
name:spring name:java name:match
content:spring
不同的field中拆分出的同一个单词是不同的term。
基于第三步得到的单词列表,创建索引。并且保存到磁盘。索引库中包含三部分内容:1索引:单词列表 2文档对象:Document 3: 关键词和文档的对应关系
2)查询索引: 用户输入查询条件, 根据用户输入的查询条件封装成Query对象, 把用户输入的内容进行分词处理,得到一个单词列表, 基于单词列表创建查询条件。要查询的内容 以及 在哪个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里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)