日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

分布式搜索引擎ElasticSearch(二)---ElasticSearch进阶使用教程

發(fā)布時(shí)間:2024/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式搜索引擎ElasticSearch(二)---ElasticSearch进阶使用教程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ElasticSearch

  • ElasticSearch進(jìn)階教程
    • 文檔批量操作
      • 批量獲取文檔數(shù)據(jù)
      • 批量操作文檔數(shù)據(jù)
    • DSL語(yǔ)言高級(jí)查詢(xún)
      • 無(wú)條件查詢(xún)
      • 有查詢(xún)條件
        • 葉子條件查詢(xún)(單字段查詢(xún)條件)
        • 組合條件查詢(xún)(多條件查詢(xún))
        • 連接查詢(xún)(多文檔合并查詢(xún))
        • 查詢(xún)DSL(query DSL)和過(guò)濾DSL(filter DSL)
      • Query方式查詢(xún)案例
    • 總結(jié)
    • 文檔映射
      • 動(dòng)態(tài)映射
      • 動(dòng)態(tài)映射
      • 靜態(tài)映射
    • 核心數(shù)據(jù)類(lèi)型
      • keyword 與 text 映射類(lèi)型的區(qū)別
      • 對(duì)已存在的mapping映射進(jìn)行修改
    • Elasticsearch樂(lè)觀并發(fā)控制

ElasticSearch進(jìn)階教程

文檔批量操作

多個(gè)文檔是指,批量操作多個(gè)文檔。

批量獲取文檔數(shù)據(jù)

通過(guò)_mget的API來(lái)實(shí)現(xiàn)的;

  • 在URL中不指定index和type
    請(qǐng)求方式:GET;
    請(qǐng)求地址:_mget;
    功能說(shuō)明 : 可以通過(guò)ID批量獲取不同index和type的數(shù)據(jù);
    請(qǐng)求參數(shù):
    1、 docs:文檔數(shù)組參數(shù)
    _index:指定index;
    _type:指定type;
    _id:指定id;
    _source:指定要查詢(xún)的手段;
GET _mget {"docs": [{"_index": "es_db","_type": "_doc","_id": 1},{"_index": "es_db","_type": "_doc","_id": 2}] }

  • 在URL中指定index
    請(qǐng)求方式:GET
    請(qǐng)求地址:/{{indexName}}/_mget
    功能說(shuō)明 : 可以通過(guò)ID批量獲取相同ndex索引庫(kù)不同type的數(shù)據(jù)
    請(qǐng)求參數(shù):docs 文檔數(shù)組參數(shù);
    _type : 指定type
    _id : 指定id
    _source : 指定要查詢(xún)的字段
GET /es_db/_mget {"docs": [{"_type": "_doc","_id": 3},{"_type": "_doc","_id": 4}] }

查找es_db索引庫(kù)下,type為_(kāi)doc中,id=3,4的文檔

  • 在URL中指定index和type
    請(qǐng)求方式:GET
    請(qǐng)求地址:/{{indexName}}/{{typeName}}/_mget
    功能說(shuō)明 : 可以通過(guò)ID批量獲取相同index和type的數(shù)據(jù)
    請(qǐng)求參數(shù):docs : 文檔數(shù)組參數(shù)
    _id : 指定id
    _source : 指定要查詢(xún)的字段
GET /es_db/_doc/_mget {"docs": [{"_id" : 1,"_source":"name"},{"_id": 3 ,"_source":"name"}] }

批量操作文檔數(shù)據(jù)

批量對(duì)文檔進(jìn)行寫(xiě)操作是通過(guò)_bulk的API來(lái)實(shí)現(xiàn)的
請(qǐng)求方式:POST
請(qǐng)求地址:_bulk
請(qǐng)求參數(shù):通過(guò)_bulk操作文檔,一般至少有兩行參數(shù)(或偶數(shù)行參數(shù))
第一行參數(shù)為指定操作的類(lèi)型及操作的對(duì)象(index,type和id);
第二行參數(shù)才是操作的數(shù)據(jù)

