-
Elasticsearch是一个基于Lucene的搜索服务,它提供了分布式多用户能力的全文搜索引擎,基于RESTful web接口。
-
Elasticsearch是使用Java语言开发的,是当前流行的企业级搜索引擎,设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
-
优点:
- 横向可扩展性: 只需增加一台服务器,做一点配置,启动es就可以并入集群。
- 分片机制提供更好的分不性,同一个索引分成多个分片(sharding),这点类似于HDFS的块机制,来提升处理效率。
- 高可用: 提供复制(replica)机制,一个分片可以设置多个复制,使得某台服务器宕机的情况下,集群仍旧可以正常运转,并会把由于服务器宕机丢失的复制恢复到其他可用的节点上,这点也类似于HDFS的复制机制(HDFS中默认是3份复制)。
- 速度快,负载能力强,在面对海量的数据时,搜索速度极快,在同样的硬件资源下,进行大量数据的搜索时,相比一些传统的数据搜索软件,es上手容易,很快可以搭建一个站内搜索引擎。
-
缺点:
- 各节点的一致性问题,器默认的机制是多播机制,同步元数据信息,但是在比较繁忙的集群中,可能会由于网络的阻塞,或者节点处理能力达到饱和,导致各节点元数据不一致–也就是所谓的脑裂问题,会使得集群处于不一致状态。目前并没有一个彻底解决该问题的方案,但是可以通过将工作节点与元数据节点分开部署的方案来缓解这种情况。
- 没有细致的权限管理机制,也就是说,没有像MySQL那样分各种用户,没有用户有不同的权限,所以在操作上的限制需要自己开发一个系统来完成。
-
Elasticsearch与关系型数据库的对应关系
关系型数据库 Elasticsearch 数据库Database 索引Index,支持全文搜索 表Table 类型Type 数据行Row 文档Document,但不需要固定结构,不同文档可以拒用不同字段集合 数据列Column 字段Field 模式Schema 映像Mapping -
Elasticsearch的增删改查操作
-
创建索引:
PUT /db_index
http://192.168.18.177:9200/db_index — 通过浏览器增加(put)
-
查看索引:
GET /db_index
http://192.168.18.177:9200/db_index — 通过浏览器查看
-
删除索引: DELETE /db_index
-
添加文档,格式为: PUT /索引名称/类型/id
PUT /db_index/user/1
{
“name”: “Jack”,
“sex”: 1,
“age”: 25,
“book”: “Spring Boot 入门到精通”,
“remark”: “hello world”
} -
修改的语句和添加的语句一模一样
-
查看文档: GET /索引名称/类型/id
GET /db_index/user/1
-
删除文档: DELETE /索引名称/类型/id
-
查看某个类型中的所有文档: GET /索引名称/类型/_search
GET /db_index/user/_search
select * from user
-
条件查询: GET /索引名称/类型/_search?q=*?*
GET /db_index/user/_search?q=age:28
select * from user where age = 28
-
范围查询: GET /索引名称/类型/_search?q=* [ ** TO **] (TO 必须为大写)
GET /db_index/user/_search?q=age:[25 TO 26]
-
批量查询: GET /db_index/user/_mget
GET /db_index/user/_mget
{“ids”:[“1”,“2”]}select * from user where id in (1,2)
-
查看年龄小于等于28:GET /db_index/user/_search?q=age:<=**
GET /db_index/user/_search?q=age:<=28
select * from user where age <= 28
-
查询年龄大于: GET /db_index/user/_search?q=age:>**
GET /db_index/user/_search?q=age:>28
select * from user where age > 28
-
分页查询: GET /db_index/user/_search?q=age:[25 TO 26]&from=&size=
GET /db_index/user/_search?q=age:[25 TO 26]&from=0&size=3
select * from user where age between 25 and 26 limit 0,3
-
对查询结果只输出某些字段:
GET /db_index/user/_search?q=age:[25 TO 26]&_source=name,age
select name,age from user where age between 25 and 26
-
对查询结果进行排序:
GET /db_index/user/_search?q=age:[25 TO 26]&sort=age:asc
select * from user where age between 25 and 26 order by age asc
-
多索引和多类别的查询,参考 https://es.xiaoleilu.com/050_Search/10_Multi_index_multi_type.htmls
-
ES提供了强大的查询语言DSL,它可以允许我们进行更强大、复杂的查询。DSL中有Query和Filter两种查询方式。
-
Query查询,会在ES中索引的数据都会存储一个_score的分值,分值越高就代表越匹配
-
根据名称精确查询姓名term,term查询不会对字段进行分词查询,会采用精确匹配。
采用term精确匹配,查询字段映射类型为keyword。
POST /db_index/user/_search
{
“query”: {
“term”: {
“name”: “jack”
}
}
}select * from user where name = “jack”
-
根据备注信息模糊查询match,match会根据该字段的分词器,进行分词查询:
POST /db_index/user/_search
{
“from”: 0,
“size”: 1,
“query”: {
“match”: {
“book”: “spring”
}
}
}select * from user where book like “%spring%”
-
多字段模糊匹配查询与精准查询,multi_match
POST /db_index/user/_search
{
“query”: {
“multi_match”: {
“query”: “spring hadoop”,
“fields”: [“book”, “remark”]
}
}
}select * from user where book like “%spring%” or book like “%hadoop%” or remark like “%spring%”
or remark like “%hadoop%”
-
未指定字段条件查询query_string,含and 与 or 条件:
POST /db_index/user/_search
{
“query”: {
“query_string”: {
“query”: “(Spring Cloud AND 入门到精通) OR Spring Boot”
}
}
} -
指定字段条件查询query_string,含and 与 or 条件:
POST /db_index/user/_search{
“query”: {
“query_string”: {
“query”: “Spring Boot OR 入门到精通”,
“fields”: [“book”,“remark”]
}
}
} -
范围查询
range范围关键字
gte大于等于
lte 小于等于
gt 大于
lt 小于
now 当前时间
POST /db_index/user/_search
{
“query”: {
“range”: {
“age”: {
“gte”: 25,
“lte”: 28
}
}
}
}select * from user where age between 25 and 28
-
分页、输出字段、排序综合查询
POST /db_index/user/_search
{
“query” : {
“range” : {
“age” : {
“gte”:25,
“lte”:28
}
}
},
“from”: 0,
“size”: 2,
“_source”: [“name”, “age”, “book”],
“sort”: {“age”:“desc”}
} -
Filter过滤方式查询,它的查询不会计算相关性分值,也不会对结果进行排序,因此效率会高点,查询的结果可以被缓存
-
Filter Context对数据进行过滤
POST /db_index/user/_search
{
“query”: {
“bool”: {
“filter”: {
“term”:{
“age”:25
}
}
}
}
} -
映射相当于数据表中的表结构
-
映射可以分为动态映射和静态映射
- 动态映射: 在关系型数据库中需要先床架数据库,再创建数据表,并创建表字段,类型,长度,主键等,最后才能基于表插入数据,ES中的mapping映射,在文档写入ES时,会根据文档字段自动识别类型,这种机制称为动态映射。
- 静态映射: 是在ES中事先定义好映射,包含文档的个字段类型、分词器等,这种方式称为静态映射。
-
动态映射的规则:
JSON数据 自动推测的类型 null 没有字段呗添加 true或false boolean类型 小数 float 数字 long 日期 date或text 字符串 text 数组 有数据的第一个非空值决定 JSON对象 object类型 -
ES文档映射支持的数据类型:
- 字符串String:String包含的text和keyword
- text ,该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引,;允许es来检索这些词,text类型不能用来排序和聚合。
- keyword: 这类型不能分词,可以被用来检索过滤、排序和组合,keyword不可以用text进行分词模糊检索。
- 数值型:long, Integer,short,byte,double,float
- 日期型: date
- 布尔型: boolean
- 二级制型: binary
- 复杂数据类型
- 地理位置类型
- 特定类型
- 字符串String:String包含的text和keyword
-
获取映射: GET /db_index/user/_mapping
-
创建静态映射
-
建立索引: PUT /db_index
-
创建静态映射:
POST /db_index/_mapping/user { "user":{ "properties":{ "name":{ "type":"keyword" }, "sex":{ "type":"integer" }, "age":{ "type":"integer" }, "book":{ "type":"text" }, "remark":{ "type":"text" }, "test":{ "type":"keyword" } } } }
-
根据静态映射创建文档
PUT /db_index/user/1 { "name": "Jack", "sex": 1, "age": 25, "book": "Spring Boot 入门到精通", "remark": "hello world" }
-
-
在ES中不允许直接修改映射的类型,如需修改,方法为:
-
如果要推倒现有的映射,首先需要重新建立一个静态索引
-
然后把之前索引里面的数据导入到新的索引里面
POST _reindex { "source": { "index": "db_index" }, "dest": { "index": "db_index_2" } }
-
删除之前的索引
DELETE /db_index
-
为新索引起个别名,为原索引名
PUT /db_index_2/_alias/db_index
-
-
keyword映射只能精准查询,不能分词查询,能聚合排序
-
text映射能模糊查询,能分词查询,不能聚合、排序
-
数据库领域中确保并发更新的两种方法:
-
悲观并发控制
被关系型数据库广泛使用,它嘉定变更冲突可能发生,因此阻塞访问资源以防止冲突。一个典型的例子就是读一行数据之前现将其锁住,确保只有放置锁的线程能够对这行数据进行修改。
-
乐观并发控制
ES中使用这种方式,假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。然而,如果源数据在读取过程当中被修改,更新将会失败,应用程序接下来将决定接下来该如何解决冲突。例如可以重试更新、使用新的数据、或者将相关情况报告给用户。效率更高。
-
-
ES是基于倒排索引实现的
分词 --> 去重 --> 排序
-
查看分词器分词后的结果
GET _analyze { "analyzer": "ik_smart", "text": "流浪地球" }
-
ik中文分词器自定义词语
-
在/opt/elasticsearch-6.6.0/plugins/ik/config下新创建一个custom文件夹
-
创建一个my_word.dic文件,内容自己添加
-
在/opt/elasticsearch-6.6.0/plugins/ik/configIKAnalyzer.cfg.xml下添加
<entry key="ext_dict">custom/my_word.dic</entry>
-
重启es
-
-
创建静态映射时指定text类型的ik分词器
POST /db_index/_mapping/user { "user":{ "properties":{ "name":{ "type":"keyword" }, "sex":{ "type":"integer" }, "age":{ "type":"integer" }, "book":{ "type":"text", "analyzer":"ik_smart", "search_analyzer":"ik_smart" }, "remark":{ "type":"text" }, "test":{ "type":"keyword" } } } }
Elasticsearch入门学习
最新推荐文章于 2023-12-13 14:55:16 发布