ES学习
Elasticsearch分布式全文检索引擎,它可以近乎实时的存储、检索数据。本身扩展性很好,可以扩展到上百台服务器
cluster(集群)
node(节点)
index(索引) 数据库
type(类型) 表
document(文档) 行
field(域) 列
Mapping(映射) 存储域field的相关映射信息,不同type会有不同的mapping。
shards&&Replicas(分片和副本) 数据可以分为较小的分片。每个分片放到不同的服务器上 为提高查询吞吐量或实现高可用性,可以使用分片副本 主分片(Primary shard) 副本分片(Replica shard)
安装
tar es
vi elasticsearch.yml
cluster.name: my-test 同一个集群必须一样
node.name: node-1 节点名称必不一样
node.master: true 可以成为master
node.data: true
network.host: 10.8.4.37 真实ip http.port: 9200 默认端口
discovery.seed_hosts 当您想要与其他主机上的节点组成群集时,你必须使用 discovery.seed_hosts 来提供群集中可以成为master
cluster.initial_master_nodes: ["node-1", "node-2"] 初始化选master
###sysctl -w vm.max_map_count=262144 es最小内存
vi /etc/security/limits.conf 加入
esuser hard nofile 65536
esuser soft nofile 65536
安装时一定要切换到普通用户(非root账号)!! 创建用户!!!1
groupadd esgroup
useradd esuser -g esgroup -p espassword
chown -R esuser:esgroup elasticsearch-6.3.2(赋予该目录下虽有的文件都可以操作执行的权限).
su esuser
./elasticsearch -d 后台启动,可在当前终端继续操作 8以上的版本需要1.9上启动 -Xms512m -Xmx512m
web页面查看
ElasticSearch Head.zip拖入到chrome扩展程序就可以使用了
###################### 使用head等插件监控集群信息,需要打开以下配置项 ###########
# http.cors.enabled: true
# http.cors.allow-origin: "*"
# http.cors.allow-credentials: true
linux安装jdk
wget http://download.oracle.com/otn-pub/java/jdk/9.0.1+11/jdk-9.0.1_linux-x64_bin.tar.gz file看类型 html文件所以解压不了
tar -zxvf ./jdk-9.0.1_linux-x64_bin.tar.gz -C /usr/local
vi /etc/profile
#set java environment
JAVA_HOME=/usr/local/jdk-9.0.1/jdk-9.0.1
JRE_HOME=/usr/local/jdk-9.0.1/jdk-9.0.1/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
source /etc/profile
增删改查
PUT test/doc/2 修改或新建
{
"name":"wangfei",
"age":27,
"desc":"热天还不让后人不认同"
}
GET test 查索引
GET test/doc/1 查文档信息
GET test/doc/_search 查询所有
DELETE test/doc/3 DELETE test 删除索引
POST test/doc/1/_update 修改
{
"doc":{
"desc":"生活就像 茫茫海上"
}
}
查询!!!!
GET test/doc/_search?q=name:wangfei
结构化查询 筛选
GET test/doc/_search
{
"query":{
"match":{
"name":"wang"
}
}
}
elasticsearch在内部对文档做分词的时候,对于中文来说,就是一个字一个字分的,所以,我们搜中国,中和国都符合条件
可以用match_phrase 或者针对中文的插件
match_phrase_prefix最左 match返回所有匹配的分词
multi_match
倒叙排序
"sort": [
{
"age": {
"order": "desc"
}
}
]
分页查询 是内存分页
"query": {
"match_phrase_prefix": {
"name": "wang"
}
},
"from": 0,
"size": 1
}
bool查询 must 必须满足 should (只要符合其中一个条件就返回)
#### 多条件组合查询
GET test/doc/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "wanggfei"
}
},{
"match": {
"age": 25
}
}
]
}
}
}
filter(条件过滤查询,过滤条件的范围用range表示gt表示大于、lt表示小于、gte表示大于等于、lte表示小于等于)
"filter": {
"range": {
"age": {
"gte": 10,
"lt": 27
}
}
}
bool查询总结!!!
must:与关系,相当于关系型数据库中的 and。
should:或关系,相当于关系型数据库中的 or。
must_not:非关系,相当于关系型数据库中的 not。
filter:过滤条件。
range:条件筛选范围。
gt:大于,相当于关系型数据库中的 >。
gte:大于等于,相当于关系型数据库中的 >=。
lt:小于,相当于关系型数据库中的 <。
lte:小于等于,相当于关系型数据库中的 <=。
只需要查看name和age两个属性,提高查询效率"_source": ["name","age"]
!!!!!
精确查询与模糊查询 term则不经过分词!!,它是直接去倒排索引中查找了精确的值了 match是经过analyer,会分词,注意不同类型查询会不会分词
t1类型为text,会经过分词!!! t2类型为keyword类型,不会经过分词!!!
多个精确值(terms)
GET test/doc/_search
{
"query": {
"terms": {
"age": [
"27",
"28"
]
}
}
}
聚合查询avg、max、min、sum 被封装在aggs中,而my_avg则是为查询结果起个别名,封装了计算出的平均值
GET zhifou/doc/_search
{
"query": {
"match_all": {}
},
"aggs": {
"my_max": {
"max": {
"field": "age"
}
}
},
"size": 0,
"_source": ["name","age","from"]
}
get返回 别名aliases mappings信息:包括索引类型doc settings设置。包括该索引的创建时间,主副分片的信息,UUID等等
字段数据类型:
文本(text)、关键字(keyword)、日期(data)、整形(long)、双精度(double)、布尔(boolean)或ip JSON的层次结构性质的类型
index属性默认为true,如果该属性设置为false,那么,elasticsearch不会为该属性创建索引,也就是说无法当做主查询条件
number_of_shards是主分片数量(每个索引默认5个主分片),而number_of_replicas是复制分片,默认一个主分片搭配一个复制分片