前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ElasticSearch基础语法

ElasticSearch基础语法

作者头像
shimeath
发布2021-01-05 14:53:38
1.2K0
发布2021-01-05 14:53:38
举报

一、elasticsearch安装

1、在docker安装elasticsearch

  1. 拉取镜像
代码语言:javascript
复制
$ docker pull elasticsearch:7.4.2 # 拉取elasticsearch
$ docker pull kibana:4.7.2		  # 拉取kibana,可视化工具
  1. 基本配置
代码语言:javascript
复制
$ mkdir -p /mydata/elasticsearch/config
$ mkdir -p /mydata/elasticsearch/data
$ echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml		# 设置端口访问
$ chmod -R 777 /mydata/elasticsearch/
  1. 启动
代码语言:javascript
复制
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-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
代码语言:javascript
复制
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.2:9200 -p 5601:5601 -d kibana:7.4.2 # 启动kibana

二、常用命令

1. 基本命令

1、_cat

代码语言:javascript
复制
/_cat/nodes					# 查看所有节点
/_cat/health				# 查看es健康状态
/_cat/master				# 查看主节点
/_cat/indices				# 查看所有索引

2、索引一个文档(保存)

代码语言:javascript
复制
post/put 请求
http://{url}/{index}/{type}/{id}[?if_seq_no=0&if_primary_term=1]
  • POST 新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号
  • PUT可以新增可以修改。PUT必须指定id;由于PUT需要指定 id,我们一般都用来做修改操作,不指定id会报错。
  • 最后为条件修改,仅在符合条件时修改

3、查询文档

代码语言:javascript
复制
get  请求
http://{url}/{index}/{type}

结果:

代码语言:javascript
复制
{
    "_index": "customer",			// 在哪个索引
    "_type": "external",			// 在哪个类型
    "_id": "1",						// 记录id
    "_version": 6,					// 版本号
    "_seq_no": 5,					// 并发控制字段,用于做乐观锁
    "_primary_term": 1,				// 同上,主分片重新分配,如重启就有变化
    "found": true,					
    "_source": {					// 真正数据
        "name": "hu xin hu"
    }
}

4、更新文档

代码语言:javascript
复制
post/put 请求
http://{url}/{index}/{type}/{id}/_update
  • _update的更新,如果数据一致不做任何操作
    • 需要按着如下格式发送请求
    • { "doc":{ "name": "leo" } }
  • 不带的无论如何都会操作
    • { "name": "leo" }

2. Query DSL

(1)基本语法格式

Elasticsearch提供了一个可以执行查询的Json风格的DSL。这个被称为Query DSL,该查询语言非常全面。

一个查询语句的典型结构

代码语言:javascript
复制
QUERY_NAME:{
   ARGUMENT:VALUE,
   ARGUMENT:VALUE,...
}

query定义如何查询;

  • match_all查询类型【代表查询所有的所有】,es中可以在query中组合非常多的查询类型完成复杂查询;
  • 除了query参数之外,我们可也传递其他的参数以改变查询结果,如sort,size;
  • from+size限定,完成分页功能;
  • sort排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准;

(2)返回部分字段

代码语言:javascript
复制
GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 5,
  "sort": [
    {
      "account_number": {
        "order": "desc"
      }
    }
  ],
  "_source": ["balance","firstname"]
  
}

(3)match匹配查询

  • 基本类型(非字符串),精确控制
  • 字符串,全文检索
  • 全文检索,最终会按照评分进行排序,会对检索条件进行分词匹配。
代码语言:javascript
复制
GET bank/_search
{
  "query": {
    "match": {
      "account_number": "20"
    }
  }
}

(4) match_phrase [短句匹配]

将需要匹配的值当成一整个单词(不分词)进行检索

代码语言:javascript
复制
GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill road"
    }
  }
}

(5)multi_math【多字段匹配】

代码语言:javascript
复制
GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill",
      "fields": [
        "state",
        "address"
      ]
    }
  }
}

(6)bool用来做复合查询

  • must:必须达到must所列举的所有条件
  • must_not:必须不匹配must_not所列举的所有条件。
  • should:应该满足should所列举的条件。
代码语言:javascript
复制
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "M"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "age": "38"
          }
        }
      ]
    }
  }
}

