程序员的资源宝库

网站首页 > gitee 正文

elastic search book [ ElasticSearch book es book]

sanyeah 2024-03-29 17:12:20 gitee 10 ℃ 0 评论

谁在使用ELK

维基百科, github都使用 ELK (ElasticSearch es book)

 

bilibili视频

https://www.bilibili.com/video/BV1hh411D7sb?p=8

Elasticsearch - 尚硅谷(1. 概述)学习笔记 ==> https://blog.csdn.net/weixin_44449838/article/details/116275811

Elasticsearch - 尚硅谷(2. Elasticsearch 安装)学习笔记 ==> https://blog.csdn.net/weixin_44449838/article/details/116330606

Elasticsearch - 尚硅谷(3. Elasticsearch 基本操作_上)学习笔记 ==> https://blog.csdn.net/weixin_44449838/article/details/116331571

Elasticsearch - 尚硅谷(4. Elasticsearch 基本操作_下)学习笔记 ==> https://blog.csdn.net/weixin_44449838/article/details/116457873

Elasticsearch - 尚硅谷(5. Elasticsearch 环境)学习笔记 ==> https://blog.csdn.net/weixin_44449838/article/details/116480032

Elasticsearch - 尚硅谷(6. Elasticsearch 进阶-上)学习笔记 ==> https://blog.csdn.net/weixin_44449838/article/details/116500569

Elasticsearch - 尚硅谷(7. 进阶-下)学习笔记 ==> https://blog.csdn.net/weixin_44449838/article/details/116501937

Elasticsearch - 尚硅谷(8. 优化)学习笔记 ==> https://blog.csdn.net/weixin_44449838/article/details/117285551

 

 

 

 

 

 

尚硅谷--雷丰阳--ElasticSearch 7.4.2版本 [转] ==>https://www.cnblogs.com/whatlonelytear/p/15813144.html

 

该怎么学elasticsearch?==》https://www.zhihu.com/question/323811022

Elasticsearch简介与实战==>https://www.jianshu.com/p/d48c32423789

 

 

 

 

 

 

 

 

 

 

 

es安装

Elasticsearch 7.x 最详细安装及配置==>https://www.cnblogs.com/Alandre/p/11386178.html

 

遇见异常

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

在   /etc/sysctl.conf文件最后添加一行    vm.max_map_count=262144

 

其它异常提前规避

进到 root 权限 , 执行 ulimit -n 65536 提前调大 open files 上限

 

ElasticSearch入门

Elasticsearch入门,这一篇就够了==>https://www.cnblogs.com/sunsky303/p/9438737.html

yuque  https://www.yuque.com/puredream/am1ddn/tlm6gw

docker下载并启动ElasticSearch


# 下载
docker pull docker.io/elasticsearch:6.5.1
# 安装
docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300 --name myELK elkImageId

 

ElasticSearch默认2个G堆内存, 为了防止虚拟机内存不够,要手动指定elk启动参数 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" , 9200是elk暴露的RestFUL HTTP服务端口, 9300是elasticSearch集群间通信的端口.

在启动时遇到异常:   max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]  , 意为ElasticSearch用户虚拟机能使用的虚拟内存区域太小,需要调大到262144以上 , 按如下操作:

# 修改配置文件
vi /etc/sysctl.conf
# 最后一行添加
vm.max_map_count=655300
# 重载该配置文件
sysctl -p

 

附非docker, 纯linux版启停命令

注意: 纯linux版启动不能以root身份启动 

#停止Elasticsearch进程
$kill `ps -ef | grep Elasticsearch | grep -v grep | awk '{print $2}'`
#启动Elasticsearch进程
$/elasticsearch-5.4.3/bin/elasticsearch -d

 

 

访问

http://ip:9200/ 返回如下信息表示成功启动