{"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}}{"field1":"value1", "field2":"value2"}

actionName:表示操作類(lèi)型,主要有create,index,delete和update

  • 批量創(chuàng)建文檔create
POST _bulk { "create": {"_index": "article","_type": "_doc", "_id": 3 }} { "id": 3,"title": "白起","content": "無(wú)敵","tags": [ "java", "面向?qū)ο?#34; ],"create_time": "1222222"} { "create": { "_index": "article", "_type": "_doc", "_id": 4 }} { "id": 4, "title": "玄霄", "content": "無(wú)敵","tags": [ "C", "面向?qū)ο?#34;], "create_time": "1333333"}

  • 普通創(chuàng)建或者全量替換index
    如果原文檔不存在,則是創(chuàng)建
    如果原文檔存在,則是替換(全量修改原文檔)
POST _bulk {"index":{"_index":"article","_type":"_doc","_id":3}} {"id":3,"title":"白起2","content":"無(wú)敵2","tags":["java2","面向?qū)ο?#34;],"create_time":"12222224"} {"index":{"_index":"article","_type":"_doc","_id":4}} {"id":4,"title":"玄霄2","content":"無(wú)敵2","tags":["C2","面向?qū)ο?#34;],"create_time":"13333334"}

修改操作:

POST _bulk {"index":{"_index":"article","_type":"_doc","_id":5}} {"id":5,"title":"白起5","content":"無(wú)敵2","tags":["java2","面向?qū)ο?#34;],"create_time":"12222224"} {"index":{"_index":"article","_type":"_doc","_id":6}} {"id":6,"title":"玄霄6","content":"無(wú)敵2","tags":["C2","面向?qū)ο?#34;],"create_time":"13333334"}

id不存在,則新創(chuàng)建;

  • 批量刪除delete
POST _bulk {"delete":{"_index":"article","_type":"_doc","_id":5}} {"delete":{"_index":"article","_type":"_doc","_id":6}}

  • 批量修改update
POST _bulk {"update":{"_index":"article","_type":"_doc","_id":3}} {"doc":{"content":"不滅天宮"}}

DSL語(yǔ)言高級(jí)查詢(xún)

  • Domain Specific Language:領(lǐng)域?qū)S谜Z(yǔ)言
  • Elasticsearch provides a ful1 Query DSL based on JSON to define
  • queries:Elasticsearch提供了基于JSON的DSL來(lái)定義查詢(xún)。
    DSL由葉子查詢(xún)子句和復(fù)合查詢(xún)子句兩種子句組成

無(wú)條件查詢(xún)

無(wú)查詢(xún)條件是查詢(xún)所有,默認(rèn)是查詢(xún)所有的,或者使用match_all表示所

GET /article/_doc/_search {"query":{"match_all":{}} } //相當(dāng)于select * from article/_doc ;

有查詢(xún)條件

葉子條件查詢(xún)(單字段查詢(xún)條件)

  • 模糊匹配
    模糊匹配主要是針對(duì)文本類(lèi)型的字段,文本類(lèi)型的字段會(huì)對(duì)內(nèi)容進(jìn)行分
    詞,對(duì)查詢(xún)時(shí),也會(huì)對(duì)搜索條件進(jìn)行分詞,然后通過(guò)倒排索引查找到匹
    配的數(shù)據(jù),模糊匹配主要通過(guò)match等參數(shù)來(lái)實(shí)現(xiàn);
    1)match : 通過(guò)match關(guān)鍵詞模糊匹配條件內(nèi)容
    2)prefix : 前綴匹配
    3)regexp : 通過(guò)正則表達(dá)式來(lái)匹配數(shù)據(jù);

  • match的復(fù)雜用法
    match條件還支持以下參數(shù):
    query : 指定匹配的值
    operator : 匹配條件類(lèi)型。and : 條件分詞后都要匹配;or : 條件分詞后有一個(gè)匹配即可(默認(rèn))
    minmum_should_match : 指定最小匹配的數(shù)量

  • 精確匹配
    term : 單個(gè)條件相等
    terms : 單個(gè)字段屬于某個(gè)值數(shù)組內(nèi)的值
    range : 字段屬于某個(gè)范圍內(nèi)的值
    exists : 某個(gè)字段的值是否存在
    ids : 通過(guò)ID批量查詢(xún)

