es-7.14.0(easy-es)使用

news/2024/7/7 6:38:44 标签: elasticsearch, jenkins, 大数据

文章目录

  • 前言
  • 一、es kibana ik 安装
  • 二、使用步骤
    • 访问地址
    • api调用
  • 总结


前言

全文索引,首选es,最近看了下easy-es,完全与mybatis-plus类似,简单试了下,很不错;
easy-es 使用的 7.14.0,这里也仅用此版本说明;

安装了桌面版本docker desktop
安装了es 和 kibana 中文分词 ik 都是 7.14.0

倒排索引

  • 正排索引: 索引>>数据(mysql)
  • 文档中的关键词所在文档id列表;所有的这些信息就是倒排文件(还记录了关键词所在位置,出现次数)
    elastic

一、es kibana ik 安装

# 创建network
docker network create elastic
# 启动es
docker run --name elastic -p 9200:9200 -p 9300:9300 --network=elastic -e "discovery.type=single-node" -d elasticsearch:7.14.0
# 启动kibana
docker run -d --name kibana --network=elastic -p 5601:5601 kibana:7.14.0

# 进入容器
docker exec -it elastic  /bin/bash
# 执行安装命令
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.0/elasticsearch-analysis-ik-7.14.0.zip
# 修改elastic 配置文件 vi config/elasticsearch.yml 设置用户名 密码添加
xpack.security.enabled: true
# 执行命令 生产
./bin/elasticsearch-setup-passwords auto
# 日志会有如下内容(es 用户名密码): 
Changed password for user apm_system
PASSWORD apm_system = XeKm1qyZYOEWNhToX27q

Changed password for user kibana_system
PASSWORD kibana_system = 8XOWmnjzdttz0ELilk8T

Changed password for user kibana
PASSWORD kibana = 8XOWmnjzdttz0ELilk8T

Changed password for user logstash_system
PASSWORD logstash_system = 1Bxkb28EPpCzsnkeHkDu

Changed password for user beats_system
PASSWORD beats_system = ZWvas9mn6gnrYRdNhaoM

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = M0ApshjIWQZ5QQ0yN7Hy

Changed password for user elastic
PASSWORD elastic = NUZvcsKDRdvJwrpV1i1J

# 进入kibana 容器 设置kibana (es:地址 用户名 密码)配置文件  vi config/kibana.yml
elasticsearch.hosts: [ "http://elastic:9200" ]
elasticsearch.username: "elastic"
elasticsearch.password: "NUZvcsKDRdvJwrpV1i1J"
# 这里的用户名密码,在上面随机选一个就行,我这个选的是最后一个
重启两个服务
注意: 修改自定义密码,需要重新配置kibana中的用户名密码

二、使用步骤

访问地址

es : localhost:9200
es
kibana : localhost:5601
kibana

api调用

es 基本增删改查

  1. text 会进行分词
  2. keyword 不会分词
  3. term 精准查询
  4. terms 批量精准查询
  5. 排序sort
  6. 分页 from size
  7. 高亮查询 highlight
  8. 聚合函数 分组查询 aggs
# 获取所有movies
GET /movies/_search
{
  "query": {
    "match_all": {}
  }
}

# 验证分词
GET _analyze
{
  "analyzer": "ik_max_word",
  "text": ["我爱中国"]
}

# 获取所有索引
GET _cat/indices

# 删除索引
DELETE movies

# 创建索引 配置映射
PUT /movies
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      },
      "age":{
        "type": "double"
      },
      "no":{
        "type": "keyword"
      }
    }
  }
}

GET movies

# test 测试
GET test


# 有则修改,无则增加
PUT test/doc/2
{
  "name":"wangfei",
  "age":27,
  "desc":"热天还不让后人不认同"
}

PUT test/doc/1
{
  "name":"wangjifei",
  "age":27,
  "desc":"萨芬我反胃为范围额"
}

PUT test/doc/3
{
  "name":"wangyang",
  "age":30,
  "desc":"点在我心内的几首歌"
}

# 获取test 中 id为3 的数据
GET test/_doc/1
# 获取索引为 test 的所有
GET test/_search

# 删除
DELETE test/_doc/1

# 修改属性
POST test/_doc/1/_update
{
  "doc":{
    "desc":"生活就像 茫茫海上"
  }
}


