ElasticSearch 7.8.1 從入門到精通

學前導讀

  1. ElasticSearch對電腦配置要求較高內存至少4G以上,空閒2G內存,線程數4018+
  2. 學習的時候,推薦將ElasticSearch安裝到Linux或者mac上,極度不推薦裝Windows上(坑太多,服務器部署的時候,也不會部署到Window上,學習用Windows上玩,不是耽誤自個時間麼)。若是是Window用戶想學這個,電腦自身至少16G,而後裝虛擬機,在虛擬機上搞個Linux玩
  3. Linux系統不建議裝6/6.5版本的(啓動的時候,會檢查內核是否3.5+,固然能夠忽略這個檢查),推薦裝7+
  4. 自身電腦配置不高的話,怎麼辦呢?土豪作法,去買個雲服務器叭,在雲服務器上玩

注意事項

  上面第一、2點未知足,又捨不得去買雲服務器的小夥伴,就不要往下面看了,看了也白看,ElasticSearch對電腦配置要求較高,前置條件未知足的話,服務是起不來的。html

演示環境說明

  我演示的時候,是用的mac系統,上面裝了個虛擬機,虛擬機版本Centos6.5,jdk用的13,ElasticSearch用的版本是 7.8.1。這些我使用的包我下面也會提供,爲了學習的話,儘可能和我使用的版本一致,這樣你們碰到的問題都同樣,安裝過程當中,我也猜了很多坑,都總結出來了,仔細閱讀文檔就能夠搗鼓出來。java

什麼是搜索引擎?

  經常使用的搜索網站:百度、谷歌node

數據的分類

結構化數據

  指具備固定格式或有限長度的數據,如數據庫,元數據等。對於結構化數據,咱們通常都是能夠經過關係型數據庫(mysql、oracle)的table的方法存儲和搜索,也能夠創建索引。經過b-tree等數據結構快速搜索數據mysql

非結構化數據

  全文數據,指不定長或無固定格式的數據,如郵件,word等。對於非結構化數據,也即對全文數據的搜索主要有兩種方式:順序掃描法,全文搜索法linux

順序掃描法

  咱們能夠了解它的大概搜索方式,就是按照順序掃描的方式查找特定的關鍵字。好比讓你在一篇籃球新聞中,找出「科比」這個名字在那些段落出現過。那你確定須要從頭至尾把文章閱讀一遍,而後標出關鍵字在哪些地方出現過git

  這種方式毋庸置疑是最低效的,若是文章很長,有幾萬字,等你閱讀完這篇新聞找到「科比」這個關鍵字,那得花多少時間github

全文搜索

  對非結構化數據進行順序掃描很慢,咱們是否能夠進行優化?把非結構化數據想辦法弄得有必定結構不就行了嘛?將非結構化數據中的一部分信息提取出來,從新組織,使其變得有必定結構,而後對這些有必定結構的數據進行搜索,從而達到搜索相對較快的目的。這種方式就構成了全文搜索的基本思路。這部分從非結構化數據提取出的而後從新組織的信息,就是索引。正則表達式

什麼是全文搜索引擎

  根據百度百科中的定義,全文搜索引擎是目前普遍應用的主流搜索引擎。它的工做原理是計算機索引程序經過掃描文章中的每一個詞,對每一個詞創建一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先創建的索引進行查找,並將查找的結果反饋給用戶。算法

常見的搜索引擎

Lucene

  • Lucene是一個Java全文搜索引擎,徹底用Java編寫。lucene不是一個完整的應用程序,而是一個代碼庫和API,能夠很容易地用於嚮應用程序添加搜索功能
  • 經過簡單的API提供強大的功能
    • 可擴展的高性能索引
    • 強大,準確,高效的搜索算法
    • 跨平臺解決方案
  • Apache軟件基金會
    • 在Apache軟件基金會提供的開源軟件項目的Apache社區的支持
    • 可是Lucene只是一個框架,要充分利用它的功能,須要使用Java,而且在程序中集成Lucene。須要不少的學習瞭解,才能明白它是如何運行的,熟練運用Lucene確實很是複雜

Solr

  • Solr是一個基於Lucene的Java庫構建的開源搜索平臺。它以友好的方式提供Apache Lucene的搜索功能。它是一個成熟的產品,擁有強大而普遍的用戶社區。它能提供分佈式索引,複製,負載均衡以及自動故障轉移和恢復。若是它被正確部署而後管理的好,他就可以成爲一個高可用,可擴展且容錯的搜索引擎
  • 強大功能
    • 全文搜索
    • 突出
    • 分面搜索
    • 實時索引
    • 動態集羣
    • 數據庫集成
    • NoSQL功能和豐富的文檔處理

ElasticSearch

  • ElasticSearch是一個開源,是一個機遇Apache Lucene庫構建的Restful搜索引擎
  • ElasticSearch是Solr以後幾年推出的。它提供了一個分佈式,多租戶能力的全文搜索引擎,具備HTTP Web頁面和無架構JSON文檔。ElasticSearch的官方客戶端提供Java、Php、Ruby、Perl、Python、.Net和JavaScript
  • 主要功能
    • 分佈式搜索
    • 數據分析
    • 分組和聚合
  • 應用場景
    • 維基百科
    • Stack Overflow
    • GitHub
    • 電商網站
    • 日誌數據分析
    • 商品價格監控網站
    • BI系統
    • 站內搜索
    • 籃球論壇

搜索引擎的快速搭建

環境準備

  注意,我使用的linux搭建的,固然Window(極度不推薦,坑太多)也能搭建,ElasticSearch安裝前須要先安裝jdk,這裏我使用的是jdk13,由於linux自帶jdk版本,須要先將以前的jdk版本卸載(點我直達),在安裝指定的jdk版本!!!sql

  開發環境,建議關閉防火牆,避免沒必要要的麻煩!!!!生產環境,視狀況開啓端口號!!!!

service iptables stop   命令關閉防火牆,可是系統重啓後會開啓

chkconfig iptables off--關閉防火牆開機自啓動

