ElasticSearch學(xué)習(xí)筆記(1)——基本語法

前言

ES權(quán)威指南


1.Java交互

1.1 節(jié)點客戶端(Node client)

節(jié)點客戶端作為一個非數(shù)據(jù)節(jié)點加入到本地集群中。換句話說,它本身不保存任何數(shù)據(jù),但是它知道數(shù)據(jù)在集群中的哪個節(jié)點中,并且可以把請求轉(zhuǎn)發(fā)到正確的節(jié)點。

1.2 傳輸客戶端(Transport client)

輕量級的傳輸客戶端可以可以將請求發(fā)送到遠(yuǎn)程集群。它本身不加入集群,但是它可以將請求轉(zhuǎn)發(fā)到集群中的一個節(jié)點上。

1.3 spring-data-elasticsearch

與Spring框架整合,可以使用java鏈?zhǔn)斤L(fēng)格構(gòu)建語句或者使用Json請求,構(gòu)建index可以使用注解方式或模版方式。


2.REST API


3.深入搜索

3.1 term/terms 包含搜索 : 處理數(shù)字(numbers)、布爾值(Booleans)、日期(dates)、文本(text)

-{ "term" : { "price" : 20 }}

-{"terms" : { "price" : [20, 30] }}

3.2 bool過濾器 : must、should、must_not

-{ "bool" : { "must" : [], "should" : [], "must_not" : [] }}

-{ "query": { "bool": { "should": [ { "match": { "title": "brown" }}, { "match": { "title": "fox" }}, { "match": { "title": "dog" }} ], "minimum_should_match": 2 } }} //minimum_should_match控制should中多少條件需要被滿足,可以是數(shù)字可以是百分比,百分比會自動截斷

-{"should": [ { "match": { "content": { "query": "Elasticsearch", "boost": 3 } }}, { "match": { "content": { "query": "Lucene", "boost": 2 } }} ]} //boost用來控制條件的權(quán)重

3.3 range 范圍搜索 :?

在倒排索引中的詞項就是采取字典順序(lexicographically)排列的,這也是字符串范圍可以使用這個順序來確定的原因

-"range" :{ "price" : { "gte" : 20, "lte" : 40 }}

-"range" : { "title" : { "gte" : "a", "lt" : "b" }}

3.4?exists、missing 處理null

-{ "exists" : { "field" : "tags" } } //tags字段不為null的

-{ "missing" : { "field" : "tags" } } //tags字段為null的,es5.x廢棄

判斷一個對象是否為null時,相當(dāng)于做一個bool判斷

-{ "name" : { "first" : "John", "last" : "Smith" }}?

-{ "exists" : { "field" : "name" }}

-{ "bool": { "should": [ { "exists": { "field": "name.first" }}, { "exists": { "field": "name.last" }} ] }}

3.5?match 高層查詢

-{"match": { "title": "QUICK!" }} //單詞查詢

-{"match": { "title": { "query": "BROWN DOG!"} }} //多詞查詢默認(rèn)是包含關(guān)系,即brown/dog

-{"match": { "title": { "query": "BROWN DOG!", "operator": "and" }}} // 多詞查詢精確匹配

-{"match": { "title": { "query": "quick brown dog", "minimum_should_match": "75%" }}} // 控制匹配精度,這里會自動截斷成66.66%,匹配包含2個詞以上的文檔

Elasticsearch 執(zhí)行上面這個 match 查詢的步驟是:

1) 檢查字段類型。如果標(biāo)題 title 字段是一個 string 類型( analyzed )已分析的全文字段,這意味著查詢字符串本身也應(yīng)該被分析。

2) 分析查詢字符串。將查詢的字符串 QUICK! 傳入標(biāo)準(zhǔn)分析器中,輸出的結(jié)果是單個項 quick 。因為只有一個單詞項,所以 match 查詢執(zhí)行的是單個底層 term 查詢。

3) 查找匹配文檔。用 term 查詢在倒排索引中查找 quick 然后獲取一組包含該項的文檔。

4) 為每個文檔評分。用 term 查詢計算每個文檔相關(guān)度評分 _score ,這是種將詞頻(term frequency,即詞 quick 在相關(guān)文檔的 title 字段中出現(xiàn)的頻率)和反向文檔頻率(inverse document frequency,即詞 quick 在所有文檔的 title 字段中出現(xiàn)的頻率),以及字段的長度(即字段越短相關(guān)度越高)相結(jié)合的計算方式。