{
  "name" : "vcabSCo",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "LPiwCqIYQACz5Eir5P1qBQ",
  "version" : {
    "number" : "6.5.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "8c58350",
    "build_date" : "2018-11-16T02:22:42.182257Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

 

 http://ip:9200/index/type/id 为查询指定id

http://ip:9200/index/type/_search 为查询所有

 

ElasticSearch 各组件概念

索引 = mysql数据库

类型 = mysql数据表

文档 = mysql表字段内容 ( ES中使用json数据保存 )

processon地址: https://www.processon.com/diagraming/5ceb8caee4b0899ed43db40e

 

ElasticSearch和Mysql对应关系

技术 库名  
mysql Databases Tables Rows Columns  
ElasticSearch Indices Types Documents Fields  

 

Elasticsearch6.0以后为什么删除Type类型

一开始,我们我们谈到 一个 ES的索引类似于关系型数据库中的数据库,一个映射类型则相当于关系型数据库中的一张表。

这是一个错误的类比,导致了错误的假设。在一个关系型数据库中,表之间是相互独立的。一个表中的列与另一个表中同名的列没有关系。然而在映射类型中却不是这样的。

在一个Elasticsearch的索引中,有相同名称字段的不同映射类型在Lucene内部是由同一个字段支持的。换言之,看下面的这个例子,user 类型中的 user_name字段和tweet类型中的user_name字段实际上是被存储在同一个字段中,而且两个user_name字段在这两种映射类型中都有相同的定义(如类型都是 text或者都是date)。

这会导致一些问题,比如,当你希望在一个索引中的两个映射类型,一个映射类型中的 deleted 字段映射为一个日期数据类型的字段,而在另一个映射类型中的deleted字段映射为一个布尔数据类型的字段,这就会失败。

最重要的是,在一个索引中存储那些有很少或没有相同字段的实体会导致稀疏数据,并且干扰Lucene有效压缩文档的能力。

本小节摘自: https://zhuanlan.zhihu.com/p/66716868

 

 

 

 

java连接ELK有三种方式

方式一: jest

jest是用于直联ElasticSearch服务的, 就好像redisClient 直联redis服务一样.

默认jest是不生效的, 需要导入jest的工具包(io.searchbox.client.JestClient) , 注意jest的大版本号和ES的大版本号要一致.

该模式的自动配置类为: JestAutoConfiguration

pom.xml导依赖 

导入之后JestAutoConfiguration里的内容就不会报红色错误了, 但是发现高版本springboot好像不导也正常.

        <!--取消spring-boot-starter-data-elasticsearch依赖-->
        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-data-elasticsearch</artifactId>-->
        <!--</dependency>-->


        <dependency>
            <groupId>io.searchbox</groupId>
            <artifactId>jest</artifactId>
            <version>5.3.3</version>
        </dependency>

 

遇到错误,Jest无法存数据到ElasticSearch中, java后台不报错, ElasticSearch也不报错, 也没有日志显示错误 ,

目前jest5.3.3对ElasticSearch5.6.12 可以正常交互 ,   但jest5.3.3对ElasticSearch6 或jest6对ElasticSearch6无法正常交互. 

 

方式二: SpringData ElasticSearch

通过使用Spring工具类转发,步骤如下

1. pom.xml导入spring-boot-starter-data-elasticsearch依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

 

2. 需要在application.properties中配置clusterNodes;clusterName

#使用springData连接ES
#集群名,访问 http://centos:9200/ 后返回的cluster_name即是节点名
spring.data.elasticsearch.cluster-name=elasticsearch
#IP:9300, 用的是9300通信
spring.data.elasticsearch.cluster-nodes=centos:9300

 3. 编写ElasticsearchRepository子接口来操作ES (就好像hibernateTemplate一样, 和JPA用法一致)

 

4. ElasticSearchTemplate 操作ES , 就好像(jdbcTemplate, 一样, 未实验, 只做了Repository的实验)

 

 

另外特别注意在使用SpringData elasticSearch 和 elasticSearch对接时的要注意版本问题 , 如何找版本匹配参考下图流程 , 懒人直接打开 https://github.com/spring-projects/spring-data-elasticsearch

 遇上版本不匹配的概率较高, 会发生异常"NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{3mA3x7OSSjustRG1_ZytWg}{centos}{192.168.2.106:9300}]"   一般有两种处理方式 

1. 调整springboot的版本(不建议)

2. 调整ElasticSearch的版本(建议)

3. Elasticsearch报 NoNodeAvailableException 的解决办法==>https://blog.csdn.net/adsl624153/article/details/78935796   (未亲测)

 

 

方式三 RestHighLevelClient

 

 RestHighLevelClient 创建索引:

    public String createDocument() throws Exception {
        RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("nexus.isoftstones.com", 9201, "http")));
        // 3. 增加文档(如果类注释推荐使用org.elasticsearch.client.Requests来创建类,最好用他推荐的方式)
        IndexRequest request = Requests.indexRequest("person");
        request.id("docid2");// 指定ID
        request.source("personid", "2",
                "name", "jack",
                "birthday","2012-02-16");// 支持多种方式
        IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
        System.out.println(indexResponse);
        return "创建成功";
    }

 

 RestHighLevelClient 查询索引:

    @RequestMapping({"/searchSomePerson"})
    public List<Person> searchSomePerson() throws Exception {

        List<Person> personList = new ArrayList<>();
        SearchRequest searchRequest = new SearchRequest("person");//qqq
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//aaa

//        int newFrom = PaginationTool.firstResult(1 , PaginationTool.PAGE_SIZE);
//        sourceBuilder.from(newFrom);
//        sourceBuilder.size(PaginationTool.PAGE_SIZE);

        //他们之间默认是 or 的关系, name 包含 xxx or address 包含 xxx , 另注意multiMatchQuery()和matchQuery()两个方法中的参数位置是互反的
        QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("jack", "name", "address");
        sourceBuilder.query(queryBuilder);//传入QueryBuilder
        System.out.println("实际请求elastic search的json报文" + sourceBuilder.toString());
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//bbb
        searchResponse.getHits().forEach(hit -> {
            System.out.println(hit.getSourceAsString());
            Person person = JSONObject.parseObject(hit.getSourceAsString(), Person.class);
            personList.add(person);
        });
        System.out.println(personList);
        return personList;
    }

 