「注意事項」

  ElasticSearch強依賴jdk環境的,因此必定要安裝對應的jdk版本並配置好相關的環境變量,好比ES7.X版本要裝jdk8以上的版本,並且是要官方來源的jdk。啓動的時候有可能會提示要裝jdk11,由於ES7以上官方都是建議使用jdk11,可是通常只是提示信息,不影響啓動。

ES官網推薦JDK版本兼容地址:點我直達

  ES強依賴JVM,也很吃內存,因此必定要保證你的機器至少空閒出2G以上內存。推薦使用Linux,能夠本地搭建虛擬機。

  啓動必定要使用非root帳戶!!!!這是ES強制規定的。ElasticSearch爲了安全考慮,不讓使用root啓動,解決辦法是新建一個用戶,用此用戶進行相關的操做。若是你用root啓動,會報錯。若是是使用root帳戶安裝ES,首先給安裝包受權,好比chown -R 777 安裝包路徑。而後再使用非root帳戶啓動,具體的權限配置,根據本身想要的配置。

補充

  高版本ElasticSearch自帶jdk版本的,Linux中我安裝的是jdk13,沒用ElasticSearch自帶的jdk,有興趣的小夥伴能夠去研究下。

下載

官網地址:點我直達

我使用的包(推薦和我版本保持一致)

連接: https://pan.baidu.com/s/1jjNEErHtBu93HmvxKCT5Sw  密碼: kbcs

修改配置文件

一、修改elasticsearch-x.x.x/config/elasticsearch.yml,主要修改爲如下內容

cluster.name: my-application
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
cluster.initial_master_nodes: ["node-1"]

bootstrap.system_call_filter: false
http.cors.allow-origin: "*"
http.cors.enabled: true
http.cors.allow-headers : X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization
http.cors.allow-credentials: true

二、來到elasticsearch-x.x.x/bin下,執行:sh elasticsearch啓動,報錯,修改配置文件elasticsearch-env

三、設置用戶和組 

groupadd elsearch
#添加用戶組,語法:groupadd 組名
useradd elsearch -g elsearch -p elasticsearch
#添加用戶,並將用戶添加到組中,語法:useradd 用戶名 -p 密碼 -g 組名
chown -R elsearch:elsearch  elasticsearch-6.3.0
# 給用戶組受權,語法:chown -R 用戶:組名 es安裝完整路徑

注意=================以上root用戶操做=============== 

注意=================如下es用戶操做================

注意:若es用戶密碼登陸不上,在回到root用戶下,修改es用戶的密碼,語法:passwd 要修改用戶名

四、登陸到es用戶下,繼續啓動ElasticSearch,執行:sh elasticsearch

報錯以下:
java.lang.UnsupportedOperationException: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled in

緣由:我用的Centos6.5,其linux內核版本爲2.6。而Elasticsearch的插件要求至少3.5以上版本。


解決方案:禁用這個插件便可
修改elasticsearch.yml文件,在最下面添加以下配置:
bootstrap.system_call_filter: false

5.繼續啓動ElasticSearch,執行:sh elasticsearch

修改一下內容須要使用root權限

報錯以下4條:
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max number of threads [1024] for user [es] is too low, increase to at least [4096]
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[4]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

==========分割線===============
解決辦法以下
一、vim /etc/security/limits.conf文件,添加
* soft nofile 65535
* hard nofile 65535

二、vim /etc/security/limits.conf文件,添加
* soft nproc  4096
* hard nproc  4096

三、vim /etc/sysctl.conf 文件,添加
vm.max_map_count=262144  

四、vim /var/soft/es7.8.1/elasticsearch-7.8.1/config/elasticsearch.yml 文件,添加
cluster.initial_master_nodes: ["node-1"]

修改完以後,必定要重啓,重啓,重啓,重要的事兒說三遍!!!!!

上面第2條問題,線程數修改不了,能夠嘗試使用這個方法修改線程數

Elasticsearch7.8.1 [1]: max number of threads [1024] for user [es] is too low, increase to at least [4096]異常

根據linux系統差別,有時候須要來點終極解決方案

新建: /etc/security/limits.d/test-limits.conf

cat>>test-limits.conf



而後加下內容:

* soft nofile 65535

* hard nofile 65535

* soft nproc 4096

* hard nproc 4096


ctrl+d保存便可;


而後重啓服務器便可;

配置小結

  一、第一次配置過程當中,踩了很多坑,我踩過的坑,都在上面記錄了

  二、若是照我上面哪一個方法還解決不了,自行根據ElasticSearch日誌,百度去找答案叭····

啓動

正常啓動

進入軟件的安裝目錄,進入到bin
執行:sh elasticsearch

守護進行啓動

進入軟件的安裝目錄,進入到bin
執行:sh elasticsearch -d -p pid

驗證

  打開瀏覽器輸入:127.0.0.1:9200

ElasticSearch目錄結構介紹

類型 描述 默認位置 設置
bin
⼆進制腳本包含啓動節點的elasticsearch
{path.home}/bin
 
conf
配置⽂件包含elasticsearch.yml 
{path.home}/confifig
path.conf
data
在節點上申請的每一個index/shard的數據⽂件的位置。
可容納多個位置
{path.home}/data
path.data
logs
⽇志⽂件位置
{path.home}/logs
path.logs
plugins
插件⽂件位置。每一個插件將包含在⼀個⼦⽬錄中。
{path.home}/plugins
path.plugins

ElasticSearch快速入門

核心概念

前言

  傳統數據庫查詢數據的操做步驟是這樣的:創建數據庫->建表->插入數據->查詢

索引(index)

  一個索引能夠理解成一個關係型數據庫

類型(type)

  一個type就像一類表,好比user表、order表

  注意

    一、ES 5.X中一個index能夠有多種type

    二、ES 6.X中一個index只能有一種type

    三、ES 7.X之後已經移除type這個概念

映射(mapping)

  mapping定義了每一個字段的類型等信息。至關於關係型數據庫中的表結構

文檔(document)

  一個document至關於關係型數據庫中的一行記錄

字段(field)

  至關於關係型數據庫表的字段

集羣(cluster)

  集羣由一個或多個節點組成,一個集羣由一個默認名稱「elasticsearch」

節點(node)

  集羣的節點,一臺機器或者一個進程

