elasticsearch--知识点

 

中文社区

https://elasticsearch.cn/

spring data es

Spring Data Elasticsearch 官方文档

 

一、elasticsearch

Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

基于lucene

lucene基于倒序索引

1、倒排索引

 进行分词处理,记录该词的出现次数,出现位置,根据词定位到文档,根据文档信息检索内容

2、正排索引

传统方式,从前往后一个一个进行匹配

document:文档 对象

属性     size 、path、content、time

 

二、集群

每个节点分别存放倒排索引,document

 

主、从

主:增删改,从分担主的查询,主、从不能放到一台机器

 

三、安装

值允许普通用户操作,不允许root用户

因为elasticsearch 有远程执行脚本的功能所以容易中木马病毒

 

es需要安装JDK,由java开发

 

tar -zxvf elasticsearch-6.6.0.tar.gz

 

es比较耗内存,默认占用1G内存

进入es  conf目录

1、修改内存大小

jvm.options

 

-Xms512m
-Xmx512m

 

2、修改配置文件

进入el目录中,进入conf目录,修改配置文件

elasticsearch.yml

 

node.name: node-1

cluster.initial_master_nodes: ["node-1"]

network.host: 0.0.0.0

http.port: 9200

 

说明

#配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
cluster.name: my-es
#节点名称
node.name: node-1
#设置索引数据的存储路径
path.data: /usr/local/elasticsearch/data
#设置日志的存储路径
path.logs: /usr/local/elasticsearch/logs
#设置当前的ip地址,通过指定相同网段的其他节点会加入该集群中
network.host: 0.0.0.0
#设置对外服务的http端口
http.port: 9200
#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
discovery.zen.ping.unicast.hosts: ["127.0.0.1","10.10.10.34:9200"]

9300内部端口号

 

3、创建用户

因为安全问题elasticsearch 不让用root用户直接运行,所以要创建新用户。

具体操作如下:
  useradd testuser
  passwd testuser
再输入两次密码(自定义)
  为用户赋权限

  chown -R testuser:testuser /usr/local/elasticsearch

      chown -R elk:elk /opt/soft/elasticsearch-6.6.0

 

 

 

修改配置文件

vim /etc/sysctl.conf  添加(限制一个进程可以拥有的虚拟内存的数量)

vm.max_map_count=655360

保存后执行(配置生效)

sysctl -p    

 

 

vim /etc/security/limits.conf     添加以下字段(因为允许外网访问,必须的系统调优)

* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096

修改后需要重启

vim /etc/security/limits.d/90-nproc.conf    修改 ( 解决线程不够的异常 )

* soft nproc 1024   把 1024 改成 4096

 

启动es命令:bin/elasticsearch

 systemctl status firewalld

http://192.168.136.110:9200/

 

然后使用es用户启动  :su testuser

启动es命令:bin/elasticsearch

  cd  /usr/local/elasticsearch

/opt/soft/elasticsearch-6.6.0/bin/elasticsearch

之后切换回到 我们自己的账户下,启动es: ./elasticsearch 或者加上 -d, 已守护线程方式启动,

查看进程是否启动: ps -ef|grep elasticsearch

关闭es和关闭他的线程方式一样: kill -9 '进程号'

 http://192.168.1.136:9200/

四、kibana 安装

修改配置文件

server.port: 5601

server.host: "http://192.168.233.100:5601"

elasticsearch.hosts: ["http://http://192.168.233.100:5601:9200"]

切换到bin 目录

./kibana --allow-root

http://192.168.116.141:5601

 

{
          "query": {
            "match": {
              "infoall": {
                "query": "如果有理数 a、b 满足 | a b - 2 | + \\left( 1 - b \\right) ^ { 2 } = 0 , ,试求- \\frac { 1 } { a b } + \\frac { 1 } { \\left( a + 1 \\right) \\left( b + 1 \\right) } + \\frac { 1 } { \\left( a + 2 \right) \\left( b + 2 \right) } + \\cdots \frac { 1 } { \\left( a + 2 0 1 7 \\right) \\left( b + 2 0 1 7 \\right) } 的值. ",
                "fuzzy_transpositions":false,
                "minimum_should_match":"75%"
              }
            }
          }
        }

 

 

 