以上代码位于https://gitee.com/KingBoBo/springboot-04-elastic-search.git

 

笔记1 : QueryBuilders.multiMatchQuery ------- 相对于matchQuery,multiMatchQuery针对的是多个field,也就是说,当multiMatchQuery中,fieldNames参数只有一个时,其作用与matchQuery相当;

而当fieldNames有多个参数时,如field1和field2,那查询的结果中,要么field1中包含text,要么field2中包含text (field1包含text OR field2 包含 text)。(本句话引用自: 分布式搜索Elasticsearch——QueryBuilders.multiMatchQuery==>https://blog.csdn.net/geloin/article/details/8934951 )

    public static MultiMatchQueryBuilder multiMatchQuery(Object text, String... fieldNames) {
        return new MultiMatchQueryBuilder(text, fieldNames); // BOOLEAN is the default
    }

 

笔记2: boolQueryBuilder.should(qb1).must(qb2);//如果直接使用should().must()组合,那么should()会无效化 , 因为就算把should(qb1)前置 , 有时候还是会被must抢先,

当然这并非主要原因 , 根据json报文实测发现 , 只要must和shoud同级别共存, should就会失效, 其它文章也有提及: elasticsearch6.6版本 es填坑之路 解决:QueryBuilder同时使用should must时,会影响should的筛选结果!==>https://blog.csdn.net/q18810146167/article/details/89404901

以下为实际RESTFUL发送的报文:

{
    "query": {
        "bool": {
            "must": [{
                "wildcard": {
                    "name": {
                        "wildcard": "rose",
                        "boost": 1.0
                    }
                }
            }],
            "should": [{
                "wildcard": {
                    "name": {
                        "wildcard": "jack",
                        "boost": 1.0
                    }
                }
            }],
            "adjust_pure_negative": true,
            "boost": 1.0
        }
    }
}

 

rivate IndexRequest upsertRequest:使用该 字段进行更新操作,如果原索引不存在,则更新,类似于saveOrUpdate操作,该操作需要与脚步执行,详细将在后续章节中描述.  该小段引用自 Elasticsearch Document Update API详解、原理与示例==>https://www.jianshu.com/p/8be5dcf450da

 

 

BoolQueryBuilder联合查询

//模糊查询  
WildcardQueryBuilder queryBuilder1 = QueryBuilders.wildcardQuery("name", "*jack*");//搜索名字中含有jack的文档  
WildcardQueryBuilder queryBuilder2 = QueryBuilders.wildcardQuery("name", "*rose*");//搜索名字中含有rose的文档  
  
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();  
//name中必须含有jack,name中必须含有rose,相当于and  
boolQueryBuilder.must(queryBuilder1);  
boolQueryBuilder.must(queryBuilder2);

 

//模糊查询  
WildcardQueryBuilder queryBuilder1 = QueryBuilders.wildcardQuery("name", "*jack*");//搜索名字中含有jack的文档  
WildcardQueryBuilder queryBuilder2 = QueryBuilders.wildcardQuery("name", "*rose*");//搜索名字中含有rose的文档  
  
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();  
//name中必须含有jack,name中必须含有rose,相当于and  
boolQueryBuilder.should(queryBuilder1);  
boolQueryBuilder.should(queryBuilder2);

Elasticsearch——QueryBuilder简单查询==>https://www.cnblogs.com/sbj-dawn/p/8891419.html

 

 

强制elasticSearch指定目录的jdk (未亲测)

即修改elasticsearch的启动脚本(elasticsearch_HOME/bin/elasticsearch)

[root@master01 elasticsearch-6.0.0]# vim bin/elasticsearch
# 添加以下代码
export JAVA_HOME=/home/elsearch/jdk1.8.0_121/      (此处配置的为刚下的1.8的配置目录)
export PATH=$JAVA_HOME/bin:$PATH
 
if [ -x "$JAVA_HOME/bin/java" ]; then
        JAVA="/home/elsearch/jdk1.8.0_121/bin/java"
else
        JAVA=`which java`
fi

 

 

 

elk使用like查询

使用wildcard进行查询

dsl语法

{
  "query": {
    "wildcard": {
      "intf": "*measure*"
    }
  }
}

java 客户端语法

wildcardQuery("description", "*"+searchStr.toLowerCase()+"*")

需要注意的是wildcard不识别大写,需要将查询的词转为小写。

 

插件安装

 安装插件时也不能以root身份安装, 不然涉及权限问题,以下为安装图型化界面elasticsearch-sql命令

[root]#su es
[es]$ ./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/7.1.1.0/elasticsearch-sql-7.1.1.0.zip 

 es6.3+开始 , 在elasticsearch/bin目录下调用./elasticsearch-sql-cli 进入命令行 (https://www.jianshu.com/p/66ba200520ed)

默认情况下elasticsearch-sql-cli会尝试连接localhost:9200, 如果你修改了ES的端口,需要指定新的ES访问地址,比如 你的ES端口设置成 8888, 那么需要输入下列命令来打开
./elasticsearch-sql-cli http://localhost:8888

如果生产环境无法连接外网, 需要在windows上下载好zip文件后, 上传到生产服务器, 再在命令中的install后追加file:以执行安装

./bin/elasticsearch-plugin install file:/opt/elasticsearch-7.1.1.0/elasticsearch-sql-7.1.1.0.zip

 

客户端工具

ElasticHD windows桌面客户端

 

 

 

chrome插件 ElasticSearch Head

官方的模拟工具是控制台的curl,不是很直观,可以在chrome浏览器中安装head插件来作为请求的工具:head插件的地址:https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm/

 

Dejavu (使用中)

 

 

版本问题

随着 7.0 版本的即将发布,type 的移除也是越来越近了,在 6.0 的时候,已经默认只能支持一个索引一个 type 了,7.0 版本新增了一个参数 include_type_name ,即让所有的 API 是 type 相关的,这个参数在 7.0 默认是 true,不过在 8.0 的时候,会默认改成 false,也就是不包含 type 信息了,这个是 type 用于移除的一个开关。

让我们看看最新的使用姿势吧,当 include_type_name 参数设置成 false 后:

  • 索引操作:PUT {index}/{type}/{id}需要修改成PUT {index}/_doc/{id}
  • Mapping 操作:PUT {index}/{type}/_mapping 则变成 PUT {index}/_mapping
  • 所有增删改查搜索操作返回结果里面的关键字 _type 都将被移除
  • 父子关系使用 join 字段来构建

 

RESTFUL请求

$$$$$ElasticSearch入门3: 高级查询==>https://www.cnblogs.com/liuxiaoming123/p/8124969.html

#创建索引
PUT twitter
{
  "mappings": {
    "_doc": {
      "properties": {
        "type": { "type": "keyword" }, 
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" },
        "content": { "type": "text" },
        "tweeted_at": { "type": "date" }
      }
    }
  }
}

#修改索引
PUT twitter/_doc/user-kimchy
{
  "type": "user", 
  "name": "Shay Banon",
  "user_name": "kimchy",
  "email": "shay@kimchy.com"
}

#搜索
GET twitter/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "user_name": "kimchy"
        }
      },
      "filter": {
        "match": {
          "type": "tweet" 
        }
      }
    }
  }
}

