Elasticsearch学习资料
概念:Elasticsearch 分布式全文搜索(搜索工具,效率很高)引擎,近乎实时的存储、检索数据
Elasticsearch (windows)安装
-
解压即可使用
-
熟悉文件
bin:启动文件
config:配置文件目录
log4j2.properties:日志配置文件
jvm.options:Java虚拟机相关配置文件
elasticsearch.yml:ES的配置文件,默认端口 9200 端口!
lib:相关jar包
modules:功能模块
plugins:插件
-
启动(双击bin目录下的elasticsearch.bat)
-
测试:http://127.0.0.1:9200
-
安装Elasticsearch图形化工具 elasticsearch-head-master(前提需要nodejs和cnpm环境)
在elasticsearch-head-master的shell名令窗口
D:\Revolution\software_running\Elasticseach\elasticsearch-head-master> cnpm install
启动header-master
D:\Revolution\software_running\Elasticseach\elasticsearch-head-master> npm run start
连接测试发现,存在跨域问题:配置es——elasticsearch.yml
http.cors.enabled: true http.cors.allow-origin: "*"
Elasticsearch核心概念
- 索引
- 字段类型(mapping)
- 文档(documents)
elasticsearch 是面向文档的!
关系型数据库和ES的客观对比:一切都是 json
Relational DB | Elasticsearch |
---|---|
数据库(DateBase) | 索引(index) |
表(Table) | types(慢慢会被弃用) |
行(Row) | Documents(文档) |
字段(Columns) | Fields |
物理设计:
elasticsearch 在后台把每个索引划分成多个分片,每个分片在集群中不同的服务器间迁移
逻辑设计:
ES是面向文档(就是一条条数据)的,意味着索引和搜索数据的最小单位是文档,ES中文档有几个重要属性
- 自我包含,一篇文档同时包含字段和对应的值,key:value
- 可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的!{就是一个json对象}
- 灵活的结构,文档不依赖预先设定的模式,我们知道关系型数据库中,要提前定义字段才可以使用。在ES中,字段是非常灵活的,有时候,我们可以忽略该字段,或者动态添加一个新的字段。
文档(就是我们的一条条数据)
user
1 里斯 18
2 张三 19
类型
类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。比如name映射为字符串类型,我们说文档无模式的,它们不需要拥有映射中所定义的所有字段,比如增加一个新字段,那么ES是怎么做的呢?ES或自动的将字段加入映射,但这个字段不确定它是说明类型,ES就开始猜,如果这个值是18,那么ES就认为它是整数型,但ES可能猜的不对,所以最安全的方式就是提前定义好映射,这点跟关系型数据库殊途同归,先定义好字段,然后再使用,别整说明幺蛾子!
索引
就是数据库
索引就是映射类型的容器,ES中的索引是一个非常大的文档集合。索引存储了类型的字段和其他设置,然后它们被存储到各个分片上
物理设计:节点和分片如何工作
倒排索引:
IK分词器
使用kibana
查看不同的分词效果
ik_smart 为最少切分
ik_max_word 最细粒度切分,穷尽词库的可能
自定义的词语,要自行添加到分词器字典中!
ES花式查询
简单的搜索:
GET kuangshen/user/_search?q=name:李四
复杂查询:
GET /kuangshen/user/_search
{
"query":{
"match":{
"name":"李四"
}
}
}
GET /kuangshen/user/_search
{
"query":{
"match":{
"name":"李四"
}
},
"_source":["name","desc"] # 结果过滤
}
GET /kuangshen/user/_search
{
"query":{
"match":{
"name":"李四"
}
},
"sort":[
{
"age":{
"order":"desc" # 排序
}
}
]
}
**分页查询**
GET /kuangshen/user/_search
{
"query":{
"match":{
"name":"李四"
}
},
"sort":[
{
"age":{
"order":"desc" # 排序
}
}
],
"from":0, # 从那条数据开始
"size":2 # 单页面大小
}
# 数据下标还是从0开始
**bool值查询,多条件精确查询**
GET /kuangshen/user/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"狂神"
}
},
{
"match":{
"age":23
}
}
]
}
}
}
must:所有的条件都要符合,相当于mysql的and
should: 符合两个条件中的一个,相当于mysql的or
must_not: 不是,相当于mysql的not
**Filter过滤查询**
GET /kuangshen/user/_search
{
"query":{
"bool": {
"must": [
{
"match": {
"name": "狂神"
}
}
],
"filter": { # filter 数据过滤
"range": {
"age": {
"gte": 10,
"lte": 50
}
}
}
}
}
}
gt 大于
gte 大于等于
lt 小于
lte 小于等于
**匹配多个条件**
GET /kuangshen/user/_search
{
"query":{
"match": {
"tages": "男 技术" # 多个条件使用空格隔开即可,只要满足其中一个结果即可被查出
}
}
}
**精确查询**
term查询是直接通过倒排索引指定的词条进行精确地查询!
关于分词:
term,直接查找精确地
match,会使用分词器进行分析(先分析文档,然后通过分析的文档进行查询)
两个类型:
text类型:可以被分词器解析
keyword类型:不会被分词器解析
高亮查询