elasticsearch

1、docker pull elasticsearch:7.11.1
2、docker pull kibana:7.11.1
    版本要一致
3、demo数据地址:https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json
4、mkdir -p /data/elasticsearch/config
   mkdir -p /data/elasticsearch/data
   chmod -R 777 /data/elasticsearch/
5、echo "http.host: 0.0.0.0" >/data/elasticsearch/config/elasticsearch.yml
   #设置任何主机均可访问

6、启动elastic
docker run --name elasticsearch711 -p 9200:9200 -p 9300:9300 \
-e  "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/elasticsearch/data:/usr/share/elasticsearch/data \
-v  /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.11.1 

此时访问主机9200端口即可看到elasticsearch可以访问

7、设置开机启动
docker update elasticsearch711 --restart=always

8、启动kibana
docker run --name kibana711 -e ELASTICSEARCH_HOSTS=http://192.168.3.91:9200 -p 5601:5601 -d kibana:7.11.1

基础指令一
1、 GET /_cat/nodes 查看所有节点
访问:  http://192.168.3.91:9200/_cat/nodes
输出:  127.0.0.1 31 96 8 0.62 0.39 0.28 cdhilmrstw * 2a01f779974e
 * 代表是主节点, 2a01f779974e代表节点

2、GET /_cat/health  查看健康情况
3、GET /_cat/master  查看主节点
4、GET /_cat/indicie 查看所有索引
基础指令二

1、PUT 修改数据,必须指定id,没有就创建,有就修改
PUT consume/test1/1
{
  "name":"zhangsan2"
}

2、POST 修改数据,
    1、不指定id,自动生成id,创建新数据
    2、指定id,没有就创建,有就修改
PUT consume/test1/2
{
  "name":"zhangsi"
}

3、GET 查看文档
GET consume/test1/1

4、PUT http://192.168.3.91:9200/customer/external/1?if_seq_no=18&if_primary_term=6
#只有sql_no匹配时才修改

5、POST customer/test1/1/_update
{
    "doc":{
        "name":"111"
    }
}
加了_update和doc,则只修改doc里面字段的内容,否则POST的修改是覆盖 

6、删除文档、索引
    DELETE customer/test1/1
    DELETE customer


7、批量操作 bulk
POST customer/test1/_bulk
{"index":{"_id":"1"}}
{"name":"a"}
{"index":{"_id":"2"}}
{"name":"b"}
如果其中一条失败,另外一条会继续执行,两条数据之间是互相独立的

8、查询所有数据并排序
GET bank/_search?q=*&sort=account_number:asc
相当于
GET bank/_search
{
  "query": {"match_all": {}},
  "sort": [
    {
      "account_number": {
        "order": "asc"
      }
    }
  ]
}


term和match的区别
       term适合非分本字段,match适合文本字段

GET /bank/_search
{
    "query":{"match":{"address", "mill road"}}
}
GET /bank/_search
{
    "query":{"match_phrase":{"address", "mill road"}}
}
GET /bank/_search
{
    "query":{"match":{"address.keyword", "mill road"}}
}
match: 会对mill road进行分词查询,根据权重排序
match_phrase:不对mill road做分词,会在查找包含"mill road"整个词的address记录
text.keyword:不对mill road做分词,会在查找address="mill road"的记录

Query DSL(domain-specific language领域特定语言)

GET bank/_search
{
  "query": {"match_all": {}},
  "from": 0, 
  "size": 20, 
  "_source": ["account_number", "balance"], 
  "sort": [
    {
      "account_number": {
        "order": "asc"
      }
    }
  ]
}

from 第几页
size 每页数据数
sort 排序
_source查询出的字段


1、match 匹配查询
a、在address字段中分词匹配,所有包含mill或road的都会被查出
    最终会按照评分进行排序,会对检索条件进行分词匹配
GET bank/_search
{
  "query": {
    "match": {
      "address": "mill road"
    }
  }
}

