ElasticSearch学习随笔之简单操作

ElasticSearch

1、ElasticSearch学习随笔之基础介绍
2、ElasticSearch学习随笔之简单操作
3、ElasticSearch学习随笔之java api 操作
4、ElasticSearch学习随笔之SpringBoot Starter 操作
5、ElasticSearch学习随笔之嵌套操作
6、ElasticSearch学习随笔之分词算法
7、ElasticSearch学习随笔之高级检索
8、ELK技术栈介绍
9、Logstash部署与使用
10、ElasticSearch 7.x 版本使用 BulkProcessor 实现批量添加数据
11、ElasticSearch 8.x 弃用了 High Level REST Client,移除了 Java Transport Client,推荐使用 Elasticsearch Java API
12、ElasticSearch 8.x 使用 snapshot(快照)进行数据迁移
13、ElasticSearch 8.x 版本如何使用 SearchRequestBuilder 检索
14、ElasticSearch 8.x 使用 High Level Client 以 HTTPS 方式链接,SSL 证书、主机名验证器 各是什么,如何忽略
15、ElasticSearch 8.x 创建父子文档,用Join类型字段以及用has_child、has_parent 检索

ElasticSearch,创始人 Shay Banon(谢巴农)
本文主要讲解ElasticSearch 基础操作,Kibana 以及 java api 调用操作。



前言

本文主要对ElasticSearch基础操作进行讲解,以便上手 用 ElasticSearch


一、分词器测试

在安装完 ES 之后,新建 索引 的时候,可以指定 分词器,首先对分词器进行一个测试。

POST /_analyze
{
  "analyzer": "standard",
  "text":"最好的时代,最坏的时代"
}

二、索引的增删改

2.1 新建索引

2.1.1 新建最简单的 index

如果不指定 mapping, ES 会自动添加上 mapping。

PUT /<索引名称>

2.1.2 新建带 mapping 的 index

PUT /<index name>
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "data": {
      "properties": {
        "product_name": {
          "type": "text",
          "index": true,
          "store": true,
          "analyzer": "standard"
        },
        "product_agency": {
          "type": "keyword",
          "index": true,
          "store": true
        },
        "notice_type": {
          "type": "keyword",
          "index": true,
          "store": true
        },
        "notice_type_id": {
          "type": "integer",
          "index": true,
          "store": true
        }
      }
    }
  }
}

type:字段类型 ,index:是否建立索引,store:是否存储
特别说明:在 7.x 版本后,在 mapping 中不用指定数据类型 data 。

2.2 删除索引

DELETE <索引名称>

2.3 给 index 起别名

PUT /<索引名称>/_alias/<别名>

2.4 拷贝索引

POST _reindex
{
  "source": {
    "index": "learn_test"
  },
  "dest": {
    "index": "learn_test2"
  }
}

三 索引内容的增删改查

3.1 bulk 批量添加数据

POST /tender_test/_bulk
{"index":{"_index":"tender_test","_type":"data"}}
{"product_agency":"山东方中工程管理有限公司","notice_type_id":"23","product_name":"血培养仪","notice_type":"招标公告"}
{"index":{"_index":"tender_test","_type":"data"}}
{"product_agency":"","notice_type_id":"3","product_name":"全自动微生物鉴定药敏分析仪","notice_type":"招标公告"}

3.2 bulk 批量修改数据

使用 _bulk 来修改数据时,注意,它是整体覆盖的,每次修改需要把全部的字段都包含了,要不就丢数据了。

POST /<索引名称>/_bulk
{"index":{"_index":"tender_test","_type":"data","_id":"bj5pNYABu8HGt75FTQyX"}}
{"product_agency":"山东方中工程管理有限公司","notice_type_id":"230","product_name":"血培养仪","notice_type":"招标公告"}
{"index":{"_index":"tender_test","_type":"data","_id":"bz5pNYABu8HGt75FTQyX"}}
{"product_agency":"","notice_type_id":"31","product_name":"全自动微生物鉴定药敏分析仪","notice_type":"招标公告"}

3.2(补) _update_by_query 按条件修改数据

前段时间在支持运营部分修改数据时,发现需要修改部分数据,而且按照特定的条件,不能用 bulk,那就是能用 _update_by_search 来搞定了,query 是需要修改数据的条件,script 里面则是具体修改的内容,是用脚本的方式来实现的,紧急情况下还是蛮不错的,要不就的推数据了,很慢。

POST /<索引名称>/data/_update_by_query
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "notice_type_id": "3"
          }
        }
      ]
    }
  },
  "script":{
    "source":"[ctx._source['product_agency']=\"1\",ctx._source['notice_type']=\"招标公告2\",ctx._source['redmine']=\"\"]"
  }
}

单个值修改(ES 7.x 版本操作)