組合條件查詢(xún)(多條件查詢(xún))

組合條件查詢(xún)是將葉子條件查詢(xún)語(yǔ)句進(jìn)行組合而形成的一個(gè)完整的查詢(xún)
條件;

  • bool : 各條件之間有and,or或not的關(guān)系;
    must : 各個(gè)條件都必須滿(mǎn)足,即各條件是and的
    關(guān)系
    should : 各個(gè)條件有一個(gè)滿(mǎn)足即可,即各條件
    是or的關(guān)系
    must_not : 不滿(mǎn)足所有條件,即各條件是not的
    關(guān)系
    filter : 不計(jì)算相關(guān)度評(píng)分,它不計(jì)算_score
    即相關(guān)度評(píng)分,效率更高
    constant_score : 不計(jì)算相關(guān)度評(píng)分
    must/filter/shoud/must_not 等的子條件是通
    過(guò) term/terms/range/ids/exists/match 等葉子條件為參數(shù)的

    注:以上參數(shù),當(dāng)只有一個(gè)搜索條件時(shí),must等對(duì)應(yīng)的是一個(gè)對(duì)象,當(dāng)
    是多個(gè)條件時(shí),對(duì)應(yīng)的是一個(gè)數(shù)組

連接查詢(xún)(多文檔合并查詢(xún))

父子文檔查詢(xún):parent/child
嵌套文檔查詢(xún): nested

查詢(xún)DSL(query DSL)和過(guò)濾DSL(filter DSL)

它們兩個(gè)的區(qū)別如下圖

  • query DSL
    在查詢(xún)上下文中,查詢(xún)會(huì)回答這個(gè)問(wèn)題——“這個(gè)文檔匹不匹配這個(gè)查詢(xún),它的
    相關(guān)度高么?”
    如何驗(yàn)證匹配很好理解,如何計(jì)算相關(guān)度呢?ES中索引的數(shù)據(jù)都會(huì)存儲(chǔ)一個(gè)
    _score分值,分值越高就代表越匹配。另外關(guān)于某個(gè)搜索的分值計(jì)算還是很復(fù)雜
    的,因此也需要一定的時(shí)間。
  • filter DSL
    在過(guò)濾器上下文中,查詢(xún)會(huì)回答這個(gè)問(wèn)題——“這個(gè)文檔匹不匹配?”
    答案很簡(jiǎn)單,是或者不是。它不會(huì)去計(jì)算任何分值,也不會(huì)關(guān)心返回的排序問(wèn)
    題,因此效率會(huì)高一點(diǎn)。
    過(guò)濾上下文 是在使用filter參數(shù)時(shí)候的執(zhí)行環(huán)境,比如在bool查詢(xún)中使用
    must_not或者filter
    另外,經(jīng)常使用過(guò)濾器,ES會(huì)自動(dòng)的緩存過(guò)濾器的內(nèi)容,這對(duì)于查詢(xún)來(lái)說(shuō),會(huì)提
    高很多性能。

Query方式查詢(xún)案例

  • 根據(jù)名稱(chēng)精確查詢(xún)姓名 term, term查詢(xún)不會(huì)對(duì)字段進(jìn)行分詞查詢(xún),會(huì)
    采用精確匹配
    注意: 采用term精確查詢(xún), 查詢(xún)字段映射類(lèi)型應(yīng)為keyword
    .