#重建索引
POST _reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}

本小节引用自: Elasticsearch 移除 type 之后的新姿势==>https://elasticsearch.cn/article/601

 

异常

elasticsearch exception

 es无法启动,配置内存大小(好像无用)

修改 /data/elasticsearch/bin/elasticsearch     export ES_HEAP_SIZE=512m

 

 

blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];]

2021-12-28 01:26:32.450 [ERROR] [I/O dispatcher 1] [] c.r.i.e.r.impl.ElasticsearchBaseRepositoryImpl - Operator es index fail , 
org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];]
    at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:177)
    at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:1706)

curl -X PUT "10.16.55.142:9200/com.rosellete.iescp.rbac/_settings?pretty" -H 'Content-Type: application/json' -d'
{
  "index.blocks.read_only_allow_delete": null
}'

 

需要关注的问题点

为什么我的数据查不到,明明有的啊!

这几条数据怎么会出现在搜索结果前几位?

生产环境需要多少台机器,索引的分片数怎样设置才合理?

应该关注哪些指标,才能保证集群健康高效地运行?

对于日志型应用,如何设置 Hot & Warm Architecture 节约成本,怎样管理和优化基于时间序列的索引数据,才能提高集群的整体性能?

为什么我的集群脑裂了?数据损坏后,怎样才能恢复?

 

 

 