POST electronics/_update_by_query
{
  "query": {
    "term": {
      "_id": {
        "value": "6"
      }
    }
  },
  "script":{
    "source":"ctx._source['product_count']=3"
  }
}

3.3 按照id获取数据

这里的 data 是文档类型,ES7 之前,文档类型是自己定义的,但是到了 ES7.x 之后,改为了 _doc 了,默认可以不写。

GET <索引名称>/data/bj5pNYABu8HGt75FTQyX

3.4 match_all 匹配所有数据

POST /tender_test/_search
{
  "query": {
    "match_all": {}
  }
}

3.5 term 精准搜索

POST /<索引名称>/_search
{
  "query":{
    "term":{
      "notice_type": "招标公告"
    }
  }
}

3.6 match 匹配搜索

POST tender_test/_search
{
  "from": 0,
  "size": 20,
  "query": {
    "match": {
      "product_name": "鉴定"
    }
  }
}

3.7 multi_match 多字段匹配

POST <索引名称>/_search
{
  "query": {
    "multi_match": {
      "query": "微生物",
      "fields": ["product_name","product_agency"]
    }
  }
}

3.8 query_string 多值匹配

POST tender_test/data/_search
{
  "query": {
    "query_string": {
      "query": "国际 OR 过敏"
    }
  }
}

当然 and 就是: “query”: “国际 AND 过敏”。

3.9 range 范围匹配

POST <索引名称>/_search
{
  "query": {
    "range": {
      "notice_type_id": {
        "gte": 5,
        "lte": 9
      }
    }
  }
}

3.10 match_phrase 短语匹配

POST tender_test/data/_search
{
  "query": {
    "match_phrase": {
      "product_agency": "四川省工程项目管理咨询有限公司"
    }
  }
}

3.11 prefix 前缀匹配

POST tender_test/_search
{
  "query": {
    "prefix": {
      "notice_type": "招标"
    }
  }
}

3.12 filter 过滤

POST <索引名称>/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "notice_type_id": "5"
        }
      }
    }
  }
}

注:

此处有个面试题,filter 过滤 和 query 匹配区别是什么?
后文补充

四 高级搜索

4.1 highlight 高亮匹配

POST <索引名称>/data/_search
{
  "query": {
    "match": {
      "product_name": "分析仪"
    }
  },
  "highlight": {
    "fields": {
      "product_name": { },
      "product_agency": {}
    }
  }
}

4.2 组合高亮匹配

POST <索引名称>/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "product_name": "分析仪"
          }
        },
        {
          "match": {
            "product_agency": "分析仪"
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "product_name": {},
      "product_agency": {}
    }
  }
}

4.3 聚合统计

POST <索引名称>/_search
{
  "query": {
    "match": {
      "notice_type_id": "20"
    }
  }, 
  "aggs": {
    "groyp_by_notice_type": {
      "terms": {
        "field": "notice_type",
        "order": {
          "_count": "desc"
        }
      },
      "aggs": {
        "groyp_by_notice_type_id": {
          "terms": {
            "field": "notice_type_id",
            "order": {
              "_count": "desc"
            }
          }
        }
      }
    }
  },
  "size": 0
}

4.4 scroll 游标查询

POST <索引名称>/data/_search?scroll=1m
{
  "query": {
    "multi_match": {
      "query": "国际",
      "fields": ["product_name","product_agency"]
    }
  },
  "size": 2
}

首先在查询的时候,可以带上 scroll=1m 参数,在url 中,查询结果中可以拿到 _scroll_id 的值,就是一个长字符串,再用这个字符串直接查询就可以了,如下:

GET _search/scroll?scroll=1m
{
  "scroll_id":"DnF1ZXJ5VGhlbkZldGNoBgAAAAAAAkF1Flh1eDNRcmpvUkVXVHJXSDMxV3BSdGcAAAAAAAJBeBZYdXgzUXJqb1JFV1RyV0gzMVdwUnRnAAAAAAACQXQWWHV4M1Fyam9SRVdUcldIMzFXcFJ0ZwAAAAAAAkF3Flh1eDNRcmpvUkVXVHJXSDMxV3BSdGcAAAAAAAJBdhZYdXgzUXJqb1JFV1RyV0gzMVdwUnRnAAAAAAACQXkWWHV4M1Fyam9SRVdUcldIMzFXcFJ0Zw=="
}

多用于翻页查询中。

4.5 模板查询

POST <索引名称>/_search/template
{
  "source": {
    "query": {
      "range": {
        "notice_type_id": {
          "gte": "{{start}}",
          "lte": "{{end}}"
        }
      }
    }
  },
  "params": {
    "start": 10,
    "end": 20
  }
}

4.6 模板重复使用

首先报错查询模板到 ES 中

