ElasticSearch - Go


Es搜索引擎

  • 优点:容错性好;单点故障时,可以通过复制数据到不同的服务器上达到容错的目的;

  • 使用前提:没有频繁更新(一秒内有大量的更改操作),不需要事务处理,需要对数据进行检索,统计;

  • 存储形式:ES中,存储数据的基本单位就是索引,比如说ES中存储了一些订单系统的销售数据,就因该在ES中创建一个索引(order—index),所有的销售数据就会都写到这个索引里面去,一个索引就像一个数据库,mapping就相当于表的结构定义,定义了什么字段类型等,你往index里添加一行数据就叫做一个document,每一个document有多个filed,每一个filed就代表这个document的一个字段的值。


  • 字段类型: 文档由多个json字段,这个字段跟mysql中的表的字段是类似的。ES中的字段也是有类型的,常用字段类型有:

数值类型(long、integer、short、byte、double、float)

Date 日期类型

boolean布尔类型

Text 支持全文搜索

Keyword 不支持全文搜索,例如:phone这种数据,用一个整体进行匹配就ok了,也不要进行分词处理

Geo 这里主要用于地理信息检索、多边形区域的表达。

  • mapping设计
    Elasticsearch的mapping类似于mysql中的表结构体定义,每个索引都有一个映射的规则,我们可以通过定义索引的映射规则,提前定义好文档的json结构和字段类型,如果没有定义索引的映射规则,ElasticSearch会在写入数据的时候,根据我们写入的数据字段推测出对应的字段类型,相当于自动定义索引的映射规则。

注意:ES的自动映射是很方便的,但是实际业务中,对于关键字段类型,我们都是通常预先定义好,这样可以避免ES自动生成的字段类型不是你想要的类型。

  • 字段存储结构体多为String Json存储 ,读取后通过Json解析即可,对于精确搜索的字段信息采用keyword查询,其他采用ES原生match或term查询。

基本语法

GET /{索引名}/_search
{"from" : 0,  // 搜索结果的开始位置"size" : 10, // 分页大小,也就是一次返回多少数据"_source" :[ ...需要返回的字段数组... ],"query" : { ...query子句... },"aggs" : { ..aggs子句..  },"sort" : { ..sort子句..  }
}
  • 范围查询
GET /{索引名}/_search
{"query": {"range": {"{FIELD}": {"gte": 100, "lte": 200}}}
}

{FIELD} - 字段名
gte范围参数 - 等价于>=
lte范围参数 - 等价于 <=
范围参数可以只写一个,例如:仅保留 “gte”: 100, 则代表 FIELD字段 >= 100
gt - 大于 ( > )

gte - 大于且等于 ( >= )

lt - 小于 ( < )

lte - 小于且等于 ( <= )

  • bool组合查询