POST /es_db/_doc/_search {"query":{"term":{"name":"yaoxian"}} } // select * from student where name = 'admin'

  • 根據(jù)備注信息模糊查詢(xún) match, match會(huì)根據(jù)該字段的分詞器,進(jìn)行分
    詞查詢(xún)
POST /es_db/_doc/_search {"from":0,"size":2,"query":{"match":{"address":"廣州"}} } //select * from user where address like '%廣州%' limit 0, 2
  • 多字段模糊匹配查詢(xún)與精準(zhǔn)查詢(xún) multi_match
POST /es_db/_doc/_search {"query":{"multi_match":{"query":"yaoxian","fields":["address","name"]}} } //SQL: select * from student where name like '%張三%' or address like '%張%

  • 未指定字段條件查詢(xún) query_string , 含 AND 與 OR 條件
POST /es_db/_doc/_search {"from":0,"size":2,"query":{"query_string":{"query":"yaoxian OR yaoguai"}} }

  • 指定字段條件查詢(xún) query_string , 含 AND 與 OR 條件
POST /es_db/_doc/_search {"from":0,"size":2,"query":{"query_string":{"query":"yaoxian OR yaoguai","fields":["name","address"]}} }

  • 范圍查詢(xún)
    json請(qǐng)求字符串中部分字段的含義:
    range:范圍關(guān)鍵字;
    gte 大于等于;
    lte 小于等于;
    gt 大于;
    lt 小于;
    now 當(dāng)前時(shí)間;
POST /es_db/_doc/_search {"from":0,"size":2,"query":{"range":{"age":{"gte":16,"lte":50}}} } // select * from user where age between 25 and 2

在這里插入代碼片

  • 分頁(yè)、輸出字段、排序綜合查詢(xún)
POST /es_db/_doc/_search {"from":0,"size":2,"_source": ["name","age"],"sort":{"age":"desc"},"query":{"range":{"age":{"gte":0,"lte":50}}} }

  • Filter過(guò)濾器方式查詢(xún),它的查詢(xún)不會(huì)計(jì)算相關(guān)性分值,也不會(huì)對(duì)結(jié)果進(jìn)
    行排序, 因此效率會(huì)高一點(diǎn),查詢(xún)的結(jié)果可以被緩存。
    Filter Context 對(duì)數(shù)據(jù)進(jìn)行過(guò)濾
POST /es_db/_doc/_search {"from":0,"size":2,"query":{"bool":{"filter":{"term":{"name":"yaoxian"}}}} } // 查看名字是否為yaoxain

POST /es_db/_doc/_search {"from":0,"size":2,"query":{"bool":{"filter":{"query_string":{"query":"yaoxian OR yaoguai"}}}} }

總結(jié)

  • match
    match:模糊匹配,需要指定字段名,但是輸入會(huì)進(jìn)行分詞,比如"hello
    world"會(huì)進(jìn)行拆分為hello和world,然后匹配,如果字段中包含hello或者
    world,或者都包含的結(jié)果都會(huì)被查詢(xún)出來(lái),也就是說(shuō)match是一個(gè)部分匹配的模
    糊查詢(xún)
    。查詢(xún)條件相對(duì)來(lái)說(shuō)比較寬松。
  • term
    term: 這種查詢(xún)和match在有些時(shí)候是等價(jià)的,比如我們查詢(xún)單個(gè)的詞hello,那
    么會(huì)和match查詢(xún)結(jié)果一樣,但是如果查詢(xún)"hello world",結(jié)果就相差很大,因
    為這個(gè)輸入不會(huì)進(jìn)行分詞,就是說(shuō)查詢(xún)的時(shí)候,是查詢(xún)字段分詞結(jié)果中是否
    有"hello world"的字樣,而不是查詢(xún)字段中包含"hello world"的字樣。當(dāng)保存
    文本text數(shù)據(jù)"hello world"時(shí),elasticsearch會(huì)對(duì)字段內(nèi)容進(jìn)行分詞,“hello world"會(huì)被分成hello和world,不存在"hello world”,因此這里的查詢(xún)結(jié)果會(huì)為空。這也是term查詢(xún)和match的區(qū)別。
  • match_phase
    match_phase:會(huì)對(duì)輸入做分詞,但是需要結(jié)果中也包含所有的分詞,而且順序要求一樣。以"hello world"為例,要求結(jié)果中必須包含hello和world,而且還要求
    他們是連著的,順序也是固定的,hello that word不滿(mǎn)足,world hello也不滿(mǎn)
    足條件。
  • query_string
    query_string:和match類(lèi)似,但是match需要指定字段名,query_string是在所有字段中搜索范圍更廣泛。