分片和副本(shard)

  • 副本是分片的副本。分片有主分片(primary Shard)和副本分片(replica Shard)之分
  • 一個Index數據在屋裏上被分佈在多個主分片中,每一個主分片只存放部分數據
  • 每一個主分片能夠有多個副本,叫副本分片,是主分片的複製

RESTful風格的介紹

介紹

  •  RESTful是一種架構的規範與約束、原則,符合這種規範的架構就是RESTful架構
  • 先看REST是什麼意思,英文Representational state transfer表述性狀態轉移,其實就是對資源的標書性狀態轉移,即經過HTTP動詞來實現資源的狀態扭轉
  • 資源是REST系統的核心概念。全部的設計都是以資源爲中心
  • elasticsearch使用RESTful風格api來設計的

方法

action 描述
HEAD 只獲取某個資源的頭部信息
GET 獲取資源
POST 建立或更新資源
PUT 建立或更新資源
DELETE 刪除資源
GET /user:列出全部的⽤戶
POST /user:新建⼀個⽤戶
PUT /user:更新某個指定⽤戶的信息
DELETE /user/ID:刪除指定⽤戶

調試工具

Postman工具(推薦)

curl工具

獲取elasticcsearch狀態

curl -X GET "http://localhost:9200"

新建一個文檔

curl -X PUT "localhost:9200/xdclass/_doc/1" -H 'Content-Type:
application/json' -d' {
"user" : "louis",
"message" : "louis is good"
}

刪除一個文檔

curl -X DELETE "localhost:9200/xdclass/_doc/1"

索引的使用

新增

單個獲取

批量獲取

刪除

獲取全部

方式一

方式二

判斷索引是否存在(存在,返回200,不存在404)

關閉索引

  此時再次查詢cba時,返回json會多一行

打開索引

  關閉索引標記消失

映射的使用

介紹

  定義索引的結構,以前定義一個nba索引,可是沒有定義他的結構,咱們如今開始創建mapping;

  type="keyword":是一個關鍵字,不會被分詞

  type="text":會被分詞,使用的是全文索引

新增

json格式

{
    "properties": {
        "name": {
            "type": "text"
        },
        "team_name": {
            "type": "text"
        },
        "position": {
            "type": "keyword"
        },
        "play_year": {
            "type": "keyword"
        },
        "jerse_no": {
            "type": "keyword"
        }
    }
}

獲取

批量獲取

獲取全部mapping

方式一

方式二

添加一次字段

文檔的操做

新增

不指定索引方式新增

踩坑(要POST請求)

PUT請求改POST

自動建立索引

  • 查看auto_create_index開關狀態,請求:http://ip:port/_cluster/settings

  • 當索引不存在而且auto_create_index爲true的時候,新增文檔時會自動建立索引
  • 修改auto_create_index狀態
    • put方式:ip:port/_cluster/settings

{
"persistent": {
    "action.auto_create_index": "false"
 }
}

  當auto_create_index=false時,指定一個不存在的索引,新增文檔

{
    "name":"楊超越",
    "team_name":"夢之隊",
    "position":"組織後衛",
    "play_year":"0",
    "jerse_no":"18"
}

指定操做類型

PUT請求:ip:port/xxx/_doc/1?op_type=create

文檔查看

查看多個文檔

方式一

{
    "docs": [{
            "_index": "nba",
            "_type": "_doc",
            "_id": "1"
        },
        {
            "_index": "nba",
            "_type": "_doc",
            "_id": "2"
        }
    ]
}

方式二

方式三

方式四

修改

向_source字段,增長一個字段

{
    "script": "ctx._source.age = 18"
}

從source字段,刪除一個字段

{
    "script": "ctx._source.remove(\"age\")"
}

根據參數值,更新指定文檔的字段

  upsert當指定的文檔不存在時,upsert參數包含的內容將會被插入到索引中,做爲一個新文檔;若是指定的文檔存在,ElasticSearch引擎將會執行指定的更新邏輯。

刪除文檔

搜索的簡單使用

準備工做

刪除nba索引

新建一個索引

並指定mapping

{
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            },
            "team_name": {
                "type": "text"
            },
            "position": {
                "type": "text"
            },
            "play_year": {
                "type": "long"
            },
            "jerse_no": {
                "type": "keyword"
            }
        }
    }
}

新增document

192.168.199.170:9200/nba/_doc/1
{
    "name": "哈登",
    "team_name": "⽕箭",
    "position": "得分後衛",
    "play_year": 10,
    "jerse_no": "13"
}
192.168.199.170:9200/nba/_doc/2
{
    "name": "庫⾥",
    "team_name": "勇⼠",
    "position": "控球后衛",
    "play_year": 10,
    "jerse_no": "30"
}
192.168.199.170:9200/nba/_doc/3
{
    "name": "詹姆斯",
    "team_name": "湖⼈",
    "position": "⼩前鋒",
    "play_year": 15,
    "jerse_no": "23"
}

詞條查詢(term)

  詞條查詢不會分析查詢條件,只有當詞條和查詢字符串徹底匹配時,才匹配搜索。

單挑term查詢

{
    "query": {
        "term": {
            "jerse_no": "23"
        }
    }
}

多條term查詢

{
    "query": {
        "terms": {
            "jerse_no": [
                "23",
                "13"
            ]
        }
    }
}

全文查詢(full text)

  ElasticSearch引擎會先分析查詢字符串,將其拆分紅多個分詞,只要已分析的字段中包含詞條的任意一個,或所有包含,就匹配查詢條件,返回該文檔;若是不包含任意一個分詞,表示沒有任何問的那個匹配查詢條件

match_all

{
    "query": {
        "match_all": {}
    },
    "from": 0,
    "size": 10
}

match

{
    "query": {
        "match": {
            "position":"後衛"
        }
    },
    "from": 0,
    "size": 10
}

multi_match

{
    "query": {
        "multi_match": {
            "query": "shooter",
            "fields": ["title", "name"]
        }
    }
}
post 192.168.199.170:9200/nba/_update/2
{
    "doc": {
        "name": "庫⾥",
        "team_name": "勇⼠",
        "position": "控球后衛",
        "play_year": 10,
        "jerse_no": "30",
        "title": "the best shooter"
    }
}