The Java High Level REST Client

使用Java High Level REST Client操作elasticsearch==>https://www.cnblogs.com/ginb/p/8716485.html

Elasticsearch技术解析与实战(四)shard&replica机制==>https://www.cnblogs.com/cnki/p/7497222.html

 

参考

SpringBoot整合ElasticSearch实现多版本的兼容==>https://www.cnblogs.com/xuwujing/p/8998168.html

elasticsearch安装之各种坑==>https://www.cnblogs.com/gudulijia/p/6761231.html

ElasticSearchRepository和ElasticSearchTemplate的使用==>https://blog.csdn.net/trusause/article/details/79583873

 

 

RestHighLevelClient

springboot使用RestHighLevelClient7简单操作ElasticSearch7增删查改/索引创建==>https://www.cnblogs.com/java-spring/p/11721615.html

$$$Elasticsearch Java API的基本使用==>https://www.jianshu.com/p/5cb91ed22956

$$$$$Elasticsearch笔记(八):客户端连接==>https://blog.csdn.net/alex_xfboy/article/details/85332370

 

 

springboot 日志整合

ELK+slf4j+springboot日志可视化查询==>https://uzshare.com/view/840104#1__docker_elasticsearch_15

 

查询知识点

es---elasticsearch7.1.1 QueryBuilders简单查询==>https://blog.csdn.net/VIP_1205169154/article/details/100539811

[Elasticsearch] 多字段搜索 (三) - multi_match查询和多数字段==>https://blog.csdn.net/dm_vincent/article/details/41842691

【转载】Elasticsearch--java操作之QueryBuilders构建搜索Query==>https://www.cnblogs.com/wbl001/p/11645044.html

使用Java High Level REST Client操作elasticsearch==>https://www.cnblogs.com/ginb/p/8716485.html

 

分词

ES 自带了很多默认的分词器,比如Standard、Keyword、Whitespace等等,默认是Standard

ElasticSearch入门 第七篇:分词==>https://www.cnblogs.com/ljhdo/p/5012510.html

掌握 analyze API,一举搞定 Elasticsearch 分词难题==>https://baijiahao.baidu.com/s?id=1609869808965712860&wfr=spider&for=pc

 

嘉媛参考文档

ElasticSearch 7.1.1 集群环境搭建==>https://www.cnblogs.com/remainsu/p/elasticsearch-711-ji-qun-huan-jing-da-jian.html

 

 

自己转载的备份

ElasticSearch 7.1.1 集群环境搭建【转】==>https://www.cnblogs.com/whatlonelytear/p/11623882.html

Elasticsearch入门,这一篇就够了【纯转】==>https://www.cnblogs.com/whatlonelytear/p/11811827.html

 

高级进阶

Elasticsearch Pipeline 详解==>https://blog.csdn.net/chunqiqian1285/article/details/100977188

ElasticSearch11:_version和external version进行乐观锁并发控制==>https://blog.csdn.net/m0_37557582/article/details/78922713 (默认自带INTERNAL内部版本锁, 也可以使用EXTERNAL外部版本锁)

Removal of mapping types映射类型mapping==>https://www.cnblogs.com/Neeo/articles/10393961.html#important

Elasticsearch Query DSL 整理总结(四)—— Multi Match Query==>https://www.cnblogs.com/reycg-blog/p/10055039.html

 

Elasticsearch 百亿级数据检索案例与原理==》https://blog.csdn.net/weixin_38405253/article/details/103650421

基于 GrayLog & ELK 的日志监控[转]==>https://www.cnblogs.com/whatlonelytear/p/15765110.html

优化

【ElasticSearch系列(三)】性能优化之==》https://blog.csdn.net/zhanyu1/article/details/88927194

我的项目git地址

https://gitee.com/KingBoBo/springboot-04-elastic-search

 

其它

可以试下 easy-es  ,你mybatis-plus那样操作es

Elasticsearch亿万级别查询==>https://blog.csdn.net/weixin_43765973/article/details/107330918

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表