文檔映射

ES中映射可以分為動(dòng)態(tài)映射和靜態(tài)映射

動(dòng)態(tài)映射

在關(guān)系數(shù)據(jù)庫(kù)中,需要事先創(chuàng)建數(shù)據(jù)庫(kù),然后在該數(shù)據(jù)庫(kù)下創(chuàng)建數(shù)據(jù)表,并創(chuàng)建
表字段、類(lèi)型、長(zhǎng)度、主鍵等,最后才能基于表插入數(shù)據(jù)。而Elasticsearch中不
需要定義Mapping映射(即關(guān)系型數(shù)據(jù)庫(kù)的表、字段等),在文檔寫(xiě)入
Elasticsearch時(shí),會(huì)根據(jù)文檔字段自動(dòng)識(shí)別類(lèi)型,這種機(jī)制稱(chēng)之為動(dòng)態(tài)映射。
動(dòng)態(tài)映射規(guī)則如下:

  • 靜態(tài)映射
    靜態(tài)映射是在Elasticsearch中也可以事先定義好映射,包含文檔的各字段類(lèi)
    型、分詞器等,這種方式稱(chēng)之為靜態(tài)映射。

動(dòng)態(tài)映射

  • 刪除原創(chuàng)建的索引
    DELETE /users
  • 創(chuàng)建索引
    PUT /users
  • 創(chuàng)建文檔(ES根據(jù)數(shù)據(jù)類(lèi)型, 會(huì)自動(dòng)創(chuàng)建映射)
PUT /users/_doc/1 {"name":"tom","age":20,"sex":1,"book":"java","address":"廣州" }
  • 獲取文檔映射
    Get /users/_mapping

靜態(tài)映射

  • 刪除原創(chuàng)建的索引
DELETE /users
  • 創(chuàng)建索引
    PUT /users2

  • 設(shè)置文檔映射

PUT /users2 {"mappings": {"properties": {"name":{"type":"keyword","index": true,"store": true},"address":{"type":"text","index": true,"store": true},"book":{"type":"text","index": true,"store": true},"age":{"type": "integer","index": true,"store": true},"sex":{"type": "integer","index": true,"store": true}}} }
  • 根據(jù)靜態(tài)映射創(chuàng)建文檔
PUT /users2/_doc/1 {"name":"tom","age":20,"sex":1,"book":"java","address":"廣州" }

  • 獲取文檔映射
    GET /users2/_mapping

核心數(shù)據(jù)類(lèi)型

  • 字符串:string,string類(lèi)型包含 text 和 keyword。
    text:該類(lèi)型被用來(lái)索引長(zhǎng)文本,在創(chuàng)建索引前會(huì)將這些文本進(jìn)行分詞,轉(zhuǎn)化為
    詞的組合,建立索引;允許es來(lái)檢索這些詞,text類(lèi)型不能用來(lái)排序和聚合。
    keyword:該類(lèi)型不能分詞,可以被用來(lái)檢索過(guò)濾、排序和聚合,keyword類(lèi)型不
    可用text進(jìn)行分詞模糊檢索。
  • 數(shù)值型:long、integer、short、byte、double、float
  • 日期型:date
  • 布爾型:boolean