1、创建索引

put /myindex

获取索引

get /myindex

创建文档   必须有ID

/索引/类型/id

put /myindex/user/1

{

   "name":"张三",

    "age":20,

    "sex":0

}

delete /myindex

id不可以重复

会自动生成ID

post /myindex/user/

{

   "name":"张三",

    "age":20,

    "sex":0

}

 

查询所有

get /myindex/user/_search

查询指定ID

get /myindex/user/_search

{

"ids":["1","2"]

}

查询指定条件

get /myindex/user/_search?q=age:21

复杂条件查询

get /myindex/user/_search?q=age[30 TO 60]

排序

get /myindex/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=2

 

Dsl语言查询

post已json格式发送进行查询

term精确匹配,不会分词

GET /myindex/user/_search

{

  "query":{

       "term":{

         "name":"aaa"

        }

    }

}

match

分词查询

{

  "query":{

      "from":0,

      "size":2,

       "match":{

         "name":"aaa"

        }

    }

}

查询文档映射类型

GET /myindex/_mapping

 

在postman中传json查看分词效果

http://192.168.136.110:9200/_analyze

 

{

"analyzer":"standard",

"text":"中华人民共和国"

}

 

DSL语言查询,用的比较多

 

 

五、es版本控制

cas 乐观锁

悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据准确性的操作

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性

 

9200:暴露 es   restful接口端口号, 通过restful可进行增删改查

9300:tcp协议端口号,ES集群之间通讯端口号

 

六、中文分词器 es-ik插件   ,版本要和es版本一致

es中默认的分词器对中文拆词不是很好,会拆成一个一个的字

 

https://github.com/medcl/elasticsearch-analysis-ik

 

下载对应版本的zip解压后放到es的pluge中

plugins/analysis-ik

unzip -d /analysis-ik elasticsearch-analysis-ik-6.6.0.zip

 

创建自己的dic  把路径配置到IKAnalyzer.cfg.xml

测试:

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_analyze?pretty' -d '{
"analyzer" : "ik_max_word",
"text": "中华人民共和国国歌"
}'

 

七、文档映射

1、动态映射(默认)

数值默认long

String分为text和keyword

text 会分词

keyword 不会分词

2、静态映射

之前如果该索引已经指定类型

不可以再post  修改,要删除后再操作

 

post /myindex/_mapping/user

{

  "user":{

         "properties":{

                "age":{

                      "type":"integer"

                 },

                "name":{

                      "type":"text",

                     "analyzer":"ik_smart"       //指定分词器es-ik

                 },

                 "sex":{

                      "type":"keyword"

                  }

          }

   }

}

 

八、集群   分片,集群后访问那个几点都能得到数据

将单台服务器节点的索引文件使用分片进行拆分,分布式存在多个不同的物理机(节点)进行存放

1、主分片(primary)   默认5个分片,定义好数量就不能更改

为什么??

2、副分片(replicas 备份分片)  副分片可以改

分片定义好就不能更改

主分片对应的副分片不能放在一台机器

单台服务器没有备用分片

分片是均摊存放到各个节点

 

主分片实时同步信息到备份分片

 

 

 

 

 

如果两台挂了会丢失 p2分片

主分片对应的备用分片不能1个 要对应多个   才能做到都都挂了,只剩一个的时候能够存在完整的索引

分片最好是节点的平方

分片位置  =文档 ID%主分片数量

 

 

查询索引信息

http://192.168.136.110:9200/myindex/_settings

 

3、集群

名称要相同

配置节点名称

cluster.name: my-application

node.name: node-1

node.name: node-2

node.name: node-3

 

验证集群

http://192.168.136.110:9200_cat/nodes?pretty

 

集群要把data下的nodes数据清除,否则同步不了

 

posted @ 2020-02-21 16:56  jentary  阅读(280)  评论(0编辑  收藏  举报