# 根据属性查询
GET test/_search
{
  "query": {
    "match": {
      "desc":"我要上天"
    }
  }
}

# 间隔搜索 slop 代表间隔多少个字符内
GET test/_search
{
  "query": {
    "match_phrase": {
      "desc":{
        "query": "生活海上",
        "slop": 6
      }
    }
  }
}

# 前缀匹配 highlight 高亮查询
GET /test/_search
{
  "query": {
    "match_phrase_prefix": {
      "desc": "像"
    }
  },
  
   "highlight": {
    "pre_tags": "<b class='key' style='color:red'>",
    "post_tags": "</b>",
    "fields": {
      "desc": {}
    }
  }
}

# 多字段查询
GET test/_search
{
  "query": {
    "multi_match": {
      "query": "生活海上",
      "fields": ["name","desc"]
    }
  }
}

# 排序查询
GET test/_search
{
 "sort": [
   {
     "age": {
       "order": "asc"
     }
   }
 ]
}

# bool: must 同时满足/should 满足一个即可
GET test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "age": 27
          }
        },
        {
          "match": {
            "desc": "上"
          }
        }
      ]
    }
  }
}

GET test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "age": 27
          }
        },
        {
          "match": {
            "desc": "的"
          }
        }
      ]
    }
  }
}

# 过滤
GET test/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gte": 28,
              "lte": 30
            }
          }
        }
      ]
    }
  },
   "_source": ["name"]
}


# 排序 分页查询
GET test/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 1,
  "size": 2
}

# 高亮查询 highlight
GET /test/_search
{
  "query": {
    "match": {
      "desc": "后人"
    }
  },
  "highlight": {
    "pre_tags": "<b class='key' style='color:red'>",
    "post_tags": "</b>",
    "fields": {
      "desc": {}
    }
  }
}

# trem 精准查询
GET test/_search
{
  "query": {
    "term": {
      "age": {
        "value": "30"
      }
    }
  }
}
# trems 精准查询多个
GET test/_search
{
  "query": {
    "terms": {
      "age": [
        27,
        30
      ]
    }
  }
}

# 聚合函数
GET test/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "my_avg": {
      "avg": {
        "field": "age"
      }
    }
  }
}

# 分组查询  再函数平均值
GET test/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "mygroup":{
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 10,
            "to": 29
          },
          {
            "from": 29,
            "to": 30
          }
        ]
      },
      "aggs": {
        "my_avg": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}

总结

easy-es使用起来真的是很丝滑,可以直接看官网介绍了,文档很全;

    /**
     * LambdaEsIndexWrapper构造器使测案例一:创建索引,通过开箱即用的方法创建
     */
    @Test
    public void testCreateIndex() {
        LambdaEsIndexWrapper<Document> wrapper = new LambdaEsIndexWrapper<>();
        // 此处简单起见 索引名称须保持和实体类名称一致,字母小写 后面章节会教大家更如何灵活配置和使用索引
        wrapper.indexName(Document.class.getSimpleName().toLowerCase());

        // 此处将文章标题映射为keyword类型(不支持分词),文档内容映射为text类型(支持分词查询)
        wrapper.mapping(Document::getTitle, FieldType.KEYWORD, 2.0f)
                .mapping(Document::getLocation, FieldType.GEO_POINT)
                .mapping(Document::getGeoLocation, FieldType.GEO_SHAPE)
                .mapping(Document::getContent, FieldType.TEXT, Analyzer.IK_SMART, Analyzer.IK_MAX_WORD);
        
        // 设置分片及副本信息,可缺省
        wrapper.settings(3, 2);

        // 设置别名信息,可缺省
        String aliasName = "daily";
        wrapper.createAlias(aliasName);

        // 设置父子信息,若无父子文档关系则无需设置
        wrapper.join("joinField", "document", "comment");

        // 创建索引
        boolean isOk = documentMapper.createIndex(wrapper);
        Assertions.assertTrue(isOk);
    }

    /**
     * LambdaEsIndexWrapper构造器使测案例二:创建索引,通过自定义map 最难用但也最灵活
     */
    @Test
    public void testCreateIndexByMap() {
        // 演示通过自定义map创建索引,最为灵活,若方案一不能满足时可用此方法
        LambdaEsIndexWrapper<Document> wrapper = new LambdaEsIndexWrapper<>();
        wrapper.indexName(Document.class.getSimpleName().toLowerCase());
        wrapper.settings(3, 2);
        Map<String, Object> map = new HashMap<>();
        Map<String, Object> prop = new HashMap<>();
        Map<String, String> field = new HashMap<>();
        field.put("type", FieldType.KEYWORD.getType());
        prop.put("this_is_field", field);
        map.put("properties", prop);
        wrapper.mapping(map);
        boolean isOk = documentMapper.createIndex(wrapper);
        Assertions.assertTrue(isOk);
    }

    /**
     * LambdaEsIndexWrapper构造器使测案例三:更新索引(不推荐使用,因为索引变动ES会重建索引,有其它更好的方式,可参考后面索引托管章节)
     */
    @Test
    public void testUpdateIndex() {
        // 测试更新索引
        LambdaEsIndexWrapper<Document> wrapper = new LambdaEsIndexWrapper<>();
        // 指定要更新哪个索引
        String indexName = Document.class.getSimpleName().toLowerCase();
        wrapper.indexName(indexName);
        wrapper.mapping(Document::getCreator, FieldType.KEYWORD);
        wrapper.mapping(Document::getGmtCreate, FieldType.DATE);
        boolean isOk = documentMapper.updateIndex(wrapper);
        Assertions.assertTrue(isOk);
    }


