数据可以分为结构化数据和非结构化数据,比如说我们常用的sql语句就都是操作结构化数据,邮件等信息都是非结构化数据;
对于结构化数据的查询可以使用sql语句进行查询,速度较快;
对于非结构化数据的查询可以把非结构化数据变成结构化数据:先根据空格进行字符串拆分,得到一个基础的单词列表。需要去掉标点符号、转换大小写、去除停用词、重复的单词只记录一次,就得到了一个最终的单词列表。然后基于单词列表创建一个索引。查询时直接查询索引,找到关键词后根据关键词和文档的对应关系,找到文档列表。这个过程就是全文检索的过程。
全文检索技术有:
Lucene:使用该技术需要对Lucene的API和底层架构非常了解,而且需要编写大量的JAVA代码
Solr:使用JAVA实现一个web应用,可以使用rest方式的http请求,进程远程API调用
ElasticSearch(ES):可以使用rest方式的http请求,进行远程API调用
ElasticSearch是一款开源的高扩展分布式全文检索引擎。其是使用JAVA开发并使用Lucene作为核心来实现所有索引和搜索功能的。
ES与Lucene对比:ES通过简单的Restful API来隐藏Lucene的复杂性,从而让全文检索变得简单。
ES与Solr对比:Solr是通过ZK进行分布式管理的,而ES自身带的有分布式协调管理功能;Solr支持更多格式的数据,ES只支持Json格式的数据;Solr在传统搜索应用中表现好于ES,但是在处理实时搜索应用时效率明显低于ES,因为Solr创建索引时,会产生IO阻塞。
ES不仅仅是存储,还会索引整个文档的内容让其可以进行搜索,在ES中,可以对文档进行索引、搜索、排序、过滤等操作。
ES的概念有索引index、类型type、文档document、字段field和映射mapping
1、索引index
索引可以看作是MySQL中的数据库,一套数据可以使用一套索引。
一个索引由一个名字来标识,名字必须全部是小写字母,当我们对这个索引中文档进行索引、搜索、更新和删除的时候,都需要使用这个名字。
2、类型type
类型类似与MySQL中的表,在一个索引中可以创建多个type。这个在es7及以后已经被废弃,只有_doc。
3、文档document
文档类似MySQL中的一条数据,存储的是具体的数据,存储格式为Json
4、字段field
相当于MySQL中的字段。
5、映射mapping
mapping对处理数据方式和规则做的一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等

ES的架构总体如上图所示,从下到上分为网关、搜索引擎、四大组件、自动发现、通信和Restful API
1、Gateway网关
其作用是用来对数据进行持久化以及ES重启后重新恢复数据。
es支持多种类型的gateway,有本地文件系统、分布式文件系统、Hadoop的HDFS等。
其存储的信息包括索引信息、集群信息、mapping等
2、districted lucene directory搜索引擎
Gateway上层就是Lucene的分布式检索框架。
ES是分布式的搜索引擎,虽然底层用的是Lucene,但是需要在每个节点上都运行Lucene进行相应的索引、查询、更新等操作,所以需要做成一个分布式的运行框架来满足业务需要。
3、四大组件模块
districted lucene directory之上就是ES的四大模块。
Index Model:索引模块,对数据建立索引(通常是建立倒排索引)
Seacher Model:搜索模块,就是对数据进行查询搜索
Mapping Model:是数据映射与解析模块,数据的每个字段可以根据建立的表结构通过mapping进行映射解析;如果没有建立表结构,那么ES会根据数据类型来推测数据结构,并自动生成一个mapping,然后根据mapping进行解析
River Model:在es2.0之后被取消了,表示可以使用插件处理。例如可以通过一些自定义脚本将传统数据库的数据实时同步到es中。
4、自动发现Discovery Script
es集群中各个节点通过discovery相互发现的,默认使用的是Zen。es是一个基于p2p的系统,他先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
es还可以支持多种script脚本语言,例如mvel、js、python等。
5、通信(Transport)
代表es内部节点或集群与客户的交互方式,默认内部使用tcp协议进行交互,同时其还支持http协议,thrift、servlet、memcached、zeroMQ等通信协议。
节点间通信端口默认9300-9400
6、Restful接口
最上层就是ES暴漏给我们的访问接口。
其中VERB是请求方式(post、get....),PROTOCOL是协议(http、https......),HOST和PORT是es的ip和端口,PATH是API的终端路径,QUERY_STRING表示任何可选的查询字符串参数(例如@pertty将格式化的输出JSON格式),BODY是一个Json格式的请求体。
{
"settings":{
"index":{
"number_of_shards":"5",
"number_of_replicas":"1"
}
},
"mappings":{
"_doc":{
"properties":{
"orderId":{
"type":"long",
"store":true,
"index":true
},
"orderName":{
"type":"text",
"store":true,
"index":true,
"analyzer":"standard"
},
"content":{
"type":"text",
"store":true,
"index":true,
"analyzer":"standard"
}
}
}
}
}
访问IK分词器查看分词效果:post ip:9200/_analyze,里面只需要传入analyzer和text,其中text为测试分词的文本,analyzer在IK分词器中有ik_smart和ik_max_word两种,分别是最少切分和最细力度切分。
推荐阅读:
https://www.cnblogs.com/liconglong/p/15010606.html
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69949806/viewspace-2902826/ ,如需转载,请注明出处,否则将追究法律责任。