should:应该达到should列举的条件,如果到达会增加相关文档的评分,并不会改变查询的结果。如果query中只有should且只有一种匹配规则,那么should的条件就会被作为默认匹配条件二区改变查询结果。

(7)Filter【结果过滤】

并不是所有的查询都需要产生分数,特别是哪些仅用于filtering过滤的文档。为了不计算分数,elasticsearch会自动检查场景并且优化查询的执行。

代码语言:javascript
复制
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "address": "mill"
          }
        }
      ],
      "filter": {
        "range": {
          "balance": {
            "gte": "10000",
            "lte": "20000"
          }
        }
      }
    }
  }
}

(8)term

和match一样。匹配某个属性的值。全文检索字段用match,其他非text字段匹配用term。

代码语言:javascript
复制
GET bank/_search
{
  "query": {
    "term": {
      "address": "mill Road"
    }
  }
}

全文检索字段用match,其他非text字段匹配用term

(9)Aggregation(执行聚合)

聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL Group by和SQL聚合函数。在elasticsearch中,执行搜索返回this(命中结果),并且同时返回聚合结果,把以响应中的所有hits(命中结果)分隔开的能力。这是非常强大且有效的,你可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API避免网络往返。

代码语言:javascript
复制
“size”:0
size:0不显示搜索数据

查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资

代码语言:javascript
复制
GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 100
      },
      "aggs": {
        "genderAgg": {
          "terms": {
            "field": "gender.keyword"
          },
          "aggs": {
            "balanceAvg": {
              "avg": {
                "field": "balance"
              }
            }
          }
        },
        "ageBalanceAvg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  },
  "size": 0
}

3. Mapping

(1)字段类型

(2)映射

Maping是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的。比如:使用maping来定义:

  • 哪些字符串属性应该被看做全文本属性(full text fields);
  • 哪些属性包含数字,日期或地理位置;
  • 文档中的所有属性是否都嫩被索引(all 配置);
  • 日期的格式;
  • 自定义映射规则来执行动态添加属性;
  • 查看mapping信息 GET bank/_mapping
  • 更新映射

对于已经存在的字段映射,我们不能更新。更新必须创建新的索引,进行数据迁移。

  • 数据迁移

先创建new_twitter的正确映射。然后使用如下方式进行数据迁移。

代码语言:javascript
复制
POST reindex [固定写法]
{
  "source":{
      "index":"twitter"
   },
  "dest":{
      "index":"new_twitters"
   }
}

旧版本 POST reindex [固定写法] { "source":{ "index":"twitter", "twitter":"twitter" }, "dest":{ "index":"new_twitters" } }

4. 分词

elasticsearch提供了很多内置的分词器,可以用来构建custom analyzers(自定义分词器)。

内置分词器仅支持英文,中文分词需要自己安装ik分词器插件

(1)安装ik分词器

  1. 下载分词器
代码语言:javascript
复制
wget $ik分词器下载路径
  1. 解压缩
代码语言:javascript
复制
unzip $文件名
  1. 重启docker
代码语言:javascript
复制
docker restart elasticsearch

(2)自定义词库

  • 修改/mydata/elasticsearch/plugins/ik/config中的IKAnalyzer.cfg.xml
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
	<entry key="ext_dict"></entry>
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords"></entry>
	<!--用户可以在这里配置远程扩展字典 -->
	<entry key="remote_ext_dict">http://ip/es/fenci.txt</entry> 
	<!--用户可以在这里配置远程扩展停止词字典-->
	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、elasticsearch安装
    • 1、在docker安装elasticsearch
    • 二、常用命令
      • 1. 基本命令
        • 1、_cat
        • 2、索引一个文档(保存)
        • 3、查询文档
        • 4、更新文档
      • 2. Query DSL
        • (1)基本语法格式
        • (2)返回部分字段
        • (3)match匹配查询
        • (4) match_phrase [短句匹配]
        • (5)multi_math【多字段匹配】
        • (6)bool用来做复合查询
        • (7)Filter【结果过滤】
        • (8)term
        • (9)Aggregation(执行聚合)
      • 3. Mapping
        • (1)字段类型
        • (2)映射
      • 4. 分词
        • (1)安装ik分词器
        • (2)自定义词库
    相关产品与服务
    Elasticsearch Service
    腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档