b、在address字段中全文匹配,address="Lane"的才会被查出
GET bank/_search
{
  "query": {
    "match": {
      "address.keyword": "Lane"
    }
  }
}

c、match_phrase 短句匹配
将需要匹配的值当成一整个单词(不分词)进行检索,address中包含"mill road"整个词的才会被查出
GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill road"
    }
  }
}

d、multi_match 多字段匹配,state或address中包含mill的都会被查出来
GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill",
      "fields": ["state", "address"]
    }
  }
}



复合查询 boolean

  1. must:必须达到must所列举的所有条件
  2. must_not:必须不匹配must_not所列举的所有条件。
  3. should:应该满足should所列举的条件。满足条件最好,不满足也可以,满足得分更高
1、查询gender=m,并且address=mill的数据

GET bank/_search
{
   "query":{
        "bool":{
             "must":[
              {"match":{"address":"mill"}},
              {"match":{"gender":"M"}}
             ]
         }
    }
}

2、查询gender=m,并且address=mill的数据,但是age不等于38的
GET bank/_search
{
   "query":{
        "bool":{
             "must":[
              {"match":{"address":"mill"}}
             ],
             "must_not": [
               {"match": {"age": 38}}
             ]
         }
    }
}

Filter结果过滤

上面的must和should影响相关性得分,而must_not仅仅是一个filter ,不贡献得分
must改为filter就使must不贡献得分
如果只有filter条件的话,我们会发现得分都是0
一个key多个值可以用terms
并不是所有的查询都需要产生分数,特别是哪些仅用于filtering过滤的文档。为了不计算分数,elasticsearch会自动检查场景并且优化查询的执行。

#查询age=32的人,再根据1000<balance<2000做过滤
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "age": 32
        }}
      ],
      "filter": [
        {"range": {
          "balance": {
            "gte": 1000,
            "lte": 2000
          }
        }}
      ]
    }
  }
}

 term   和match一样。匹配某个属性的值。

  • 全文检索字段用match,
  • 其他非text字段匹配用term(term不会对文本进行分词)
  • 不要使用term来进行文本字段查询

 

Aggregation(聚合)

聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL的Group by和SQL聚合函数。

在elasticsearch中,执行搜索返回this(命中结果),并且同时返回聚合结果,把以响应中的所有hits(命中结果)分隔开的能力。这是非常强大且有效的,你可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API避免网络往返。

#查出所有年龄分布,并且这些年龄段中M、F的平均薪资以及这个年龄段的总体平均薪资
#size 列出可能的记录条数
GET bank/_search
{
  "query": {"match_all": {}},
  "aggs": {
    "ageAgg1": {
      "terms": {
        "field": "age",
        "size": 100
      },
      "aggs": {
        "genderAgg": {
          "terms": {
            "field": "gender.keyword",
            "size": 10
          },
          "aggs": {
            "balanceAgg": {
              "avg": {
                "field": "balance"
              }
            }
          }
        },
        "agebalanceAgg":{
          "avg":{
            "field": "balance"
          }
        }
      }
    }
  }
}

 

Mapping 映射定义文档如何被存储检索的

(1)字段类型
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/mapping-types.html
核心类型
复合类型
地理类型
特定类型

核心数据类型
(1)字符串
    text 用于全文索引,搜索时会自动使用分词器进行分词再匹配
    keyword 不分词,搜索时需要匹配完整的值

(2)数值型
    整型: byte,short,integer,long
    浮点型: float, half_float, scaled_float,double

(3)日期类型: date

(4)范围型: integer_range, long_range, float_range,double_range,date_range
    gt是大于,lt是小于,e是equals等于。
    age_limit的区间包含了此值的文档都算是匹配。

(5)布尔boolean

(6)二进制: binary 会把值当做经过 base64 编码的字符串,默认不存储,且不可搜索

(7)复杂数据类型
    (1)对象:object一个对象中可以嵌套对象。
    (2)数组:Array

(8)嵌套类型: nested 用于json对象数组

查看mapping信息:GET bank/_mapping

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值