POST _scripts/test
{
  "script":{
     "lang": "mustache",
     "source":{
       "query":{
         "match":{
           "product_name":"{{pn}}|"
         }
       }
     }
  }
}

然后再通过模板传参查询

GET tender_data/_search/template
{
  "id":"test",
  "params": {
    "pn":"分析仪"
  }
}

五 关联查询

5.1 新建index, mapping创建

PUT fashion_bolog
{
  "mappings": {
    "data": {
      "properties": {
        "blog_comments_relation": {
          "type": "join",
          "relations": {
            "blog": "comment"
          }
        },
        "title": {
          "type": "keyword"
        },
        "content": {
          "type": "text"
        }
      }
    }
  }
}

新添加的 index 名是 fashion_bolog,在 mapping 中添加了 blog 和 comment 的关系,在后面的插入数据的时候,首先插入 blog 数据,然后为没调 blog 数据插入它的子数据,并且添加上依赖关系,blog 被称为是 主表,comment 就是子表。

5.2 插入数据

下面插入了两条主表 blog 的数据。(两条博客)

PUT fashion_bolog/data/001
{
  "title":"Nice day",
  "content":"Today is a nice day, play game and eat fish",
  "blog_comments_relation":{
    "name":"blog"
  }
}

PUT fashion_bolog/data/002
{
  "title":"今天学习了啥",
  "content":"今天学习了怎么用全文搜索技术Elasticsearch",
  "blog_comments_relation":{
    "name":"blog"
  }
}

下面为 id 是 001 的博客添加了几条评论,comment_x 是评论的 id, routing 指定关联的主表的数据的 id。

PUT fashion_bolog/data/comment_2?routing=001
{
  "comment":"I m glad to hear that, good luck",
  "username":"stephen",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"001"
  }
}

PUT fashion_bolog/data/comment_3?routing=001
{
  "comment":"Really, that good",
  "username":"anji",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"001"
  }
}

PUT fashion_bolog/data/comment_4?routing=001
{
  "comment":"phen have a nice life",
  "username":"zhenglei",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"001"
  }
}

5.3 查找 001 博客(按照主表查询)

下面查找 id 是 001 的博客的评论,使用 parent_id 查询主表。

POST fashion_bolog/_search
{
  "query": {
    "parent_id":{
      "type":"comment",
      "id":"001"
    }
  }
}

5.4 按照博客主题查询 (按照主表查询)

下面查询了博客名称为 “Nice day” 的博客的评论。

POST fashion_bolog/_search
{
  "query": {
    "has_parent": {
      "parent_type": "blog",
      "query": {
        "match": {
          "title": "Nice day"
        }
      }
    }
  }
}

5.4 按照评论者用户名查询 (按照从表查询)

下面查询了评论的用户名是 “zhenglei” 的博客。

POST fashion_bolog/_search
{
  "query": {
    "has_child": {
      "type": "comment",
      "query": {
        "match":{
          "username":"zhenglei"
        }
      }
    }
  }
}

总结

例如:以上就是在 kibana 中操作 index 的常规操作,工作中基本可以满足,语法记录在此,方便copy 出来在工作里面用,比较这语法还是写起来很费时的,这不耽误加班吗。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于学习Elasticsearch,我可以给你一些指导。Elasticsearch是一个开源的分布式搜索和分析引擎,主要用于快速、实时地存储、搜索和分析大量数据。下面是一些学习Elasticsearch的步骤: 1. 了解基本概念:开始学习Elasticsearch之前,你需要了解一些基本的概念,比如索引(index)、类型(type)、文档(document)、字段(field)等。这将帮助你更好地理解Elasticsearch的工作原理。 2. 安装和配置:根据你的操作系统,你可以从Elasticsearch官方网站下载并安装合适的版本。安装完成后,你需要进行适当的配置,如设置集群名称、分配内存等。 3. 学习REST API:Elasticsearch提供了丰富的REST API,用于与其进行交互。了解如何使用这些API来索引、搜索和删除数据是学习Elasticsearch的重要一步。 4. 索引和搜索数据:学习如何创建索引、添加文档以及执行搜索操作是使用Elasticsearch的关键。掌握查询语法、过滤器、聚合操作等功能可以帮助你更有效地使用Elasticsearch。 5. 数据建模和分析:学习如何设计合适的数据模型和映射,以及如何使用Elasticsearch进行数据分析和可视化是提高你的技能的重要一步。 6. 扩展和优化:学习如何在生产环境中扩展和优化Elasticsearch集群是非常重要的。了解如何分片、复制、调优性能等将帮助你更好地管理和维护你的数据。 7. 学习资源:除了官方文档,还有很多优秀的学习资源可供参考,如书籍、教程和在线课程等。利用这些资源可以更系统地学习和掌握Elasticsearch。 希望这些步骤能对你学习Elasticsearch有所帮助!如果有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值