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是複製分片,默認一個主分片搭配一個複製分片