1.數(shù)據(jù)類型
- 結構化數(shù)據(jù)
二維表等,保存到關系型數(shù)據(jù)庫中例如mysql
- 非結構化數(shù)據(jù)
圖像、視頻、工作日志等,保存到Nosql數(shù)據(jù)庫中,比如redis、mongodb中
- 半結構化數(shù)據(jù)
html、xml等保存到Nosql數(shù)據(jù)庫中,比如redis、mongodb中
2.Elasticsearch是什么
The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash(也稱為 ELK Stack)。能夠安全可靠地獲取任何來源、任何格式的數(shù)據(jù),然后實時地對數(shù)據(jù)進行搜索、分析和可視化。Elaticsearch,簡稱為 ES, ES 是一個開源的高擴展的分布式全文搜索引擎
, 是整個 ElasticStack 技術棧的核心。它可以近乎實時的存儲、檢索數(shù)據(jù);本身擴展性很好,可以擴展到上百臺服務器,處理 PB 級別的數(shù)據(jù)。
3.全文搜索引擎
??Google,百度類的網(wǎng)站搜索,它們都是根據(jù)網(wǎng)頁中的關鍵字生成索引,我們在搜索的時候輸入關鍵字,它們會將該關鍵字即索引匹配到的所有網(wǎng)頁返回;還有常見的項目中應用日志的搜索等等。對于這些非結構化的數(shù)據(jù)文本,關系型數(shù)據(jù)庫搜索不是能很好的支持。
??一般傳統(tǒng)數(shù)據(jù)庫,全文檢索都實現(xiàn)的很雞肋,因為一般也沒人用數(shù)據(jù)庫存文本字段。進行全文檢索需要掃描整個表,如果數(shù)據(jù)量大的話即使對 SQL 的語法優(yōu)化,也收效甚微。建立了索引,但是維護起來也很麻煩,對于 insert 和 update 操作都會重新構建索引。
??基于以上原因可以分析得出,在一些生產(chǎn)環(huán)境中,使用常規(guī)的搜索方式,性能是非常差的:
- 搜索的數(shù)據(jù)對象是大量的非結構化的文本數(shù)據(jù)。
- 文件記錄量達到數(shù)十萬或數(shù)百萬個甚至更多。
- 支持大量基于交互式文本的查詢。
- 需求非常靈活的全文搜索查詢。
- 對高度相關的搜索結果的有特殊需求,但是沒有可用的關系數(shù)據(jù)庫可以滿足。
- 對不同記錄類型、非文本數(shù)據(jù)操作或安全事務處理的需求相對較少的情況。為了解決結構化數(shù)據(jù)搜索和非結構化數(shù)據(jù)搜索性能問題,我們就需要專業(yè),健壯,強大的全文搜索引擎 。
??這里說到的全文搜索引擎指的是目前廣泛應用的主流搜索引擎。它的工作原理是計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當用戶查詢時,檢索程序就根據(jù)事先建立的索引進行查找,并將查找的結果反饋給用戶的檢索方式。這個過程類似于通過字典中的檢索字表查字的過程。
4.Elasticsearch安裝
Elasticsearch官網(wǎng)
Elasticsearch官方文檔
Elasticsearch目錄結構
目錄 | 含義 |
---|---|
bin | 可執(zhí)行腳本目錄 |
config | 配置目錄 |
jdk | 內(nèi)置 JDK 目錄 |
lib | 類庫 |
logs | 日志目錄 |
modules | 模塊目錄 |
plugins | 插件目錄 |
進入bin文件點擊elasticsearch.bat啟動elasticsearch
注意:
9300
端口為 Elasticsearch 集群間組件的通信端口,9200
端口為瀏覽器訪問的 http協(xié)議 RESTful 端口。
打開瀏覽器,輸入地址: http://localhost:9200
,測試返回結果,返回結果如下:
5.Restful和JSON
??REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。 Web 應用程序最重要的 REST 原則是,客戶端和服務器之間的交互在請求之間是無狀態(tài)的。從客戶端到服務器的每個請求都必須包含理解請求所必需的信息。如果服務器在請求之間的任何時間點重啟,客戶端不會得到通知。此外,無狀態(tài)請求可以由任何可用服務器回答,這十分適合云計算之類的環(huán)境??蛻舳丝梢跃彺鏀?shù)據(jù)以改進性能。
??在服務器端,應用程序狀態(tài)和功能可以分為各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應用程序對象、數(shù)據(jù)庫記錄、算法等等。每個資源都使用 URI(Universal Resource Identifier) 得到一個唯一的地址。所有資源都共享統(tǒng)一的接口,以便在客戶端和服務器之間傳輸狀態(tài)。使用的是標準的 HTTP 方法,比如 GET、 PUT、 POST 和DELETE。
??在 REST 樣式的 Web 服務中,每個資源都有一個地址。資源本身都是方法調(diào)用的目
標,方法列表對所有資源都是一樣的。這些方法都是標準方法,包括 HTTP GET、 POST、PUT、 DELETE,還可能包括 HEAD 和 OPTIONS。簡單的理解就是,如果想要訪問互聯(lián)網(wǎng)上的資源,就必須向資源所在的服務器發(fā)出請求,請求體中必須包含資源的網(wǎng)絡路徑, 以及對資源進行的操作(增刪改查)。
??REST 樣式的 Web 服務若有返回結果,大多數(shù)以JSON字符串形式返回。
JSON格式
var obj = {"name":"zhangsan","age":30,"info":{"email":"xxxxx"}}//對象
var objs=[obj,obj]//集合
JSON字符串:網(wǎng)絡中傳遞的字符串的格式符合JSON格式
6.Postman客戶端工具
Postman下載官網(wǎng)
??如果直接通過瀏覽器向 Elasticsearch 服務器發(fā)請求,那么需要在發(fā)送的請求中包含
HTTP 標準的方法,而 HTTP 的大部分特性且僅支持 GET 和 POST 方法。所以為了能方便地進行客戶端的訪問,可以使用 Postman 軟件。
??Postman 是一款強大的網(wǎng)頁調(diào)試工具,提供功能強大的 Web API 和 HTTP 請求調(diào)試。軟件功能強大,界面簡潔明晰、操作方便快捷,設計得很人性化。 Postman 中文版能夠發(fā)送任何類型的 HTTP 請求 (GET, HEAD, POST, PUT…),不僅能夠表單提交,且可以附帶任意類型請求體。
7.倒排索引
??Elasticsearch 是面向文檔型數(shù)據(jù)庫,一條數(shù)據(jù)在這里就是一個文檔。 為了方便大家理解,我們將 Elasticsearch 里存儲文檔數(shù)據(jù)和關系型數(shù)據(jù)庫 MySQL 存儲數(shù)據(jù)的概念進行一個類比
??ES 里的 Index 可以看做一個庫,而 Types 相當于表, Documents 則相當于表的行。這里 Types 的概念已經(jīng)被逐漸弱化, Elasticsearch 6.X 中,一個 index 下已經(jīng)只能包含一個type, Elasticsearch 7.X 中, Type 的概念已經(jīng)被刪除了。
正排(正向)索引
id | content |
---|---|
1001 | my name is zhangsan |
1002 | my name is lisi |
如果想要查詢文章的內(nèi)容中包含哪些熱門詞匯,就會比較麻煩,需要使用模糊查詢,模糊查詢的效率會差很多,每條數(shù)據(jù)都要遍歷一下會導致性能差并且查詢內(nèi)容的大小寫、時態(tài)等等都會影響查詢的準確率。例如你查詢Zhang san那1001的內(nèi)容是匹配還是不匹配?
倒排索引
keyword | id |
---|---|
name | 1001,1002 |
zhang | 1001 |
通過關鍵字來查詢主鍵id,然后再來關聯(lián)文章內(nèi)容,以前是通過主鍵id關聯(lián)文章內(nèi)容再去找關鍵字
8.Elasticsearch基本操作
8.1 索引操作
8.1.1 創(chuàng)建索引
對比關系型數(shù)據(jù)庫,創(chuàng)建索引就等同于創(chuàng)建數(shù)據(jù)庫。
在 Postman 中,向 ES 服務器發(fā)送PUT請求命令
PUT 請求
命令::http://localhost:9200/shopping
PUT請求相當于創(chuàng)建的意思,這里表示創(chuàng)建一個shopping的索引
問題: 如果這個時候再去發(fā)送請求會怎么樣?
答案: PUT具有冪等性,只要發(fā)出了同樣的請求,結果是一樣的,意味著你再去發(fā)送一個請求就會有問題,因為此時已經(jīng)有了shopping這個索引,不需要再添加了。
8.1.2查詢索引
1.查詢指定索引
Get 請求
命令::http://localhost:9200/shopping
2.查詢所有索引
GET請求
命令::http://localhost:9200/_cat/indices?v
8.1.3刪除索引
DELTE請求
命令::http://localhost:9200/shopping
8.2 文檔操作
8.2.1 創(chuàng)建文檔
假設索引已經(jīng)創(chuàng)建好了,接下來我們來創(chuàng)建文檔,并添加數(shù)據(jù)。這里的文檔可以類比為關系型數(shù)據(jù)庫中的表數(shù)據(jù),添加的數(shù)據(jù)格式為 JSON 格式
POST請求
命令::http://localhost:9200/shopping/_doc
此時報錯,提示請求體是一定要有的,所以要在body中加入內(nèi)容
{
"title":"小米手機",
"category":"小米",
"images":"http://www.gulixueyuan.com/xm.jpg",
"price":3999.00
}
??"_id": "G5SouIUB5Q51kdfNH1A6"
為數(shù)據(jù)的唯一性標識類似于主鍵,由es軟件隨機生成的,同樣的請求返回的結果是不同的,所以POST不具有冪等性
,但是PUT必須是冪等性的
,所以用PUT請求會報錯。
8.2.2 創(chuàng)建文檔時自定義id
POST請求
命令::http://localhost:9200/shopping/_doc/自己定義的id
此時指定了id那就說明這個操作是冪等性的,此時PUT也是可以的。
8.2.3 查詢文檔
1.主鍵查詢
Get 請求
命令::http://localhost:9200/shopping/_doc/1001
2.查詢一個不存在的id
3.全查詢
Get 請求
命令::http://localhost:9200/shopping/_search
8.2.4 修改文檔
1.全量修改
PUT 請求
命令::http://localhost:9200/shopping/_doc/1001
2.局部修改
因為更新局部的數(shù)據(jù),說明每次更新的結果不會是相同的,那就不是冪等性的,所以不能采用PUT方式,只能采用POST方式
POST請求
命令::http://localhost:9200/shopping/_update/1001
{
"doc":{
"title":"蘋果手機"
}
}
查詢得到的結果
8.2.5 刪除文檔
DELETE請求
命令::http://localhost:9200/shopping/_doc/1001
8.2.6 復雜查詢操作
1.條件查詢
Get 請求
命令::http://localhost:9200/shopping/_search?q=category:小米
請求路徑中添加額外參數(shù)比較麻煩,而且中文容易出現(xiàn)亂碼,一般會將請求路徑調(diào)整為請求體傳遞參數(shù)
{
"query":{
"match":{
"category":"小米"
}
}
}
2.全量查詢(請求體類型)
3.分頁查詢
from:表述當前頁數(shù)據(jù)查詢的起始位置,如果是第一條的話應該是0
起始位置的計算公式:(頁碼-1)*每頁數(shù)據(jù)條數(shù)
想查詢第二頁,頁碼就為2
size:表述每頁查詢的數(shù)據(jù)條數(shù)
想要的數(shù)據(jù)指定查詢
對結果排序
4.多條件查詢
{
"query": {
//bool表示條件
"bool": {
//"must"表示多個條件要同時成立
"must":[
{
"match":{
"category": "小米"
}
},
{
"match":{
"price": 3999.00
}
}
]
}
}
}
1.should是或的關系
{
"query": {
"bool": {
"should":[
{
"match":{
"category": "小米"
}
},
{
"match":{
"category": "蘋果"
}
}
]
}
}
}
2.想要查詢價格大于3000的
{
"query": {
"bool": {
"should": [
{
"match": {
"category": "小米"
}
},
{
"match": {
"category": "蘋果"
}
}
],
"filter": {
"range": {
"price": {
"gt": 3000
}
}
}
}
}
}
3.全文檢索
為什么輸入一個小也能查詢到?
當保存文檔數(shù)據(jù)時候,es會將數(shù)據(jù)文字進行分詞拆解操作,并將拆解后的數(shù)據(jù)保存到倒排索引當中,這樣即使使用文字的一部分也能查詢到數(shù)據(jù)。
es會將查詢內(nèi)容也進行分詞操作,在倒排索引中進行匹配,例如拿小蘋查詢,蘋果和小米都會查詢到
4.完全匹配
{
"query":{
"match_phrase":{
"title":"小蘋"
}
}
}
此時去查詢數(shù)據(jù)時完全匹配規(guī)則,數(shù)據(jù)會查不到因為沒有title叫小蘋
5.高亮查詢
{
"query":{
"match_phrase":{
"category":"小米"
}
},
"highlight":{
"fields":{
"category":{}
}
}
}
6.聚合查詢
{
//聚合操作
"aggs":{
"price_group":{//名稱,隨意取
"terms":{//分組操作
"field":"price"//分組字段
}
}
}
}
此時存在原始數(shù)據(jù)
加上"size":0,原始數(shù)據(jù)就沒有了,只有統(tǒng)計數(shù)據(jù)
{
//聚合操作
"aggs":{
"price_group":{//名稱,隨意取
"terms":{//分組操作
"field":"price"//分組字段
}
}
},
"size":0
}
也可以求平均值
7.映射關系
有的查詢可以分詞查詢,有的查詢不可以分詞查詢,那怎么控制呢?
先創(chuàng)建一個user索引
創(chuàng)建結構信息
{
"properties":{
"name":{
"type":"text",//text類型可以分詞
"index":true//name字段可以被索引查詢
},
"sex":{
"type":"keyword",//keyword不可以分詞
"index":true//sex字段可以被索引查詢
},
"tel":{
"type":"keyword",//keyword不可以分詞
"index":false//tel字段可以被索引查詢
}
}
}
增加數(shù)據(jù)
查詢姓名
可以查到說明剛才查詢的name是具有分詞效果的
查詢性別
我這里只有一個男所以沒法演示,案例中性別是男的,查詢男,查不到所以說明keyword是沒法模糊匹配的文章來源:http://www.zghlxwxcb.cn/news/detail-754991.html
查詢電話
說明電話是沒有被索引的所以不支持查詢文章來源地址http://www.zghlxwxcb.cn/news/detail-754991.html
到了這里,關于【ElasticSearch01】ElasticSearch入門的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!