match_phrase

  相似於詞條查詢,精準查詢

match_phrase_prefix

  前綴匹配

{
    "query": {
        "match_phrase_prefix": {
            "title": "the best s"
        }
    }
}
post 192.168.199.170:9200/nba/_update/3
{
    "doc": {
        "name": "詹姆斯",
        "team_name": "湖⼈",
        "position": "⼩前鋒",
        "play_year": 15,
        "jerse_no": "23",
        "title": "the best small forward"
    }
}

分詞器的介紹和使用

什麼是分詞器

  • 將用戶輸入的一段文本,按照必定邏輯,分析成多個詞語的一種工具
  • example:The best 3-points shooter is Curry!

經常使用的內置分詞器

  1. standard analyzer
  2. simple analyzer
  3. whitespace analyzer
  4. stop analyzer
  5. language analyzer
  6. pattern analyzer

standard analyzer

  標準分析器是默認分詞器,若是未指定,則使用該分詞器

{
    "analyzer": "standard",
    "text": "The best 3-points shooter is Curry!"
}

simple analyzer

  simple分析器當他遇到只要不是字母的字符,就將文本解析成term,並且全部的term都是小寫

whitespace analyzer

  whitespace分析器,當他遇到空白字符時,就將文本解析成terms

stop analyzer

  stop分析器和simple分析器很想,惟一不一樣的是,stop分析器增長了對刪除中止詞的支持,默認使用了english中止詞

  stopwords預約義的中止詞列表,好比(ths,a,an,this,of,at)等等

language analyzer

(特定的語⾔的分詞器,⽐如說,english,英語分詞器),內置語⾔:arabic, armenian,
basque, bengali, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english, fifinnish,
french, galician, german, greek, hindi, hungarian, indonesian, irish, italian, latvian,
lithuanian, norwegian, persian, portuguese, romanian, russian, sorani, spanish,
swedish, turkish, thai 

pattern analyzer

  用正則表達式將文本分割成sterms,默認的正則表達式是\W+

選擇分詞器

put 192.168.199.170:9200/my_index
{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "type": "whitespace"
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            },
            "team_name": {
                "type": "text"
            },
            "position": {
                "type": "text"
            },
            "play_year": {
                "type": "long"
            },
            "jerse_no": {
                "type": "keyword"
            },
            "title": {
                "type": "text",
                "analyzer": "my_analyzer"
            }
        }
    }
}

{
    "name": "庫⾥",
    "team_name": "勇⼠",
    "position": "控球后衛",
    "play_year": 10,
    "jerse_no": "30",
    "title": "The best 3-points shooter is Curry!"
}

{
    "query": {
        "match": {
            "title": "Curry!"
        }
    }
}

常見中文分詞器

默認的分詞standard

{
    "analyzer": "standard",
    "text": "⽕箭明年總冠軍" 
}

常見分詞器

  • smartCN一個簡單的中文或中英文混合文本的分詞器
  • IK分詞器,更智能更友好的中文分詞器

安裝smartCN

  • sh elasticsearch-plugin install analysis-smartcn

校驗

  安裝後重啓

{
    "analyzer": "smartcn",
    "text": "⽕箭明年總冠軍" 
}

卸載

  sh elasticsearch-plugin remove analysis-smartcn

IK分詞器

  下載地址:點我直達

安裝,解壓到plugins目錄 

而後重啓 

常見的字段類型

數據類型

  • 核心數據類型
  • 複雜數據類型
  • 專用數據類型

核心數據類型

字符串

  • text:用於全文索引,該類型的字段將經過分詞器進行分詞
  • keyword:不分詞,只能搜索該字段的完整的值

數值型

  • long、integer、short、byte、double、float、half_float、scaled_float

布爾

  • boolean

二進制

  • binary:該類型的字段把值當作通過base64編碼的字符串,默認不存儲,且不可搜索

範圍類型

  1. 範圍類型表示值是一個範圍,而不是一個具體的值
  2. integer_range、float_range、long_range、double_range、date_range
  3. 好比age類型是integer_range,那麼值能夠是{"gte":20,"lte":40};搜索"term":{"age":21}能夠搜索該值

日期-date

  因爲json類型沒有date類型,因此es經過識別字符串是否符合format定義的格式來判斷是否爲date類型

  format默認爲:strict_date_optional_time || epoch_millis

  格式

    "2022-01-01" "2022/01/01 12:10:30" 這種字符串格式

  從開始紀元(1970年1月1日0點)開始的毫秒數

PUT 192.168.199.170:9200/nba/_mapping

{
    "properties": {
        "name": {
            "type": "text"
        },
        "team_name": {
            "type": "text"
        },
        "position": {
            "type": "text"
        },
        "play_year": {
            "type": "long"
        },
        "jerse_no": {
            "type": "keyword"
        },
        "title": {
            "type": "text"
        },
        "date": {
            "type": "date"
        }
    }
}
POST 192.168.199.170:9200/nba/_doc/4

{
    "name": "蔡x坤",
    "team_name": "勇⼠",
    "position": "得分後衛",
    "play_year": 10,
    "jerse_no": "31",
    "title": "打球最帥的明星",
    "date": "2020-01-01"
}
POST 192.168.199.170:9200/nba/_doc/5

{
    "name": "楊超越",
    "team_name": "猴急",
    "position": "得分後衛",
    "play_year": 10,
    "jerse_no": "32",
    "title": "打球最可愛的明星",
    "date": 1610350870
}
POST 192.168.199.170:9200/nba/_doc/6

{
    "name": "吳亦凡",
    "team_name": "湖⼈",
    "position": "得分後衛",
    "play_year": 10,
    "jerse_no": "33",
    "title": "最會說唱的明星",
    "date": 1641886870000
}

複雜數據類型

數據類型 Array

  • ES中沒有專門的數據類型,直接使用[]定義接口,數組中全部的值必須是同一種數據類型,不支持混合數據類型的數組
  • 字符串數組["one","two"]
  • 整數數組[1,2]
  • Object對象數組[{"name":"alex","age":18},{"name":"tom","age":18}]

對象類型Object

POST 192.168.199.170:9200/nba/_doc/8

