前言
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
brownrabbits", "body": "Brownrabbits are commonly seen."}(2) { "title": "Keeping pets healthy", "body": "My quick
brownfoxeats 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"}