Elasticsearch学习(一)基本概念

基本概念

Index索引

动词:相当于Mysql中的insert;
名词:相当于Mysql中的Database;

Type类型

在Index(索引)中,可以定义一个或多个类型;
类似MySQL中的Table,每一种类型数据放在一起;

Document文档

保存在某个索引Index下,某种类型的一个数据,文档是Json格式的,Document就像是Mysql中的某个Table里面的数据;
在这里插入图片描述

倒排索引机制

Docker安装Elasticsearch

下载镜像文件

  • docker pull elasticsearch:7.4.2
  • docker pull kibana:7.4.2

//将es中配置文件挂载到外面的目录,通过修改虚拟机外面的文件夹es配置,进而修改docker中es的配置
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
//写了一个配置 http.host:0.0.0.0 代表es可以被远程的任何机器访问,注意这里host:后需要有空格
echo “http.host: 0.0.0.0”>> /mydata/elasticsearch/config/elasticsearch.yml
运行elasticsearch命令,
//为容器起一个名字为elasticsearch,-p暴露两个端口 9200 9300, 9200是发送http请求——restapi的端口,9300是es在分布式集群状态下,结点之间的通信端口, \代表换行下一行,
//-e single-node 是以单节点方式运行,ES_JAVA_OPTS不指定的话,es一启动,会将内存全部占用,整个虚拟机就卡死了,
//-v 进行挂载,目录中配置,数据等一一关联 -d 后台启动es使用指定的镜像 z
docker run --name elasticsearch -p 9200:9200 -p 9300:9300
-e “discovery.type=single-node”
-e ES_JAVA_OPTS="-Xms64m -Xmx128m"
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins
-d elasticsearch:7.4.2

安装完 elasticsearch 后我们来启动一下,会发现使用docker ps命令查看启动的容器时没有找到我们的 es,这是因为目前 es 的配置文件的权限导致的,因此我们还需要修改一下 es 的配置文件的权限:

chmod -R 777 /mydata/elasticsearch/

安装kibana

# -e : 指定环境变量配置, 提供汉化
# --like : 建立两个容器之间的关联, kibana 关联到 es
docker run -d --name kibana --link elasticsearch:elasticsearch -e "I18N_LOCALE=zh-CN" -p 5601:5601 kibana:7.4.2
# kibana 的汉化我感觉做的并不好
# 如果不习惯汉化, 可以把条件去除
docker run -d --name kibana --link elasticsearch:elasticsearch -p 5601:5601 kibana:7.8.0

初步检索

1、 _cat
GET /_cat/nodes: 查看所有节点;
GET /_cat/health: 查看Es健康状态;
GET /_cat/master: 查看主节点;
GET /_cat/indices: 查看所有索引;

进阶检索

ES支持两种基本方式检索:

  • 通过使用Rest request URI 发送搜索参数(url+搜索参数)
  • 通过使用Rest request body 来发送(uri+请求体)

QueryDSL

match: 全文检索;
match_parase: 短语匹配
multi_match: 多字段匹配

复合查询
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "F"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ]
    }
  }
}

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "M"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "age": "38"
          }
        }
      ]
    }
  }
}
filter结果过滤

filter查询不会有相关性得分

term查询

文本查询(全文检索)使用bool;
非文本字段使用term查询;

aggregations(执行聚合)

聚合提供了从数据中心分组和提取数据的能力、最简单的聚合方法大致等于SQL中的group by和sql聚合函数。在Es中,如果有执行搜索返回hits(命中结果),并且同时返回聚合结果,把一个响应中的所有hits分隔开的能力,这是很强大的。可以执行查询和多个集合,并且在一次使用得到各自的返回结果,使用一次简介和简化的API来避免网络往返;

# 搜索address中包含mill的所有人的年龄分布以及平均年龄;

GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "aggAvg":{
      "avg": {
        "field": "age"
      }
    },
    "banlanceAvg":{
      "avg": {
        "field": "balance"
      }
    }
  }
}

# 按照年龄聚合,并且请求这些年龄段的这些人平均薪资
GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 100
      },
      "aggs": {
        "ageAvg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

# 先查出年龄分,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体的平均薪资
GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 100
      },
      "aggs": {
        "genderAgg": {
          "terms": {
            "field": "gender.keyword",
            "size": 10
          },
          "aggs": {
            "banlanceAvg": {
              "avg": {
                "field": "balance"
              }
            }
          }
        },
        "ageBanlanceAgg":{
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

Mapping映射

Mapping是用来定义一个文档,以及它所包含的属性field是如何存储和索引的,比如:使用mapping来定义:

  • 那些字符串属性应该被看作全文本属性;
  • 那些属性包含数字、日期或者地理位置;
  • 文档中的所有属性是否都能被索引(_all配置);
  • 日期的格式;
  • 自定义映射规则来执行动态添加属性;
添加索引映射
## 创建一个新的索引并指定属性类型
PUT /my_index
{
  "mappings": {
    "properties": {
      "age": {"type": "integer"},
      "email": {"type": "keyword"},
      "name": {"type": "text"}
    }
  }
}

## 对已有索引添加一个字段映射
PUT /my_index/_mapping
{ 
  "properties": {
    "employee-id": {
      "type":"keyword",
      "index":false
    }
  }
}

分词

一个tokenizer(分词器)接收一个字符流,将之分隔为独立的tokens(词元,通常是独立的单词),然后输出tokens流。

安装IK中文分词器

在这里插入图片描述

docker安装Nginx
// 在/mydata 目录下面创建nginx
mkdir nginx

// 本地没有找到镜像,自动去远程下载
docker run -p 80:80 --name nginx -d nginx:1.10

docker container cp nginx:/etc/nginx . 
    
docker stop nginx

docker rm nginx
// 切换到mydata后 把nginx改名字为conf
mv nginx conf

mkdir nginx
// 把整个文件夹移动到 nginx下,以后nginx就在conf下面了
mv conf nginx/

注意,\前面是有空格的
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值