{
    "name": "吳亦凡",
    "team_name": "湖⼈",
    "position": "得分後衛",
    "play_year": 10,
    "jerse_no": "33",
    "title": "最會說唱的明星",
    "date": "1641886870",
    "array": [
        "one",
        "two"
    ],
    "address": {
        "region": "China",
        "location": {
            "province": "GuangDong",
            "city": "GuangZhou"
        }
    }
}

索引方式

"address.region": "China",
"address.location.province": "GuangDong",
"address.location.city": "GuangZhou"
POST 192.168.199.170:9200/nba/_search

{
    "query": {
        "match": {
            "address.region": "china"
        }
    }
}

專用數據類型

IP類型

  IP類型的字段用於存儲IPv4和IPv6的地址,本質上是一個長整形字段

POST 192.168.199.170:9200/nba/_mapping

{
    "properties": {
        "name": {
            "type": "text"
        },
        "team_name": {
            "type": "text"
        },
        "position": {
            "type": "text"
        },
        "play_year": {
            "type": "long"
        },
        "jerse_no": {
            "type": "keyword"
        },
        "title": {
            "type": "text"
        },
        "date": {
            "type": "date"
        },
        "ip_addr": {
            "type": "ip"
        }
    }
}
PUT 192.168.199.170:9200/nba/_doc/9

{
    "name": "吳亦凡",
    "team_name": "湖⼈",
    "position": "得分後衛",
    "play_year": 10,
    "jerse_no": "33",
    "title": "最會說唱的明星",
    "ip_addr": "192.168.1.1"
}
POST 192.168.199.170:9200/nba/_search

{
    "query": {
        "term": {
            "ip_addr": "192.168.0.0/16"
        }
    }
}

kibana工具的安裝和使用

簡介

  可視化工具kibana的安裝和使用

下載

點我直達

賦權限

 chown -R es:es781g /var/soft/kibana-7.8.1-linux-x86_64
# 給用戶組受權,語法:chown -R 用戶:組名 es安裝完整路徑

kibana.yml

server.port: 5601   #kibana端口
server.host: "10.0.0.169"    #綁定的主機IP地址
elasticsearch.hosts: ["http://10.0.0.169:9200"]      #elasticsearch的主機IP
kibana.index: ".kibana"     #開啓此選項
i18n.locale: "zh-CN"     #kibana默認文字是英文,變動成中文

啓動

進⼊到⽂件夾的bin⽬錄,執⾏sh kibana

訪問

ip:5601

簡單使用

  後面示例,會大量使用該工具

ES之批量導入數據

簡介

  手把手教你批量導入數據

Bulk

  ES提供了一個叫bulk的API來進行批量操做

批量導入

數據

{"index": {"_index": "book", "_type": "_doc", "_id": 1}}
{"name": "權⼒的遊戲"} {"index": {"_index": "book", "_type": "_doc", "_id": 2}}
{"name": "瘋狂的⽯頭"}

POST bulk

curl -X POST "192.168.199.170:9200/_bulk" -H 'Content-Type: application/json' --data-binary @test

 

 

ES之term的多種查詢

介紹

  • 單詞級別查詢
  • 這些查詢一般用於結構化的數據,好比:number,data,keyword等,而不是對text
  • 也就是說,全文查詢以前要先對文本內容進行分詞,而單詞級別的查詢直接在相應字段的反向索引中精確查找,單詞級別的查詢通常用於數值、日期等類型的字段上

準備工做

  1. 刪除nba
  2. 新增nba索引
{"mappings":{"properties":{"birthDay":{"type":"date"},"birthDayStr": {"type":"keyword"},"age":{"type":"integer"},"code": {"type":"text"},"country":{"type":"text"},"countryEn": {"type":"text"},"displayAffiliation":{"type":"text"},"displayName": {"type":"text"},"displayNameEn":{"type":"text"},"draft": {"type":"long"},"heightValue":{"type":"float"},"jerseyNo": {"type":"text"},"playYear":{"type":"long"},"playerId": {"type":"keyword"},"position":{"type":"text"},"schoolType": {"type":"text"},"teamCity":{"type":"text"},"teamCityEn": {"type":"text"},"teamConference": {"type":"keyword"},"teamConferenceEn":{"type":"keyword"},"teamName": {"type":"keyword"},"teamNameEn":{"type":"keyword"},"weight": {"type":"text"}}}}

  • 批量導入player

Term query精準匹配查詢

POST nba/_search
{
  "query": {
    "term": {
      "jerseyNo": "23"
    }
  },
  "from": 0,
  "size": 20
}

Exsit Query在特定的字段中查找非空值的文檔(查找隊名非空的球員)

Prefix Query查找包含帶有指定前綴term的文檔(查找隊名爲Rock開頭的球員)

Wildcard Query支持通配符查詢,*表示任意字符,?表示任意單個字符(查找火箭隊的球員)

Regexp Query正則表達式查詢(查找火箭隊的球員)

Ids Query(查找id爲1和2的球員)

ES的範圍查詢

查詢指定字段在指定範圍內包含值(日期、數字或字符串)的文檔

  查找在nba打球在2年到10年之內的球員

 

POST nba/_search
{
  "query": {
    "range": {
      "playYear": {
        "gte": 2,
        "lte": 10
      }
    }
  },
  "from": 0,
  "size": 20
}

查找1999年到2020年出生的球員

 

POST nba/_search
{
  "query": {
    "range": {
      "birthDay": {
        "gte": "01/01/1999",
        "lte": "2020",
        "format": "dd/MM/yyyy||yyyy"
      }
    }
  },
  "from": 0,
  "size": 20
}

ES的布爾查詢

布爾查詢

type description
must 必須出如今匹配文檔中
filter 必須出如今文檔中,可是不打分
must_not 不能出如今文檔中
should 應該出如今文檔中

must(查詢名字叫作james的球員)

 

POST nba/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 20
}

效果通must,可是不打分(查找名字叫作james的球員)

 

POST nba/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 20
}

must_not(查找名字叫作James的西部球員)

 

POST nba/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "teamConferenceEn": {
              "value": "Eastern"
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 20
}

組合起來含義:必定不在東部的james

should(查找名字叫作James的打球時間應該在11到20年西部球員)

