首頁歷史 > 正文

玩轉elastic search的搜尋

2022-11-29由 dz菜園子 發表于 歷史

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 “localhost:9200/_bulk” -H ‘Content-Type: application/json’ ——data-binary @name

es之term的多種查詢

介紹

單詞級別查詢

這些查詢通常⽤於結構化的資料,⽐如:number, date, keyword等,⽽不是對text。

也就是說,全⽂本查詢之前要先對⽂本內容進⾏分詞,⽽單詞級別的查詢直接在相應欄位的反向索引中精確查詢,單詞級別的查詢⼀般⽤於數值、⽇期等型別的欄位上

準備⼯作

刪除nba索引

新增nba索引

PUT 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⽂件)

連結:https://pan。baidu。com/s/13Uahu1FxKiY6nfRYeY4Myw

提取碼:t2qb

Term query 精準匹配查詢(查詢號碼為23的球員)

POST nba/_search{ “query”: { “term”: { “jerseyNo”: “23” } }}

Exsit Query 在特定的欄位中查詢非空值的⽂檔(查詢隊名非空的球員)

POST nba/_search{ “query”: { “exists”: { “field”: “teamNameEn” } }}

Prefix Query 查詢包含帶有指定字首term的⽂檔(查詢隊名以Rock開頭的球員)

POST nba/_search{ “query”: { “prefix”: { “teamNameEn”: “Rock” } }}

Wildcard Query 支援萬用字元查詢,*表示任意字元,?表示任意單個字元(查詢火箭隊的球員)

POST nba/_search{ “query”: { “wildcard”: { “teamNameEn”: “Ro*s” } }}

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

POST nba/_search{ “query”: { “regexp”: { “teamNameEn”: “Ro。*s” } }}

Ids Query(查詢id為1和2的球員)

POST nba/_search{ “query”: { “ids”: { “values”: [ 1, 2 ] } }}

玩轉es的範圍查詢

查詢指定欄位在指定範圍內包含值(日期、數字或字串)的文件。

查詢在nba打了2年到10年以內的球員

POST nba/_search{ “query”: { “range”: { “playYear”: { “gte”: 2, “lte”: 10 } } }}

查詢1980年到1999年出⽣的球員

POST nba/_search{ “query”: { “range”: { “birthDay”: { “gte”: “01/01/1999”, “lte”: “2022”, “format”: “dd/MM/yyyy||yyyy” } } }}

玩轉es的布林查詢

布林查詢

type

description

must

必須出現在匹配⽂檔中

filter

必須出現在⽂檔中,但是不打分

must_not

不能出現在⽂檔中

should

應該出現在⽂檔中

must (查詢名字叫做James的球員)

POST /nba/_search{ “query”: { “bool”: { “must”: [ { “match”: { “displayNameEn”: “james” } } ] } }}

效果同must,但是不打分(查詢名字叫做James的球員)

POST /nba/_search{ “query”: { “bool”: { “filter”: [ { “match”: { “displayNameEn”: “james” } } ] } }}

must_not (查詢名字叫做James的⻄部球員)

POST /nba/_search{ “query”: { “bool”: { “must”: [ { “match”: { “displayNameEn”: “james” } } ], “must_not”: [ { “term”: { “teamConferenceEn”: { “value”: “Eastern” } } } ] } }}

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 } } } ] } }}

如果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 } }}

玩轉es的排序查詢

⽕箭隊中按打球時間從⼤到⼩排序的球員

POST nba/_search{ “query”: { “match”: { “teamNameEn”: “Rockets” } }, “sort”: [ { “playYear”: { “order”: “desc” } } ]}

⽕箭隊中按打球時間從⼤到⼩,如果年齡相同則按照身⾼從⾼到低排序的球員

POST nba/_search{ “query”: { “match”: { “teamNameEn”: “Rockets” } }, “sort”: [ { “playYear”: { “order”: “desc” } }, { “heightValue”: { “order”: “asc” } } ]}

玩轉es聚合查詢之指標聚合

ES聚合分析是什麼

聚合分析是資料庫中重要的功能特性,完成對⼀個查詢的資料集中資料的聚合計算,如:找出某欄位(或計算表示式的結果)的最⼤值、最⼩值,計算和、平均值等。ES作為搜尋引擎兼資料庫,同樣提供了強⼤的聚合分析能⼒。

對⼀個數據集求最⼤、最⼩、和、平均值等指標的聚合,在ES中稱為指標聚合

⽽關係型資料庫中除了有聚合函式外,還可以對查詢出的資料進⾏分組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/_count{ “query”: { “term”: { “teamNameEn”: { “value”: “Rockets” } } }}

Cardinality 值去重計數

查出⽕箭隊中年齡不同的數量

POST /nba/_search{ “query”: { “term”: { “teamNameEn”: { “value”: “Rockets” } } }, “aggs”: { “counAget”: { “cardinality”: { “field”: “age” } } }, “size”: 0}

stats 統計count max min avg sum 5個值

查出⽕箭隊球員的年齡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”: { “percentAge”: { “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{ “aggs”: { “aggsTeamName”: { “terms”: { “field”: “teamNameEn”, “size”: 30, “order”: { “avgAge”: “desc” } }, “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 }, { “from”: 35 } ] } } }, “size”: 0}

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

POST /nba/_search{ “aggs”: { “ageRange”: { “range”: { “field”: “age”, “ranges”: [ { “to”: 20, “key”: “A” }, { “from”: 20, “to”: 35, “key”: “B” }, { “from”: 35, “key”: “C” } ] } } }, “size”: 0}

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}

指定多個欄位查詢

POST /nba/_search{ “query”: { “query_string”: { “fields”: [ “displayNameEn”, “teamNameEn” ], “query”: “James AND Rockets” } }, “size”: 100}

參考個人部落格:cyz

頂部