PS:Elasticsearch 的相似度算法被定義為檢索詞頻率/反向文檔頻率,TF/IDF,包括以下內(nèi)容:

1)檢索詞頻率。檢索詞在該字段出現(xiàn)的頻率,出現(xiàn)頻率越高,相關(guān)性也越高。 字段中出現(xiàn)過 5 次要比只出現(xiàn)過 1 次的相關(guān)性高。

2)反向文檔頻率。每個檢索詞在索引中出現(xiàn)的頻率,頻率越高,相關(guān)性越低。檢索詞出現(xiàn)在多數(shù)文檔中會比出現(xiàn)在少數(shù)文檔中的權(quán)重更低。

3)字段長度準(zhǔn)則。字段的長度是多少,長度越長,相關(guān)性越低。 檢索詞出現(xiàn)在一個短的 title 要比同樣的詞出現(xiàn)在一個長的 content 字段權(quán)重更大。

3.6?analyzer 分析器

1)查詢自己定義的?analyzer?,否則

2)字段映射里定義的?search_analyzer?,否則

3)字段映射里定義的?analyzer?,否則

4)索引設(shè)置中名為?default_search?的分析器,默認(rèn)為

5)索引設(shè)置中名為?default?的分析器,默認(rèn)為

6)standard?標(biāo)準(zhǔn)分析器

3.7 dis_max 分離最大化查詢:將任何與任一查詢匹配的文檔作為結(jié)果返回,但只將最佳匹配的評分作為查詢的評分結(jié)果返回,比如針對如下文檔

(1) { "title": "Quick brown rabbits", "body": "Brown rabbits are commonly seen."}

(2) { "title": "Keeping pets healthy", "body": "My quick brown fox eats rabbits on a regular basis."}

使用bool查詢,(1)文檔匹配中兩個,兩個評分相加然后除以子查詢個數(shù)(這里為2),(2)文檔匹配中一個,兩個評分相加然后除以子查詢個數(shù)(這里為2),所以(1)文檔評分會高一點

{ "query": { "bool": { "should": [ { "match": { "title": "Brown fox" }}, { "match": { "body": "Brown fox" }} ] } }}

使用dis_max查詢,(1)文檔匹配中兩個,兩個評分相加然后除以子查詢個數(shù)(這里為2),(2)文檔匹配中一個,只有該評分參與最終評分的計算,所以(2)文檔評分會高一點

{ "query": { "dis_max": { "queries": [ { "match": { "title": "Brown fox" }}, { "match": { "body": "Brown fox" }} ] } }}?

PS:tie_breaker(0到1之間的數(shù)),提供了一種 dis_max 和 bool 之間的折中選擇,它的評分方式如下:(1) 獲得最佳匹配語句的評分 _score;(2)將其他匹配語句的評分結(jié)果與 tie_breaker 相乘;(3)對以上評分求和并規(guī)范化。

{ "query": { "dis_max": { "queries": [ { "match": { "title": "Quick pets" }}, { "match": { "body": "Quick pets" }} ], "tie_breaker": 0.3 } }}

3.8 multi_match 多字段查詢,支持正則表達(dá)式(可以使用?^?字符語法為單個字段提升權(quán)重)

{ "multi_match": { "query": "Quick brown fox", "fields": [ "*_title", "chapter_title^2" ] } }

使用"type": "most_fields"將所有匹配字段的評分合并起來

{ "query": { "multi_match": { "query": "jumping rabbits", "type": "most_fields", "fields": [ "title", "title.std" ] } }}

3.9?copy_to?自定義 _all 字段解決跨字段查詢問題

{ "mappings": { "person": { "properties": { "first_name": { "type": "string", "copy_to": "full_name" }, "last_name": { "type": "string", "copy_to": "full_name" }, "full_name": { "type": "string" } } } }}

3.10 sort 排序

{"sort": {"date": {"order":"desc"}}}?

{"sort": [ { "date": { "order": "desc" }}, { "_score": { "order": "desc" }} ]} //多級排序

{"sort": { "dates": { "order": "asc", "mode": "min" }}} //使用min,avg,max,sum模式

對analyzed字段字符串進(jìn)行強制排序會消耗大量內(nèi)存,可以使用多值字段字符串進(jìn)行排序

"tweet": {

? "type": "string",?

?"analyzer": "english",

?"fields": { "raw": { "type": "string", "index": "not_analyzed" } }

}

=>{"sort": "tweet.raw"}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容