即便匹配不到也返回,只是評分不一樣

 

POST nba/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "teamConferenceEn": {
              "value": "Eastern"
            }
          }
        }
      ],
      "should": [
        {
          "range": {
            "playYear": {
              "gte": 11,
              "lte": 20
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 20
}

若是minimum_should_match=1,則變成要查出名字叫作James的打球時間在11年到20年西部球員

 

POST nba/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "teamConferenceEn": {
              "value": "Eastern"
            }
          }
        }
      ],
      "should": [
        {
          "range": {
            "playYear": {
              "gte": 11,
              "lte": 20
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "from": 0,
  "size": 20
}

minimum_should_match表明了最小匹配經度,若是設置minimum_should_match=1,那麼should語句中至少須要有一個條件知足

ES的排序

火箭隊中按打球時間從大到小排序的球員

 

POST nba/_search
{
  "query": {
    "match": {
      "teamNameEn": "Rockets"
    }
  },
  "sort": [
    {
      "playYear": {
        "order": "desc"
      }
    }
  ], 
  "from": 0,
  "size": 20
}

火箭隊中按打球時間從大到小,若是年齡相同則按照身高從高到低排序的球員

 

POST nba/_search
{
  "query": {
    "match": {
      "teamNameEn": "Rockets"
    }
  },
  "sort": [
    {
      "playYear": {
        "order": "desc"
      }
    },{
      "heightValue": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 20
}

ES聚合查詢之指標聚合

ES聚合查詢是什麼

  1. 聚合查詢是數據庫重要功能特性,完成對一個查詢獲得的數據集的聚合計算,如:找出某字段(或計算表達式的結果)的最大值,最小值,計算和,平均值等。ES做爲搜索引擎,一樣提供了強大的聚合分析能力
  2. 對一個數據集求最大、最小、和、平均值等指標的聚合,在ES中稱爲指標聚合
  3. 而關係型數據庫中除了有聚合函數外,還能夠對查詢出的數據進行分組group by,再在組上進行指標聚合。在ES中稱爲「桶聚合

max min sum avg

求出火箭隊球員的平均年齡

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "avgAge": {
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0
}

value_count統計非空字段的文檔數

求出火箭隊中球員打球時間不爲空的數量

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "countPlayerYear": {
      "value_count": {
        "field": "playYear"
      }
    }
  },
  "size": 0
}

查出火箭隊有多少名球員

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  }
}

Cardinality值去重計數

查出火箭隊中年齡不一樣的數量

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "countAget": {
      "cardinality": {
        "field": "age"
      }
    }
  },
  "size": 0
}

stats統計count max min avg sum5個值

查出火箭隊球員的年齡stats

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "statsAge": {
      "stats": {
        "field": "age"
      }
    }
  },
  "size": 0
}

Extended stats比stats多4個統計結果:平方和、方差、標準差、平均值加/減兩個標準差的區間

查詢火箭隊球員的年齡Extend stats

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "extendStatsAge": {
      "extended_stats": {
        "field": "age"
      }
    }
  },
  "size": 0
}

Percentiles佔比百分位對應的值統計,默認返回【1,5,25,50,75,95,99】分位上的值

查出火箭的球員的年齡佔比

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "pecentAge": {
      "percentiles": {
        "field": "age"
      }
    }
  },
  "size": 0
}

查出火箭的球員的年齡佔比(指定分位值)

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "pecentAge": {
      "percentiles": {
        "field": "age",
        "percents": [
          20,
          50,
          75
        ]
      }
    }
  },
  "size": 0
}

ES聚合查詢之桶聚合

ES聚合分析是什麼

  • 聚合分析是數據庫中重要的功能特性,完成對一個查詢的數據集中數據的聚合計算,如:找出字段(或計算表達式的結果)的最大值、最小值、計算和、平均值等。ES做爲搜索引擎兼容數據庫,一樣提供了強大的聚合分析能力
  • 對一個數據集求最大、最小、和、平均值等指標的聚合,在ES中稱爲指標聚合
  • 而關係型數據庫中除了有聚合函數外,還能夠對查詢出的數據進行分組group by,再在組上進行遊標聚合。在ES中稱爲桶聚合

Terms Aggregation根據字段項分組聚合

火箭隊根據年齡進行分組

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "aggsAge": {
      "terms": {
        "field": "age",
        "size": 10
      }
    }
  },
  "size": 0
}

Order分組聚合排序

火箭隊根據年齡進行分組,分組信息經過年齡從大到小排序(經過指定字段)

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "aggsAge": {
      "terms": {
        "field": "age",
        "size": 10,
        "order": {
          "_key": "desc"
        }
      }
    }
  },
  "size": 0
}

火箭隊根據年齡進行分組,分組信息經過文檔數從大到小排序(經過文檔數)

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "aggsAge": {
      "terms": {
        "field": "age",
        "size": 10,
        "order": {
          "_count": "desc"
        }
      }
    }
  },
  "size": 0
}

每支球隊按該隊全部球員的平均年齡進行分組排序(經過分組指標值)

 

