ES的基本操作。
一:安装ES
注意:ES基于JAVA语言研发。环境依赖JDK。
下载路径:https://www.elastic.co/cn/start
两个节点:做es集群
| 10.5.100.34 | node1 |
| 10.5.100.102 | node2 |
node1节点:
[root@node1 ~]# yum install java-1.8.0-openjdk.x86_64 -y [root@node1 ~]# vim /etc/profile.d/java.sh export JAVA_HOME=/usr [root@node1 ~]# java -version openjdk version "1.8.0_262" OpenJDK Runtime Environment (build 1.8.0_262-b10) OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode) [root@node1 ~]# [root@node1 ~]# yum install elasticsearch-7.9.0-x86_64.rpm -y 下载es的rpm包进行yum安装 [root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml 编辑es配置文件。添加两项 cluster.name: myes 定义的集群名称,默认是my-application node.name: node1.shuo.com[root@node1 ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.5.100.34 node1 node1.shuo.com [root@node1 ~]# systemctl restart elasticsearch [root@node1 ~]# ss -tnl 默认监听本机9200,9300 ES的默认端口; 1,参与集群的事务:9300/tcp transport.tcp.port 2,接受请求:9200/tcphttp.port State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 ::ffff:127.0.0.1:9200 :::* LISTEN 0 128 ::1:9200 :::* LISTEN 0 128 ::ffff:127.0.0.1:9300 :::* LISTEN 0 128 ::1:9300 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* [root@node1 ~]# [root@node1 ~]# systemctl stop firewalld 关闭防火墙设置Node2节点
[root@node2 ~]# yum install java-1.8.0-openjdk.x86_64 -y [root@node2 ~]# vim /etc/profile.d/java.sh export JAVA_HOME=/usr [root@node2 ~]# java -version openjdk version "1.8.0_262" OpenJDK Runtime Environment (build 1.8.0_262-b10) OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode) [root@node2 ~]# [root@node2 ~]# yum install elasticsearch-7.9.0-x86_64.rpm -y 下载es的rpm包进行yum安装 [root@node2 ~]# vim /etc/elasticsearch/elasticsearch.yml 编辑es配置文件。添加两项 cluster.name: myes 定义的集群名称,默认是my-application node.name: node2.shuo.com[root@node2 ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.5.100.34 node1 node1.shuo.com [root@node2 ~]# systemctl restart elasticsearch [root@node2 ~]# ss -tnl 默认监听本机9200,9300 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 ::ffff:127.0.0.1:9200 :::* LISTEN 0 128 ::1:9200 :::* LISTEN 0 128 ::ffff:127.0.0.1:9300 :::* LISTEN 0 128 ::1:9300 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* [root@node2 ~]# [root@node2 ~]# systemctl stop firewalld二:ES的基础操作。
[root@node1 ~]# curl -X GET 'http://localhost:9200/_cluster/health?pretty' 检查集群的健康状态。pretty以优美的格式显示 {"cluster_name" : "myes", 集群名称"status" : "green", 集群状态,green表示正常。"timed_out" : false,"number_of_nodes" : 1,"number_of_data_nodes" : 1,"active_primary_shards" : 0,"active_shards" : 0,"relocating_shards" : 0,"initializing_shards" : 0,"unassigned_shards" : 0,"delayed_unassigned_shards" : 0,"number_of_pending_tasks" : 0,"number_of_in_flight_fetch" : 0,"task_max_waiting_in_queue_millis" : 0,"active_shards_percent_as_number" : 100.0 } [root@node1 ~]# curl -X GET 'http://localhost:9200/_cluster/state/version?pretty' 查看集群的版本,及名称, {"cluster_name" : "myes","cluster_uuid" : "bGFEa9ZWTraeINTGo4VY3w","version" : 73,"state_uuid" : "GjC8P9gbRJe4erB3_LC0zg" } [root@node1 ~]# [root@node1 ~]# curl -X GET 'http://localhost:9200/_cluster/stats/?pretty' 查看集群的所有状态信息。 {"_nodes" : {"total" : 1,"successful" : 1,"failed" : 0},"cluster_name" : "myes","cluster_uuid" : "bGFEa9ZWTraeINTGo4VY3w","timestamp" : 1601224533923,"status" : "green","indices" : {"count" : 0,"shards" : { },"docs" : {"count" : 0,"deleted" : 0},[root@node1 ~]#curl -X GET 'http://localhost:9200/_nodes/stats/?pretty' 查看集群个节点的相关信息。三:ES的插件应用及CRUD。
(1)创建文档: [root@node1 ~]# curl -H "Content-Type: application/json" -X PUT 'localhost:9200/students/class1/1?pretty' -d ' students:表示索引,class1表示文档。 id:表示索引,文档类型。 -H:指明头部 -d:表示指明文档。 > { > "first_name": "jing", > "last_name": "Guo", > "gender": "Male", > "age": 25, > "courses": "xianglong shiba zhang" > }' {"_index" : "students","_type" : "class1","_id" : "1","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 0,"_primary_term" : 1 } [root@node1 ~]# (2)获取文档: [root@node2 ~]# curl -XGET 'localhost:9200/students/class1/1?pretty' {"_index" : "students","_type" : "class1","_id" : "1","_version" : 1,"_seq_no" : 0,"_primary_term" : 1,"found" : true,"_source" : {"first_name" : "jing","last_name" : "Guo","gender" : "Male","age" : 25,"courses" : "xianglong shiba zhang"} }(3)更新文档: [root@node1 ~]# curl -H "Content-Type: application/json" -XPOST 'localhost:9200/students/class1/1/_update?pretty' -d' { "doc" : {"age": 22 } }' {"_index" : "students","_type" : "class1","_id" : "1","_version" : 2,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 1,"_primary_term" : 1 } [root@node1 ~]# [root@node1 ~]# curl -XGET 'localhost:9200/students/class1/1?pretty' 查看年龄是否修改 {"_index" : "students","_type" : "class1","_id" : "1","_version" : 2,"_seq_no" : 1,"_primary_term" : 1,"found" : true,"_source" : {"first_name" : "jing","last_name" : "Guo","gender" : "Male","age" : 22,"courses" : "xianglong shiba zhang"} } [root@node1 ~]# [root@node1 ~]# curl -XDELETE 'localhost:9200/students/class1/1?pretty' 删除文档类型1 {"_index" : "students","_type" : "class1","_id" : "1","_version" : 3,"result" : "deleted","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 2,"_primary_term" : 1 } [root@node1 ~]# curl -XGET 'localhost:9200/students/class1/1?pretty' {"_index" : "students","_type" : "class1","_id" : "1","found" : false 这里得false表示没有找到该文档类型 } [root@node1 ~]# [root@node1 ~]# curl -XGET 'localhost:9200/_cat/indices?v' 查看索引的相关信息 health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open students EJQ-7K5YTgCJlEOwN-01gA 1 1 0 0 228b 228b [root@node1 ~]# [root@node2 ~]# curl -XDELETE 'localhost:9200/students?' 删除索引,文档随之也删除。 [root@node2 ~]# curl -XGET 'localhost:9200/_cat/indices?v' health status index uuid pri rep docs.count docs.deleted store.size pri.store.size四:ES的查询。
ES的查询阶段操作执行分为两个阶段;分散阶段:合并阶段: [root@node1 ~]# curl -X GET 'localhost:9200/students/_search?pretty' {"took" : 11, 查询所需时长"timed_out" : false, 查询是否超时"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : { "total" : { 命中的文档"value" : 0,"relation" : "eq"},"max_score" : null, 最大命中率"hits" : [ ] 这个hits是个数组,本应该包括命中的文档,现在为空,说明还没有命中。} } [root@node1 ~]# [root@node1 ~]# curl -H "Content-Type: application/json" -X GET 'localhost:9200/students/_search?pretty' -d' 另一种查询方式。如果要查询某个字段的 要在serarch后面指明查询条件。 > { > "query": { "match_all": {} } > }' {"took" : 292,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]} } 多索引,多类型查询; /_search:查询所有索引的所有文档、 /index_name/_search:单索引 /index1,index2/_search:多索引; /s* ,t*/_search: /students/class1/_search:单类型搜索 /students/class1,class2/_search:多类型搜索Mapping和AnalysisES:对每一个文档,会取得其所有域的所有值,生成一个名为all的域:执行查询时,如果在query_string未指定查询的域,则在_all域上执行查询操作。GET /_search?q='xianglong'GET /_search?q='xianglong%20shiba%20zhang' %都是精确匹配。GET /_search?q=courses: 'xianglong%20shiba%20zhang'GET /_search?q=courses: 'xianglong'前两个:表示在all域上搜索; 后两个:在指定的域上搜索:四:ES内置的分析器
ES中搜索的数据广义上可被理解为两类。 type:exact full-text:用于引用文本中数据,判断文档在多大程序上匹配查询请求,即评估文档与用户请求查询的相关度; 为了完成full-text搜索;es必须首先分析文本,并创建出倒排索引,倒排索引中的数据还需进行正规化为标准格式 分词,正规化,即分析分析需要由分析器进行:analyzer 分析器由三部分组件构成:字符过滤器,分词器,分词过滤器ES内置的分析器: standard analyzer: 标准分析器。 simple analyzer language analyzer分析器不仅在创建索引时用到;在构建查询时也会用到。request body: 分成两类: query dsl:执行full-text查询时,基于相关度来评判匹配结果;查询执行过程复杂,且不会被缓存。 filter dsl:执行exact查询时,基于其结果为 "yes" 或"no" 进行评判;速度快,且结果缓存。filter dsl实例: [root@node1 ~]# curl -H "Content-Type: application/json" -XGET 'localhost:9200/students/_search?pretty' -d' term表示单项查找。 {"query": {"term": {"age": 23 }} }' {"took" : 49,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "students","_type" : "class1","_id" : "3","_score" : 1.0,"_source" : {"first_name" : "Rong","last_name" : "huang","gender" : "female","age" : 23,"courses" : "luoying shenjian"}}]} }term filter:用于多值精确匹配; terms表示多项查找{ "terms": { "name" : ["guo", "rong"] }} [root@node2 ~]# curl -H "Content-Type: application/json" -X GET 'localhost:9200/students/_search?pretty' -d' {"query": {"terms": {"first_name": ["Rong","guo"]}} }' {"took" : 4,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]} } [root@node2 ~]# query dsl:match_all query:用于匹配所有文档,没有指定任何query,默认即为match_all query{ "match_all": {} } match query: 在几乎任何域上执行full-text或exact-value查询;如果执行full-text查询;首先对查询时的语句做分析;{ "match": {"students": "Guo" }}如果执行exact-value查询;搜索精确值;此时,建议使用过滤,而非查询multi_match query:用于在多个域上执行相同的查询;{ "multi_match":"query": full-text serach"field": {'field1', 'field2' }}{ "multi_match": 这表示多域进行查询,表示在name和描述字段查找guo"query": {"students": "guo"}"field":{"name","description"}} bool query:基于boolean逻辑合并多个查询语句;与boolfilter不同的是,查询字句不是返回yes 或 no 而是其计算出的匹配度分值,因此,query会为各子句合并其score查询语句语法检查: GET /index/_validate/query?explain&pretty {..... }总结
- 上一篇: 外盘国际期货:围观那些奇葩的国际节日?
- 下一篇: 计算机辅助药物设计manson,计算机辅