keyword 與 text 映射類(lèi)型的區(qū)別

name字段為 keyword 映射 (只能精準(zhǔn)查詢(xún), 不能分詞查詢(xún),能聚合、
排序)

POST /users2/_doc/_search {"from":0,"size":2,"query":{"term":{"name":"xian"}} }


book 字段為 text 映射能模糊查詢(xún), 能分詞查詢(xún),不能聚合、排序)

POST /users2/_doc/_search {"query":{"match":{"book":"泛型 java"}} }

對(duì)已存在的mapping映射進(jìn)行修改

具體方法
1)如果要推倒現(xiàn)有的映射, 你得重新建立一個(gè)靜態(tài)索引
2)然后把之前索引里的數(shù)據(jù)導(dǎo)入到新的索引里
3)刪除原創(chuàng)建的索引
4)為新索引起個(gè)別名, 為原索引名

POST _reindex {"source": {"index": "users2"},"dest": {"index": "users"} }

我們需要先創(chuàng)建一個(gè)新的索引映射users,再將users2的數(shù)據(jù)轉(zhuǎn)移到users中。

通過(guò)這幾個(gè)步驟就實(shí)現(xiàn)了索引的平滑過(guò)渡,并且是零停機(jī),不需要去重啟服務(wù)器,只需要在客戶(hù)端進(jìn)行命令操作即可。

Elasticsearch樂(lè)觀并發(fā)控制

在數(shù)據(jù)庫(kù)領(lǐng)域中,有兩種方法來(lái)確保并發(fā)更新,不會(huì)丟失數(shù)據(jù):

  • 悲觀并發(fā)控制
    這種方法被關(guān)系型數(shù)據(jù)庫(kù)廣泛使用,它假定有變更沖突可能發(fā)生,因此阻塞訪問(wèn)
    資源以防止沖突。 一個(gè)典型的例子是讀取一行數(shù)據(jù)之前先將其鎖住,確保只有放
    置鎖的線程能夠?qū)@行數(shù)據(jù)進(jìn)行修改。
  • 樂(lè)觀并發(fā)控制
    Elasticsearch 中使用的這種方法假定沖突是不可能發(fā)生的,并且不會(huì)阻塞正在
    嘗試的操作。 然而,如果源數(shù)據(jù)在讀寫(xiě)當(dāng)中被修改,更新將會(huì)失敗。應(yīng)用程序接
    下來(lái)將決定該如何解決沖突。 例如,可以重試更新、使用新的數(shù)據(jù)、或者將相關(guān)
    情況報(bào)告給用戶(hù)。
    3、再以創(chuàng)建一個(gè)文檔為例
  • ES老版本(7.0之前)
PUT /users2/_doc/4 {"name":"daxia","age":20,"sex":1,"book":"java進(jìn)階線程","address":"廣州" }

實(shí)現(xiàn)_version樂(lè)觀鎖更新文檔

PUT /users2/_doc/4?version=1 {"name":"daxia","age":20,"sex":1,"book":"java進(jìn)階線程","address":"廣州" }
  • ES新版本不使用version進(jìn)行并發(fā)版本控制 if_seq_no=版本值
    &if_primary_term=文檔位置
    _seq_no:文檔版本號(hào),作用同_version
    _primary_term:文檔所在位置
PUT /users2/_doc/4 {"name":"dalao","age":20,"sex":1,"book":"java進(jìn)階線程","address":"廣州" } //先修改一下數(shù)據(jù),使版本號(hào)+1, POST /users2/_doc/4/?if_seq_no=6&if_primary_term=1 {"doc":{"book":"C++"} } //如果版本號(hào)等于6,則修改成功,如果不等于6,則修改失敗 //再執(zhí)行同樣操作,更新失敗;

總結(jié)

以上是生活随笔為你收集整理的分布式搜索引擎ElasticSearch(二)---ElasticSearch进阶使用教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。