POST /nba/_search
{
  "query": {
    "term": {
      "teamNameEn": {
        "value": "Rockets"
      }
    }
  },
  "aggs": {
    "avgAge": {
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0
}

篩選分組聚合

湖人和火箭隊按球隊平均年齡進行分組排序(指定值列表)

 

POST /nba/_search
{
  "aggs": {
    "aggsTeamName": {
      "terms": {
        "field": "teamNameEn",
        "include": [
          "Lakers",
          "Rockets",
          "Warriors"
        ],
        "exclude": [
          "Warriors"
        ],
        "size": 30,
        "order": {
          "avgAge": "desc"
        }
      },
      "aggs": {
        "avgAge": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  },
  "size": 0
}

湖人和火箭隊按球隊平均年齡進行分組排序(正則表達式匹配值)

 

POST /nba/_search
{
  "aggs": {
    "aggsTeamName": {
      "terms": {
        "field": "teamNameEn",
        "include": "Lakers|Ro.*|Warriors.*",
        "exclude": "Warriors",
        "size": 30,
        "order": {
          "avgAge": "desc"
        }
      },
      "aggs": {
        "avgAge": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  },
  "size": 0
}

Range Aggregation範圍分組聚合

NBA球員年齡按20,20-35,35這樣分組

 

POST /nba/_search
{
  "aggs": {
    "ageRange": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "to": 20
          },
          {
            "from": 20,
            "to": 35
          },
          {
            "to": 35
          }
        ]
      }
    }
  },
  "size": 0
}

NBA球員年齡按20,20-35,35這樣分組(起別名)

 

Date Range Aggregation時間範圍分組聚合

NBA球員按出生年月分組

 

POST /nba/_search
{
  "aggs": {
    "birthDayRange": {
      "date_range": {
        "field": "birthDay",
        "format": "MM-yyy",
        "ranges": [
          {
            "to": "01-1989"
          },
          {
            "from": "01-1989",
            "to": "01-1999"
          },
          {
            "from": "01-1999",
            "to": "01-2009"
          },
          {
            "from": "01-2009"
          }
        ]
      }
    }
  },
  "size": 0
}

Date Histogram Aggregation時間柱狀圖聚合

按天、月、年等進行聚合統計。可按year(1y),quarter(1q),month(1M),week(1w),day(1d),hour(1h),minute(1m),second(1s)間隔聚合

NBA球員按出生年分組

POST /nba/_search
{
  "aggs": {
    "birthday_aggs": {
      "date_histogram": {
        "field": "birthDay",
        "format": "yyyy",
        "interval": "year"
      }
    }
  },
  "size": 0
}

 

ES之query_string查詢

簡介

  query_string查詢,若是熟悉lucene的查詢語法,咱們能夠直接用lucene查詢語法寫一個查詢串進行查詢,ES中接到請求後,經過查詢解析器,解析查詢串生成對應的查詢。

指定單個字段查詢

 

POST /nba/_search
{
  "query": {
    "query_string": {
      "default_field": "displayNameEn",
      "query": "james OR curry"
    }
  }, 
  "size": 100
}

 

POST /nba/_search
{
  "query": {
    "query_string": {
      "default_field": "displayNameEn",
      "query": "james AND harden"
    }
  }, 
  "size": 100
}

指定多個字段查詢

 

ElasticSearch的高級使用

別名有什麼用

  在開發中,隨着業務需求的迭代,較老的業務邏輯就要面臨更新甚至是重構,而對於es來講,爲了適應新的業務邏輯,可能就要對原有的索引作一些修改,好比對某字段作調整,甚至是重構索引。而作這些操做的時候,可能會對業務形成影響,甚至是停機調整等問題。由此,es提供了索引別名來解決這些問題。索引別名就像一個快捷方式或軟鏈接,能夠指向一個或多個索引,也能夠給任意一個須要索引名的API來使用。別名的應用爲程序提供了極大地靈活性。

查詢別名

GET /nba/_alias

GET /_alias

 

 

 

 

新增別名

 

 

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "nba",
        "alias": "nba_v1.0"
      }
    }
  ]
}

 

刪除別名

 

方式一
POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "nba",
        "alias": "nba_v1.0"
      }
    }
  ]
}

方式二
DELETE /nba/_alias/nba_v1.0

重命名別名

 

POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "nba",
        "alias": "nba_v1.0"
      }
    },
    {
      "add": {
        "index": "nba",
        "alias": "nba_v2.0"
      }
    }
  ]
}

爲多個索引指定一個別名

 

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "nba",
        "alias": "nba_v2.0"
      }
    },{
      "add": {
        "index": "cba",
        "alias": "cba_v2.0"
      }
    }
  ]
}

爲同個索引指定多個別名

 

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "nba",
        "alias": "nba_v2.0"
      }
    },{
      "add": {
        "index": "nba",
        "alias": "cba_v2.2"
      }
    }
  ]
}

經過別名讀索引

當別名指定了一個索引,則查出一個索引

 

當別名指定了多個索引,則查出多個索引

GET /nba_v2.2

經過別名寫索引

當別名指定了一個索引,則能夠作寫的操做

 

POST /nba_v2.0/_doc/566
{
  "countryEn": "Croatia",
  "teamName": "快船",
  "birthDay": 858661200000,
  "country": "克羅地亞",
  "teamCityEn": "LA",
  "code": "ivica_zubac",
  "displayAffiliation": "Croatia",
  "displayName": "伊維察 祖巴茨哥哥",
  "schoolType": "",
  "teamConference": "⻄部",
  "teamConferenceEn": "Western",
  "weight": "108.9 公⽄",
  "teamCity": "洛杉磯",
  "playYear": 3,
  "jerseyNo": "40",
  "teamNameEn": "Clippers",
  "draft": 2016,
  "displayNameEn": "Ivica Zubac",
  "heightValue": 2.16,
  "birthDayStr": "1997-03-18",
  "position": "中鋒",
  "age": 22,
  "playerId": "1627826"
}

當別名指定了多個索引,能夠指定寫某個索引

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "nba",
        "alias": "national_player",
        "is_write_index": true
      }
    },
    {
      "add": {
        "index": "cba",
        "alias": "national_player"
      }
    }
  ]
}
POST /national_player/_doc/566
{
  "countryEn": "Croatia",
  "teamName": "快船",
  "birthDay": 858661200000,
  "country": "克羅地亞",
  "teamCityEn": "LA",
  "code": "ivica_zubac",
  "displayAffiliation": "Croatia",
  "displayName": "伊維察 祖巴茨妹妹",
  "schoolType": "",
  "teamConference": "⻄部",
  "teamConferenceEn": "Western",
  "weight": "108.9 公⽄",
  "teamCity": "洛杉磯",
  "playYear": 3,
  "jerseyNo": "40",
  "teamNameEn": "Clippers",
  "draft": 2016,
  "displayNameEn": "Ivica Zubac",
  "heightValue": 2.16,
  "birthDayStr": "1997-03-18",
  "position": "中鋒",
  "age": 22,
  "playerId": "1627826"
}

ES之重建索引

簡介

  ElasticSearch是一個實時的分佈式搜索引擎,爲用戶提供搜索服務,當咱們決定存儲某種數據時,在建立索引的時候須要將數據結構完整肯定下來,於此同時索引的設定和不少固定配置將不能修改。當須要改變數據結構時,就須要從新創建索引,爲此,Elastic團隊提供了不少輔助工具幫助開發人員進行重建索引