GET /{索引名}/_search
{"query": {"bool": { // bool查询"must": [], // must条件,类似SQL中的and, 代表必须匹配条件"must_not": [], // must_not条件,跟must相反,必须不匹配条件"should": [] // should条件,类似SQL中or, 代表匹配其中一个条件}}
}
  • 排序
GET /{索引名}/_search
{"query": {...查询条件....},"sort": [{"{Field1}": { // 排序字段1"order": "desc" // 排序方向,asc或者desc, 升序和降序}},{"{Field2}": { // 排序字段2"order": "desc" // 排序方向,asc或者desc, 升序和降序}}....多个排序字段.....]
}

  • term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
    match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程,match查询相当于模糊匹配,只包含其中一部分关键词就行

拆分相当于 雷神加速器被拆分为“雷”“神” “加” “速” “器” match 搜索雷、神、加都能够搜索出结果
match查询的结果中一定会有“雷”“神” “加” “速” “器” 字样
term的查询结果就会包含只有“雷”“神” “加” “速” “器” 这个分词结果的数据
match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,而term会直接对关键词进行查找。一般模糊查找的时候,多用match,而精确查找时可以使用term。

  • 对于.keyword则为不拆分 全文搜索
    Text 与. keyword的区别
    Text:
    会分词,然后进行索引
    支持模糊、精确查询
    不支持聚合
    keyword:
    不进行分词,直接索引
    支持模糊、精确查询
    支持聚合

Elastic-go

go-client参数
elastic.SetURL(url)用来设置ES服务地址,如果是本地,就是127.0.0.1:9200。支持多个地址,用逗号分隔即可。
elastic.SetBasicAuth("user", "secret")这个是基于http base auth 验证机制的账号密码。
elastic.SetGzip(true)启动gzip压缩
elastic.SetHealthcheckInterval(10*time.Second)用来设置监控检查时间间隔
elastic.SetMaxRetries(5)设置请求失败最大重试次数,v7版本以后已被弃用
elastic.SetSniff(false)允许指定弹性是否应该定期检查集群(默认为true)
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)) 设置错误日志输出
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)) 设置info日志输出
查询操作
{
"query": {
"bool": {
"must": [
{
"term": {
"Port": "443"
}
}
,
{
"term": {
"State": "established"
}
}
],
"must_not": [
{
"term": {
"RemoteAddr": "0.0.0.0"
}
}
],
"should": [ ]
}
},
"from": 0,
"size": 250,
"sort": [ ],
"aggs": { }
}Go调用代码
//多条件精确查询
query := elastic.NewBoolQuery()
//排除特定信息用must_not
query  = query.MustNot(elastic.NewTermQuery("RemoteAddr", "0.0.0.0"), elastic.NewTermQuery("RemoteAddr", "127.0.0.1"))if ip != "" {query = query.Must(elastic.NewTermQuery("IP", ip))}if value != "" {query = query.Must(elastic.NewTermQuery("Port", value))}if state != "" {//注意term需要小写才能识别 因为分词器会将大写字母转换为小写query = query.Must(elastic.NewTermQuery("State", strings.ToLower(state)))}//查询需要指定size 否则默认为Es查询10条数据,可通过修改ES配置或指定size修改res, err := Client.Search("network").Query(query).Size(size).Do(context.Background())if err != nil {err...}//判断返回结果数量进行数据处理if res.Hits.TotalHits.Value > 0 {for _, v := range res.Hits.Hits {//v.Source为搜索结果json.Unmarshal(v.Source, &temp)}}//模糊查询
query := elastic.NewBoolQuery()if ip != "" {query = query.Must(elastic.NewTermQuery("IP", ip))}if value != "" {query = query.Must(elastic.NewWildcardQuery("Name.keyword", value))}res, err := Client.Search("application").Query(query).Size(size).Do(context.Background())if err != nil {return nil, err}if res.Hits.TotalHits.Value > 0 {for _, v := range res.Hits.Hits {//v.Source为搜索结果json.Unmarshal(v.Source, &temp)}}

/*下面是简单的CURD*///创建
func Create(str interface{}, index, id string) error {conn := Client.Index()_, err := conn.Index(index).Id(id).BodyJson(str).Do(context.Background())if err != nil {return err}return nil
}//删除
func Delete(index, id string) error {_, err := Client.Delete().Index(index).Id(id).Do(context.Background())if err != nil {return err}return nil
}//修改
func Update(str interface{}, index, id string) error {_, err := Client.Update().Index(index).Id(id).Doc(str).Do(context.Background())if err != nil {return err}return nil
}//查找
func SelectEsToBytes(index, id string) ([]byte, error) {//通过id查找get1, err := Client.Get().Index(index).Id(id).Do(context.Background())if err != nil {return nil, err}if get1.Found {return get1.Source, nil}return get1.Source, errors.New("filed Not Found")
}

ElasticSearch操作Go相关推荐

  1. 通过Spring Data Elasticsearch操作ES

    Elasticsearch Elasticsearch (ES)是一个基于Lucene构建的开源.分布式.RESTful 接口全文搜索引擎.Elasticsearch 还是一个分布式文档数据库,其中每 ...

  2. 最清晰易懂的Elasticsearch操作手册|收藏夹必备

    写在前面:我是「且听风吟」,目前是一名大数据开发工程师,热爱大数据开源技术,喜欢分享自己的所学所悟,现阶段正在从头梳理大数据体系的知识,以后将会把时间重点放在Spark和Flink上面. 如果你也对大 ...

  3. elasticsearch操作

    添加 类型为employee,该类型位于索引megacorg,每个雇员索引一个文档,该文档包含该雇员的全部信息(面向文档),该雇员的id为1 需要index.type.id curl -X PUT - ...

  4. 【项目经验】最新最全ElasticSearch操作详解

    文章目录 一.引言 1.1 海量数据 1.2 全文检索 1.3 高亮显示 二.ES概述 2.1 ES的介绍 2.2 ES的由来 2.3 ES和Solr 2.4 倒排索引 三. ElasticSearc ...

  5. 【SpringBoot】整合Elasticsearch 操作索引及文档

    官网操作文档:Elasticsearch Clients | Elastic 踩坑太多了...这里表明一下Spring Boot2.4以上版本可能会出现问题,所以我降到了2.2.1.RELEASE.对 ...

  6. Yii2 Elasticsearch 操作Demo

    此处用的是yii2 高级版 1: 配置 : common/config/main.php 'components' => ['elasticsearch' => ['class' => ...

  7. 使用python库elasticsearch操作es

    1.单个写入 from elasticsearch import Elasticsearch es = Elasticsearch("192.168.0.11:9200")mapp ...

  8. Elasticsearch介绍Kibana分词器增删改操作

    Elasticsearch Elasticsearch介绍和安装 简介 Elastic Elastic官网:https://www.elastic.co/cn/ Elastic有一条完整的产品线及解决 ...

  9. python elasticsearch模块_Python 操作 ElasticSearch

    Python操作ElasticSearch Python批量向ElasticSearch插入数据 Python 2的多进程不能序列化类方法, 所以改为函数的形式. 直接上代码: #!/usr/bin/ ...

最新文章

  1. R语言Logistic回归模型案例基于AER包的affair数据分析
  2. 微软算法100题58 从尾到头输出链表(java)
  3. SQLServer自增变量修复
  4. 【高性能定时器】 时间轮
  5. java名片_javaweb名片管理系统
  6. mysql max字符串报错_mysql [Warning] max_join_size报错问题解决办法
  7. 酷派删除android系统软件,【玩机教程】酷派手机root后不可删除系统自带程序+组件中英对照...
  8. 云计算已在大数据分析中发挥重要作用
  9. 微服务springCloud初识
  10. LeetCode解题思路—双指针模式
  11. AD10 PCB等长布线----蛇形布线
  12. SpringBoot电影网站源码(含数据库)
  13. JanusGraph的使用
  14. 【ctfshow】- web189
  15. 计算机组成存储单元地址分配,主存中存储单元地址的分配
  16. UIGestureRecognizer触控手势
  17. 直插电阻通过色环读取电阻阻值,误差与温度系数方法总结
  18. openGL-设计交互平面图形(旋转、平移、缩放)
  19. Algorithm:数学建模大赛(CUMCM/NPMCM)之NPMCM全国研究生数学建模竞赛(NPMCM)历年试题集合、试题库、学习网站推荐之详细攻略
  20. Handlebars的使用方法文档整理(Handlebars.js)

热门文章

  1. 用css画一个三角形
  2. 征途手游服务器又维护,征途手机版家族维护轻松赚经验
  3. 企业推行6s管理如何提高员工的素养
  4. 自然语言处理(NLP)之求近义词和类比词<MXNet中GloVe和FastText的模型使用>
  5. IDEA向前向后箭头如何设置
  6. 14场胜负彩玩法 Java版本
  7. 数据手套的设计与实现
  8. 基于51单片机多功能酒精浓度检测仪系统设计(毕业课设)
  9. 双非计算机专业研究团队,就业有多好?北京语言大学SAIT智能语音习得技术实验室...
  10. Quaternion kinematics for error state kalman filter实现GPS+IMU融合,(附源码)