http://www.niftyadmin.cn/n/5455758.html

相关文章

MySQL高可用解决方案――从主从复制到InnoDB Cluster架构

2024送书福利正式起航 关注「哪吒编程」&#xff0c;提升Java技能 文末送5本《MySQL高可用解决方案――从主从复制到InnoDB Cluster架构》 大家好&#xff0c;我是哪吒。 爱奇艺每天都为数以亿计的用户提供7x24小时不间断的视频服务。通过爱奇艺的平台&#xff0c;用户可以…

MySQL数据库高级语句

文章目录 MySQL高级语句older by 排序区间判断查询或与且&#xff08;or 与and&#xff09;嵌套查询&#xff08;多条件&#xff09;查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符嵌套查询&#xff08;子查询&#xff09;同表不同表嵌套查询还能用于删除…

jmeter常用的函数

20211025白板 课前内容&#xff1a; 参数&#xff1a; 用户定义变量&#xff1a;它是一个全局变量&#xff0c;在启动运行时&#xff0c;获取一次值&#xff0c;在运行过程中&#xff0c;不会动态获取值。 用户定义变量&#xff0c;在启动时获取一次值&#xff0c;在运行过程中…

Csharp学习Linq

Linq的学习 这里继续使用之前文章创建的学生类&#xff0c;首先简单介绍一下linq的使用。 Student.cs public class Student{public int Id { get; set; }public int ClassId { get; set; }public string Name { get; set; }public int Age { get; set; }public string Descr…

标题:C++初阶 | [十] stack 和 queue

摘要&#xff1a;stack OJ&#xff1a;最小栈、栈的弹出压入序列&#xff1b;queue OJ&#xff1a;二叉树的层序遍历(仅思路&#xff0c;带图解)、逆波兰表达式求值&#xff1b;deque&#xff0c;模拟实现 stack 和 queue 经过对 string、vector、list 的学习&#xff0c;stack…

conda安装GPU版pytorch,但是安装的是cpu的

conda安装GPU版pytorch&#xff0c;但是安装的是cpu的 安装命令 conda install pytorch torchvision torchaudio pytorch-cuda11.7 -c pytorch -c nvidia安装结果 解决办法一&#xff08;别的博客建议&#xff0c;这里不适合我&#xff09; 卸载pytorch-mutex或者卸载cpuonly …

如何创建azure pipeline

Azure Pipelines是一种持续集成和持续交付&#xff08;CI/CD&#xff09;工具&#xff0c;可以帮助开发团队自动化构建、测试和部署应用程序。以下是创建Azure Pipeline的步骤&#xff1a; 登录到Azure DevOps&#xff08;https://dev.azure.com/&#xff09;。在Azure DevOps…

如何制定公平、客观的考核标准,避免主观偏见和人情因素的影响?

在企业管理中&#xff0c;考核标准的制定是确保员工绩效评价公正、客观的关键环节。然而&#xff0c;由于主观偏见和人情因素的影响&#xff0c;很多企业在考核过程中往往难以做到公平、公正。本文将探讨如何制定公平、客观的考核标准&#xff0c;以最大程度地减少主观偏见和人…