步驟

  1. nba取一個別名nba_latest,nba_latest做爲對外使用
  2. 新增一個索引nba_20200810,結構複製於nba索引,根據業務要求修改字段
  3. 將nba數據同步至nba_20200810
  4. 給nba_20200810添加別名nba_latest,刪除此處nba別名nba_latest
  5. 刪除nba索引

 

PUT /nba_20220810
{
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "birthDay": {
        "type": "date"
      },
      "birthDayStr": {
        "type": "keyword"
      },
      "code": {
        "type": "text"
      },
      "country": {
        "type": "keyword"
      },
      "countryEn": {
        "type": "keyword"
      },
      "displayAffiliation": {
        "type": "text"
      },
      "displayName": {
        "type": "text"
      },
      "displayNameEn": {
        "type": "text"
      },
      "draft": {
        "type": "long"
      },
      "heightValue": {
        "type": "float"
      },
      "jerseyNo": {
        "type": "keyword"
      },
      "playYear": {
        "type": "long"
      },
      "playerId": {
        "type": "keyword"
      },
      "position": {
        "type": "text"
      },
      "schoolType": {
        "type": "text"
      },
      "teamCity": {
        "type": "text"
      },
      "teamCityEn": {
        "type": "text"
      },
      "teamConference": {
        "type": "keyword"
      },
      "teamConferenceEn": {
        "type": "keyword"
      },
      "teamName": {
        "type": "keyword"
      },
      "teamNameEn": {
        "type": "keyword"
      },
      "weight": {
        "type": "text"
      }
    }
  }
}

將舊索引數據copy到新索引

同步等待,接口將會在reindex結束後返回

 

POST /_reindex
{
  "source": {
    "index": "nba"
  },
  "dest": {
    "index": "nba_20220810"
  }
}

異步執行,若是reindex時間過長,建議加上「wait_for_completion=false」的參數條件,這樣reindex將直接返回taskId

POST /_reindex?wait_for_completion=false
{
  "source": {
    "index": "nba"
  },
  "dest": {
    "index": "nba_20220810"
  }
}

替換別名

 

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "nba_20220810",
        "alias": "nba_latest"
      }
    },
    {
      "remove": {
        "index": "nba",
        "alias": "nba_latest"
      }
    }
  ]
}

刪除舊索引

DELETE /nba

經過別名訪問新索引

 

POST /nba_latest/_search
{
  "query": {
    "match": {
      "displayNameEn": "james"
    }
  }
}

ES之refresh操做

理想的搜索

  新的數據一添加到索引中立馬就能搜索到,可是真實狀況不是這樣的

咱們使用鏈式命令請求,先添加一個文檔,再馬上搜索

curl -X PUT 192.168.199.170:9200/star/_doc/888 -H 'Content-Type:
application/json' -d '{ "displayName": "蔡徐坤" }'
curl -X GET localhost:9200/star/_doc/_search?pretty

強制刷新

curl -X PUT 192.168.199.170:9200/star/_doc/666?refresh -H 'Content-Type:
application/json' -d '{ "displayName": "楊超越" }'
curl -X GET localhost:9200/star/_doc/_search?pretty

修改默認更新時間(默認時間是1s)

PUT /star/_settings
{
  "index": {
    "refresh_interval": "5s"
  }
}

將refresh關閉

PUT /star/_settings
{
  "index": {
    "refresh_interval": "-1"
  }
}

ES之高亮查詢

前言

  若是返回的結果集中不少符合條件的結果,那怎麼能一眼就能看到咱們想要的那個結果呢?好比下面網站所示的那樣,咱們搜索「科比」,在結果集中,將全部「科比」高亮顯示?

 

高亮查詢

 

POST /nba_latest/_search
{
  "query": {
    "match": {
      "displayNameEn": "james"
    }
  },
  "highlight": {
    "fields": {
      "displayNameEn": {}
    }
  }
}

自定義高亮查詢

POST /nba_latest/_search
{
  "query": {
    "match": {
      "displayNameEn": "james"
    }
  },
  "highlight": {
    "fields": {
      "displayNameEn": {
        "pre_tags": [
          "<h1>"
        ],
        "post_tags": [
          "</h1>"
        ]
      }
    }
  }
}

ES之查詢建議

查詢建議是什麼

  查詢建議:是爲了給用戶提供更好的搜索體驗。包括:詞條檢查,自動補全

詞條檢查

 

自動補全

 

Suggester

  • Term suggester
  • Phrase suggester
  • Completion suggester

字段

text 指定搜索文本
field 獲取建議詞的搜索字段
analyzer 指定分詞器
size 每一個詞返回的最大建議詞數
sort

如何對建議詞進行排序,可用選項:

score:先按評分排序、再按文檔頻率排、term順序

frequency:先按文檔頻率排,再按評分,term順序排

suggest_mode

建議模式,控制提供建議詞的方式:

missing:僅在搜索的詞項在索引中不存在時才提供建議詞,默認值;

popular:僅建議文檔頻率比搜索詞項高的詞

always:老是提供匹配的建議詞

Term Suggester

  term詞條建議器,對給輸入的文本進行分詞,爲每一個分詞提供詞項建議

POST /nba_latest/_search
{
  "suggest": {
    "my-suggestion": {
      "text": "jamse hardne",
      "term": {
        "suggest_mode": "missing",
        "field": "displayNameEn"
      }
    }
  }
}

Phrase suggester

  phrase短語建議,在term的基礎上,會考量多個term之間的關係,好比是否同時出如今索引的原文裏,相鄰成都,以及詞頻等

POST /nba_latest/_search
{
  "suggest": {
    "my-suggestion": {
      "text": "jamse harden",
      "phrase": {
        "field": "displayNameEn"
      }
    }
  }
}

Completion suggester

  Completion完成建議

POST /nba_latest/_search
{
  "suggest": {
    "my-suggestion": {
      "text": "Miam",
      "completion": {
        "field": "teamCityEn"
      }
    }
  }
}
相關文章
相關標籤/搜索