关于使用docker容器按照elasticsearch

    科技2023-10-05  101

    一、Docket安装Elasticsearch

    1、下载镜像文件

    安装命令用途docker pull elasticsearch:7.9.2存储和检索数据docker pull kibana:7.9.2可视化检索数据

    注意:elasticsearch的版本必须和kibana的版本是相同的。

    2、创建实例

    2.1、ElasticSearch

    安装命令作用mkdir -p /mydata/elasticsearch/config创建一个配置文件夹mkdir -p /mydata/elasticsearch/data创建一个存放检索数据的文件夹(好比安装mysql的时候需要在mysql中创建一个data文件夹)echo “http.host:0.0.0.0”>>/mydata/elasticsearch/config/elasticsearch.yml docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -e ES_JAVA_OPTS="-Xms64m -Xmx128m" \ -v /mydata/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \ -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ -d elasticsearch:7.9.2 以后在外面安装插件重启即可。 #启动elasticsearch并且将端口号映射到主机上,9300是es在分布式集群环境下的通信端口。“discovery.type=single-node”表示es是以单节点模式运行。“ES_JAVA OPTS=“-Xms64m -Xmx128m””是由于ES已启动将会占用整个内存,这样Liunx就会卡死,将ES的占用内存设置为最小64m,最大126m。

    特别注意:

    -e ES_JAVA_OPTS=“-Xms64m -Xmx128m” \ 测试环境下,设置ES的初始内存和最大内存,否则导致过大启动不了ES;

    2.2、检测ES启动错误的方法

    由于我们使用的是docker容器,所以使用 docker logs elasticsearch这个命令打印出elasticsearch的日志消息。

    使用 chmod -R 777 /mydata/elasticsearch/ 改变config、data、plugins文件夹的权限。

    2.3、向ElasticSearch发送请求

    localhost:9200/_cat/nodes:查看ES下的全部节点

    查询到的结果: 127.0.0.1 28 84 11 dilmrt * WIN-NQTK0V7R9FC*”:在集群的环境下代表着主节点。

    3、安装Kinbana

    docker run --name kibana -e ELASTICSEARCH_HOST=http://***.***.**.**:9200 -p 5601:5601 \ -d kibana:7.9.2

    4、初步检索

    4.1、_cat

    GET /_cat/nodes:查看所有节点。GET /_cat/health:查看es的健康状态。GET /_cat/master:查看主节点。GTE :查看所有索引 show database;

    4.2、索引一个文档(相当于MySQL的保存一条记录)

    保存一个数据,保存在哪个索引的那个类型下,指定用哪个唯一标识。

    PUT customer/external/1;在customer 索引下的external 类型下保存 1号数据为:

    PUT customer/external/1 { "name":"张三" } PUTPOST请求都可以。 POST 新增。如果不指定id,会自动生成id。指定id就会修改这个id的数据,并增加版本号。 PUT 可以新增可以修改。PUT必须指定id;由于PUT需要指定id,我们一般都用来做修改操作,不指定id会报错。

    4.3、查询文档

    查询文档是发送GET请求的 :

    customer/external/1 结果: { "_index": "customer", //在哪个索引 (相当于MySQL中的 在哪个数据库中) "_type": "external", //在哪个类型 (相当于MySQL中的在哪个表中) "_id": "1", //记录id "_version": 2, //版本号 "_seq_no": 1, //并发控制字段,每一更新就会+1,用来做乐观锁 "_primary_term": 1, //同上,主分片重新分配,如重启,就会变化 "found": true, "_source": { "name": "张三" } } 更新携带: ?if_esq_no = 0&if_primary_term=1

    4.4、更新文档

    POST customer/external/1/_update { "doc":{ "name":"占山" } } 或者 POST customer/extrnal/1 { "name":"张三" } 或者 PUT customer/extrnal/1 { "name":"John Doe" } 不同: post操作会对比源文档数据,如果相同不会有操作,文档的version也不会增加。PUT操作总会将数据重新保存并增加version版本。 带 "_update"会对比源数据如果一样就不进行任何操作。 使用场景: 对于大并发更新,不带update; 对于大并发查询偶尔更新,带update;对比更新,重新计算分配规则。

    更行同时增加属性

    POST customer/external/1/_update { "doc":{"name":"Jane Doe","age":"20"} }

    4.5、删除文档&索引

    DELETE customer/external/1 DELETE customer

    4.6、bulk批量API

    POST customer/external/_bulk {"index":{"_id":"1"}} {"name":"Jon Doe"} {"index":{"_id":"2"}} {"name":"Jane Doe"} 语法格式: {action:{metadata}} \n #新增 {request body } \n #数据体内容 复制实例: POST /_bulk {"delete":{"_index":"website","_type":"blog","_id":"123"}} {"create":{"_index":"website","_type":"blog","_id":"123"}} {"title": "My first blog post"} {"index":{"_index":"website","_type":"blog"}} {"update":{"_index":"website","_type":"blog","_id":"123"}} {"doc":{"title":"My first blog post"}}

    bulk API 以此按顺序执行所有的action(动作),如果一个单个的动作因任何原因失败,他将继续处理后面剩余的动作。当 bulk API 返回时,它将提供每一个动作的状态(与发送的顺序相同)。

    4.7、样本测试数据

    准备了一份顾客银行账户的信息虚构的JSON文档样本,每个文档都有下列的 schema(模式):

    { "action_number":0, "balance":16623, "firstname":"Bradshwaw", "lastname":"Mckenzie", "age":29, "gender":"F", "addres":"244 Columbus Place", "employer":"Euron", "email":"bradshawmckenzie@euron.com", "city":"Hohucken", "state":"CO" }

    https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json

    POST /bank/account/_bulk

    测试数据

    5、进阶检索

    5.1、SearchAPI

    ES支持两种基本方式检索:

    一个是通过使用 REST request URI 发送搜索参数(url+检索参数).另一个是通过使用 REST requset body来发送请求(url + 请求体 )

    5.1.1、检索信息

    一切检索从_search开始

    GET bank/_search //检索bank下所有的信息,包括type和docs。 GET bank/_search?q=*&sort=account_number:asc //请求参数方式检索 响应的结果解释: took-Elasticsearch:执行搜索的时间(毫秒); time_out:告诉我们搜索是否超时; _shards:告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分析; hits:搜索结果; hits.total:搜索结果; hits.hits:实际的搜索结果数组(默认前10的文档); sort:结果的排序Key()(没有按照score排序); score 和 max_scoure:相关性得分和最高得分(全文检索用)

    uri+请求体进行检索

    GET bank/_search { "query":{ //匹配规则 "match_all":{} }, "sort":[ //排序规则 { "account_number":{ "order":"desc" } } ], "from":10, "size":10 }

    5.2、Query DSL

    5.2.1、基本语法格式

    ElasticSearch提供了一个可有执行查询的Json风格的DSL(domain-specific language 领域特定语言)。这个被称之为Query DSL。该查询语言非常的全面,并且刚开始的时候感觉有点复杂,真正学好它的方法是从一些基础的示例开始的。

    一个查询语句 的典型结构

    { QUERY_NAME:{ ARGUMENT:VALUE, ARGUMENT:VALUE,.... } }

    如果是针对某个字段,那么它的结构如下:

    { QUERY_NAME:{ FIELD_NAME:{ ARGUMENT:VALUE, ARGUMENT:VALUE,.... } } } 1、query:定义如何查询; 2、match_all:查询类型[代表查询所有的所有],es中可以在query中组合非常多的查询类型完成复杂查询; 3、除了query参数之外,我们可以传递其他的参数以改变查询结果。如sort、size。 4from+size限定,完成分页功能。 5、sort排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准。

    5.2.2、返回部分字段

    GET /bank/_search { "query":{ "match_all": {} }, "sort": [ { "balance": { "order": "desc" } } ], "from": 0, "size": 20, "_source": ["lastname","age"] //返回指定的字段 }

    5.2.3、match[匹配查询]

    基本类型(非字符串),精确匹配

    GET /bank/_search { "query": { "match": { //按照account_number等于10进行查询 "account_number": 10 } } }

    字符串,全文检索

    GET /bank/_search { "query": { "match": { //匹配 state字段包含的CO值 "state": "CO" } } } //全文检索按照评分进行排序,会对检索条件进行分词匹配。

    5.2.4、match_phrase[短语匹配]

    将需要匹配的值当成一个整体单词(不分词)进行检索

    #match_phrase【短语匹配】 GET /bank/_search { "query":{ "match_phrase": { "address": "Holmes Lane" } } } //查出的address中包含 holmes lane 的所有记录,并给出相关的得分

    5.2.5、multi_match【多字段匹配】

    #multi_match【多字段匹配】 GET /bank/_search { "query": { "multi_match": { "query": "lane", "fields": ["address","lastname"] } } } //查询的字段,按照"lane"进行查询,支持分词查询

    5.2.6、bool【复合查询】

    bool用来做复合查询:

    复合语句可以合并 任何 其他查询语句,包括复合语句,了解这点很重要。这意味着复合语句之间可以相互嵌套,可以表达非常复杂的逻辑。

    must: 必须达到must列举的所有条件

    #bool 复合查询 GET /bank/_search { "query": { "bool": { "must": [ {"match": {"address": "lane"}}, {"match": { "employer": "Pyrami" }} ], "must_not": [ {"match": { "age": "12" }} ], "should": [ {"match": { "lastname": "Wallace" }} ] } } } must:必须满足的条件; must_not:必须要不等于或者不满足; should:可以满足或者可以不满足;

    5.2.7、term[非文本检索]

    和 match 一样,匹配某个属性的值。全文检索字段用match,其他非text字段匹配用term。

    #查询非文本字段的 GET /bank/_search { "query": { "term": { "balance": 28838 } } } //非文本字段的检索

    5.2.8、aggregations(执行聚合)

    聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL GROUP BY和 SQL聚合函数。在Elasticsearch中,有执行搜索返回hits(命中结果),并且同时返回聚合结果,把一个响应中的所有的hits(命中结果)分隔开的能力。这是非常强大且有效的,可以执行查询和多个聚合,并且再一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API来避免网络往返。

    搜索 address中包含 mill 的所有人的年龄分布以及平均年龄,但不显示这些人的详情。

    #检索出adders字段中带有mill的记录并且年龄分布以及平均年龄 GET /bank/_search { "query": { "match": { "address": "mill" } }, "aggs": { "ageAgg": { //聚合组名 "terms": { "field": "age", "size": 10 } } , "avg_age":{ "avg":{ "field": "account_number" } }, "balanceAge":{ "avg": { "field": "balance" } } } }

    6、Mapping映射

    6.1、字段类型

    常见的类型有

    binary; boolean; Keywords; Numbers;

    日期时间类型

    Dates:包括日期和时间

    对象和关系类型

    object:JSON对象; flattend:整个Json对象作为单个字段值; nested:保留其子字段之间关系的Json对象; join:为同一索引中的文档定义父/子关系;

    结构化数据类型

    Range:范围类型,例如long_range、double_range、date_range和ip_range; ip:IPv4和IPv6地址; murmur3:计算并存储值的散列

    汇总数据类型

    histogram:预汇总的数值

    文本搜寻类型

    text:分析的非结构化文本; annotated-text:包含特殊标记的文本。用于标识命名实体; completion:用于自动完成建议; search_as_you_type:text类似类型,用于按需输入完成; token_count:文本中的令牌计数

    文件等级类型

    dense_vector 记录浮点值的密集向量。 rank_feature 记录数字功能以提高查询时的点击率。 rank_features 记录数字功能以提高查询时的点击率。

    空间数据类型

    geo_point 纬度和经度点。 geo_shape 复杂的形状,例如多边形。 point 任意笛卡尔点。 shape 任意笛卡尔几何。

    其他种类

    percolator 索引以查询DSL编写的查询。

    数组

    在Elasticsearch中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值都必须具有相同的字段类型。请参阅数组。

    多领域

    为不同的目的以不同的方式对同一字段建立索引通常很有用。例如,一个string字段可以映射为text用于全文搜索的字段,也可以映射为keyword用于排序或聚合的字段。或者,您可以使用standard分析仪, english分析仪和 french分析仪索引文本字段。

    6.2、映射

    Mapping(映射)

    Mapping是用来定义一个文档(document),以及它所包含的属性(field)是如何存储的和索引的。比如:使用Mapping来定义。

    哪些字符串属性应该被看做全文本属性(full text fields)。

    哪些属性包含数字,日期或者地理位置。

    文档中的所有属性是否都能被索引。

    日期的格式。

    自定义映射规则来执行动态添加属性。

    查看mapping信息

    #查看映射的信息 GET /bank/_mapping

    修改mapping信息

    6.2.1、创建映射

    //创建索引并指定映射 PUT /my-index { "mappings":{ "propeties":{ "age":{"type":"integer"}, "email":{"type":"keyword"}, "name":{"type":"text"} } } }

    6.2. 2、添加新的字段映射

    PUT /my-index/_mapping { "properties":{ "employee-id":{ "type":"keyword", "index":false } } }

    6.2.3、更新映射

    对于已经存在的映射字段,不能更新。更新必须创建新的索引进行数据迁移。

    6.2.4、数据迁移

    先创建出 new_twitter的正确映射。然后使用如下方式进行数据迁移。

    POST reindex [固定写法] { "source":{ "index":"bank" }, "dest":{ "index":"new_bank" } }

    6.0版之前的迁移方式,需要考虑数据的类型

    将旧索引的type下的数据进行迁移 POST _reindex { "source":{ "index":"bank", "type":"bank" }, "dest":{ //目标索引 "index":"new_bank" } }

    7、分词

    一个**tokenizer(分词器)**接收一个字符流,将之分割为独立的tokens(词元,通常是独立的单词),然后输出tokens流。

    例如:whitespace tokenizer 遇到空包字符时分割文本。它会将文本“Quick brown fox”分割为“[Quick 、 brown、fox]”。

    该tokenizer(分词器)还负责记录各个term的属性或position的位置,以及term(词条)所代表的原始word(单词)的start(起始)和end(结束)的character offsets(字符偏移量)。

    7.1、按照ik 分词器

    7.3、自定义分词器

    修改 es文件下的plugins/ik/config文件中的IKAnalyzer.config.xml文件

    8、ElasticSearch-Rest-Client

    8.1、9300:TCP(ES 集群节点通信都是使用该端口号)

    spring-data-elasticsearch:transport-api.jar; SpringBoot版本不同,transport-api.jar不同,不能适配es版本;7.x已经不建议使用,8版本之后就放弃不用;

    8.2、9200:HTTP

    JestClient:非官方,更新慢;RestTemplate:模拟法HTTP请求,ES很多操作需要自己封装;HTTPClient:同上;Elasticsearch-Rest-Client:官方 RestClient,封装了es的操作,API层次分明,上手简单。

    9、SpringBoot整合Elasticsearch

    9.1、创建一个search服务并且导入Elasticsearch-Rest-Client的高阶客户端依赖

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W3BovN4Y-1601993002370)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817287328.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ohp3sZJT-1601993002375)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817274400.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jROMHsox-1601993002377)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817731683.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OKGGh7LW-1601993002381)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817561958.png)]

    由于es的使用版本必须对应,所以需要将SpringBoot整合es的版本改为使用的版本

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCHaGoEO-1601993002384)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601817677444.png)]

    修改版本统一[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mi8b83us-1601993002386)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601857073184.png)]

    9.2、编写Elasticsearch的配置类

    用来操作9200端口

    @Configuration public class ElasticSearchConfig { public static final RequestOptions COMMON_OPTIONS; /** * 将RequestOptions设置为单例模式,让所有的请求都来共享该实例 * 可以通过toBulider来设置请求头信息,可以带上自己的令牌 * 以及自定义响应的消费者 */ static { RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); COMMON_OPTIONS = builder.build(); } @Bean public RestHighLevelClient restHighLevelClient(){ RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"))); return client; } }

    10、附录:安装Nginx

    start nginx:开启Nginx服务。nginx.exe -s stop:关闭nginx服务,快速停止nginx,可能并不保存相关信息。nginx.exe -s quit:退出nginx服务,完整有序的停止nginx,并保存相关信息。nginx.exe -s reload 重载nginx服务,当你改变nginx配置信息并需要重新载入这些配置时可以使用此命令重载nginx。nginx -s reopen:重新打开日志文件命令。nginx -v nginx命令参数v与V的区别: nginx -v命令只是简单显示nginx的版本信息。nginx -V 不但显示nginx的版本信息,而且还显示nginx的配置参数信息。 nginx -c:此命令参数指定一个新的nginx配置文件来替换默认的nginx配置文件,如果你不确定新的nginx配置文件语法是否正确,你可以通过nginx命令-t参数来测试,-t参数代表不运行配置文件,而仅仅只是测试配置文件,即nginx -t -c </path/to/config>
    Processed: 0.014, SQL: 8