ElasticSearch搜索引擎使用指南

一、ES數據基礎類型

1、數據類型

字符串

主要包括: text和keyword兩種類型,keyword代表精確值不會參與分詞,text類型的字符串會參與分詞處理

數值

包括: long, integer, short, byte, double, float

布爾值

boolean

時間

date

數組

數組類型不需要專門定義,只要插入的字段值是json數組就行

GEO類型

主要涉及地理信息檢索、多邊形區域的表達

2、text&keyword使用注意

text類型,支持全文搜索,因為text涉及分詞,所以可以配置使用什么分詞器,尤其涉及中文分詞。

實際項目中,如果不需要模糊搜索的字符類型,可以選擇keyword類型,例如:手機號、email、微信的openid等等,如果選text類型,可能會出現搜出一大堆相似的數據,而且不是精確的數據。

二、query語法

query子句主要用于編寫查詢條件,類似于SQL中的where語句。

query子句主要用于編寫類似SQL的where語句,支持布爾查詢(and/or)、IN、全文搜索、模糊匹配、范圍查詢(大于/小于)。

其中:text類型字段支持分詞,可以使用模糊查詢。keyword類型只能做等值查詢,不能進行分詞。

1、match類like匹配

1.1?match匹配單個字段

使用match實現全文搜索。類似于SQL中的like操作。

簡單使用的語法:

GET /{索引名}/_search
{"query": {"match": {"{FIELD}": "{TEXT}"}}
}

說明:
{FIELD} - 就是我們需要匹配的字段名
{TEXT} - 就是我們需要匹配的內容

例子:

GET /article/_search
{"query": {"match" : {"title" : "ES教程"}}
}

article索引中,title字段匹配“ES教程”的所有文檔。

如果title字段的數據類型是text類型,搜索關鍵詞會進行分詞處理。

等價SQL(假設"ES教程"沒有進行分詞):

select * from article where title like '%ES教程%'

1.2 multi_match多字段匹配

例子:

GET /article/_search
{"query": {"multi_match": {"query": "斯柯達前輪制動器","fields":["doc_title","doc_content"]}}
}

等價SQL:

select * from article where doc_title like '%<斯柯達前輪制動器的分詞>%' or doc_content like '%<斯柯達前輪制動器的分詞>%'

因為?斯柯達前輪制動器的分詞 會有很多,所以實際上也會有很多的like,而不僅僅是上面的兩個like。

1.3 multi_phrase順序匹配

match_phrase查詢是ES中一種用于精確匹配短語的查詢方式,可以確保查詢字符串中的關鍵詞按照給定的順序在文檔中連續出現。

說明:檢索詞還是進行分詞的,分詞后的各個單詞的順序在 被檢索的文中是一樣的。

例子:

GET /article/_search
{"query": {"match_phrase": {"doc_content": "制動器裝配"}}
}

搜索結果:

2、term精確匹配單個字段

使用term實現精確匹配

如果想要類似SQL語句中的等值匹配,不需要進行分詞處理,例如:訂單號、手機號、時間字段,不需要分值處理,只要精確匹配。

語法:

GET /{索引名}/_search
{"query": {"term": {"{FIELD}": "{VALUE}"}}
}

{FIELD} - 就是我們需要匹配的字段名
{VALUE} - 就是我們需要匹配的內容,除了TEXT類型字段以外的任意類型

例子:

GET /order_v2/_search
{"query": {"term": {"order_no": "202003131209120999"}}
}

搜索訂單號order_no = "202003131209120999"的文檔。

類似SQL語句:

select * from order_v2 where order_no = "202003131209120999"

3、terms實現SQL的in語句

如果我們要實現SQL中的in語句,一個字段包含給定數組中的任意一個值就匹配。

語法:

GET /order_v2/_search
{"query": {"terms": {"{FIELD}": ["{VALUE1}","{VALUE2}"]}}
}

說明:

{FIELD} - 就是我們需要匹配的字段名
{VALUE1}, {VALUE2} … {VALUE N} - 就是我們需要匹配的內容,除了TEXT類型字段以外的任意類型。

例子:

GET /order_v2/_search
{"query": {"terms": {"shop_id": [123,100,300]}}
}

搜索order_v2索引中,shop_id字段,只要包含[123,100,300]其中一個值,就算匹配。

類似SQL語句:

select * from order_v2 where shop_id in (123,100,300)

4、range范圍查詢

通過range實現范圍查詢,類似SQL語句中的>, >=, <, <=表達式。

語法:

GET /{索引名}/_search
{"query": {"range": {"{FIELD}": {"gte": 10, "lte": 20}}}
}

參數說明:

{FIELD} - 字段名

gte范圍參數 - 等價于>=

lte范圍參數 - 等價于 <=

范圍參數可以只寫一個,例如:僅保留 “gte”: 10, 則代表 FIELD字段 >= 10

范圍參數如下:

gt - 大于 ( > )
gte - 大于且等于 ( >= )
lt - 小于 ( < )
lte - 小于且等于 ( <= )

例子:

GET /order_v2/_search
{"query": {"range": {"shop_id": {"gte": 10,"lte": 200}}}
}

查詢order_v2索引中,shop_id >= 10 且 shop_id <= 200的文檔。類似SQL:

select * from order_v2 where shop_id >= 10 and shop_id <= 200

5、bool組合查詢

前面的例子都是設置單個字段的查詢條件,如果想要編寫類似SQL的Where語句組合多個字段的查詢條件,可以使用bool語句。

5.1 bool查詢基本語法結構

語法:

GET /{索引名}/_search
{"query": {"bool": { // bool查詢"must": [], // must條件,類似SQL中的and, 代表必須匹配條件"must_not": [], // must_not條件,跟must相反,必須不匹配條件"should": [] // should條件,類似SQL中or, 代表匹配其中一個條件}}
}

must、must_not和should條件的參數都是一個數組,意味著他們都支持設置多個條件。

同時,前面介紹的單個字段的匹配語句,都可以用在bool查詢語句中進行組合。

5.2 must條件

類似SQL的and,代表必須匹配的條件。

語法:

GET /{索引名}/_search
{"query": {"bool": {"must": [{匹配條件1},{匹配條件2},...可以有N個匹配條件...]}}
}

例子:

GET /order_v2/_search
{"query": {"bool": {"must": [{"term": {"order_no":  "202003131209120999"}},{"term": {"shop_id":  123}}]}}
}

這里的Must條件,使用了term精確匹配,等價SQL:

select * from order_v2 where order_no="202003131209120999" and shop_id=123

5.3 must_not條件

跟must的作用相反,語法類似。

5.4 should條件

類似SQL中的 or, 只要匹配其中一個條件即可。

語法:

GET /{索引名}/_search{"query": {"bool": {"should": [{匹配條件1},{匹配條件2},…可以有N個匹配條件…]}}}

例子:

GET /order_v2/_search
{"query": {"bool": {"should": [{"term": {"order_no": "202003131209120999"}},{"term": {"order_no": "22222222222222222"}}]}}
}

等價SQL:

select * from order_v2 where order_no="202003131209120999" or order_no="22222222222222222"

5.5 bool綜合例子

GET /order_v2/_search
{"query": {"bool": {"should": [{"bool": {"must": [{"term": {"order_no": "2020031312091209991"}},{"range": {"shop_id": {"gte": 10,"lte": 200}}}]}},{"terms": {"tag": [1,2,3,4,5,12]}}]}}
}

等價SQL:

select * from order_v2 where (order_no='202003131209120999' and (shop_id>=10 and shop_id<=200)) or tag in (1,2,3,4,5)

6、wildcard通配符查詢

wildcard 關鍵字: 通配符查詢 ? 用來匹配一個任意字符 * 用來匹配多個任意字符。

例子:

GET /xizi/emp/_search{"query": {"wildcard": {"name": {"value": "xi*"}}}}

7、fuzzy模糊查詢

fuzzy 模糊查詢,最大模糊錯誤必須在0-2之間 ?

搜索關鍵詞長度為 2 不允許存在模糊 0

?搜索關鍵詞長度為3-5 允許一次模糊 0 1 ?

搜索關鍵詞長度大于5 允許最大2模糊

例子:

GET /xizi/emp/_search{"query": {"fuzzy": {"name":"xizi"}}}

8、額外限制條件

8.1 _source指定返回字段

例子1:

get lib3/user/_search
{"_source":["name","age"],"query":{"match": {"interests": "changge"}}

結果只返回索引中name和age字段信息

例子2:

get lib3/user/_search
{"query":{"match_all": {}},"_source":{"includes": "addr*","excludes": ["name","bir*"]}
}

顯示要的字段、去除不需要的字段、可以使用通配符*。

8.2 boost查詢的權重

8.3?min_similarity設置匹配的最小相似度

8.4 highlight高亮搜索結果

例子:

get data_info/_search
{"_source":["doc_title","doc_content"],"query": {"match": {"doc_content": "斯柯達前輪制動器"}},"highlight":{"fields":{"doc_content":{}}}
}

返回結果:

8.5 size指定返回條數

ES默認返回10條結果。

例子:

get data_info/_search
{"query": {"match": {"doc_content": "斯柯達前輪制動器"}},"size": 2
}

結果中只有2條信息。

8.6 from分頁查詢

from 關鍵字: 用來指定起始返回位置,和size關鍵字連用可實現分頁效果。

例子:

get data_info/_search
{"query": {"match": {"doc_content": "斯柯達前輪制動器"}},"size": 2,"from": 3
}

8.7 指定字段排序sort

使用該屬性會讓得分失效

例子:

GET /db_idx4/_search
{"query":{"match_all":{}},"sort":[{"age":"desc"}]
}

三、全文搜索

1、概念

平時我們使用SQL like語句搜索一些文本、字符串是否包含指定的關鍵詞,如果兩篇文章都包含我們的關鍵詞,那么具體哪篇文章內容的相關度更高?這個SQL的like語句是做不到的,更別說like語句的性能問題了。

ES通過分詞、相關度計算可以解決這個問題,ES內置了一些相關度算法,大致上意思是:如果一個關鍵詞在一篇文章出現的頻率高,并且在其他文章中出現少,那說明這個關鍵詞與這篇文章的相關度很高。

ES對于text類型的字段,在插入數據的時候,會進行分詞處理,然后根據分詞的結果索引文檔,當我們搜索text類型字段的時候,也會先對搜索關鍵詞進行分詞處理、然后根據分詞的結果去搜索。

2、分詞效果測試

語法:

GET /_analyze
{"text": "需要分詞的內容","analyzer": "分詞器"
}

例子:

GET http://xx.elasticsearch.aliyuncs.com:9200/_analyze
{"text":"上海大學","analyzer": "standard"
}

使用standard分詞器,對"上海大學"進行分詞,下面是輸出結果:

{"tokens": [{"token": "上","start_offset": 0,"end_offset": 1,"type": "<IDEOGRAPHIC>","position": 0},{"token": "海","start_offset": 1,"end_offset": 2,"type": "<IDEOGRAPHIC>","position": 1},{"token": "大","start_offset": 2,"end_offset": 3,"type": "<IDEOGRAPHIC>","position": 2},{"token": "學","start_offset": 3,"end_offset": 4,"type": "<IDEOGRAPHIC>","position": 3}]
}

token就是分解出來的關鍵詞。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711505.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711505.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711505.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于ssm學生公寓管理系統的設計與開發論文

學生公寓管理系統的設計與實現 摘要 如今&#xff0c;科學技術的力量越來越強大&#xff0c;通過結合較為成熟的計算機技術&#xff0c;促進了學校、醫療、商城等許多行業領域的發展。為了順應時代的變化&#xff0c;各行業結合互聯網、人工智能等技術&#xff0c;紛紛開展了…

P1160 隊列安排題解

題目 一個學校里老師要將班上N個同學排成一列&#xff0c;同學被編號為1~N&#xff0c;他采取如下的方法&#xff1a; 先將1號同學安排進隊列&#xff0c;這時隊列中只有他一個人&#xff1b; 2~N號同學依次入列&#xff0c;編號為i的同學入列方式為&#xff1a;老師指定編…

下載huggingface數據集到本地并讀取.arrow文件遇到的問題

文章目錄 1. 524MB中文維基百科語料&#xff08;需要下載的數據集&#xff09;2. 下載 hugging face 網站上的數據集3. 讀取 .arrow 文件報錯代碼4. 糾正后代碼 1. 524MB中文維基百科語料&#xff08;需要下載的數據集&#xff09; 2. 下載 hugging face 網站上的數據集 要將H…

MATLAB環境下一種新穎的類脈沖信號的高分辨率時頻分析方法

一般情況下&#xff0c;機械振動信號或地震信號是非平穩的。而傳統傅立葉變換只能應用于平穩信號分析&#xff0c;故不適用于非平穩信號。所以&#xff0c;我們需要采用時頻分析方法。時頻分析方法能達到同時在時間域和頻率域對信號進行分析的目的&#xff0c;得到信號在不同時…

Python爬取網站視頻資源

思路&#xff1a; 在界面找到視頻對應的html元素位置&#xff0c;觀察發現視頻的url為https://www.pearvideo.com/video_視頻的id&#xff0c;而這個id在html中的href中&#xff0c;所以第一步需要通過xpath捕獲到所需要的id 在https://www.pearvideo.com/video_id的頁面&…

線程池學習

github看到一個項目&#xff08;GitHub - markparticle/WebServer: C Linux WebServer服務器&#xff09;&#xff0c;內部使用的一個線程池看著不錯&#xff0c;拿來學習一下。 /** Author : mark* Date : 2020-06-15* copyleft Apache 2.0*/ #ifndef THREADPO…

Windows系統搭建VisualSVN并結合內網穿透實現遠程訪問本地服務

文章目錄 前言1. VisualSVN安裝與配置2. VisualSVN Server管理界面配置3. 安裝cpolar內網穿透3.1 注冊賬號3.2 下載cpolar客戶端3.3 登錄cpolar web ui管理界面3.4 創建公網地址 4. 固定公網地址訪問 前言 SVN 是 subversion 的縮寫&#xff0c;是一個開放源代碼的版本控制系統…

js實現轉義、反轉義

兩種思路&#xff0c;一種是列出需要用到的轉義項&#xff0c;通過正則來轉化&#xff1b;另一種通過轉化為html語言&#xff0c;通過瀏覽器幫助我們翻譯&#xff0c;然后獲取innerText var HtmlUtil {/*1.用瀏覽器內部轉換器實現html編碼&#xff08;轉義&#xff09;*/html…

Spring 事務常見錯誤(上)

通過上一章的學習&#xff0c;我們了解了 Spring Data 操作數據庫的一些常見問題。這一章我們聊一聊數據庫操作中的一個非常重要的話題——事務管理。 Spring 事務管理包含兩種配置方式&#xff0c;第一種是使用 XML 進行模糊匹配&#xff0c;綁定事務管理&#xff1b;第二種是…

洗澡、泡腳真的能養生? 皮膚科醫生來科普

現如今人們越來越注重健康與養生&#xff0c;除了枸杞、生姜等食補外&#xff0c;各種保健方法和保健產品也層出不窮&#xff0c;還有泡腳、洗涼水澡等養生延緩衰老的方式也廣泛流行&#xff0c;那么泡腳與洗涼水澡真的有用嗎?西安國際醫學中心醫院皮膚科主任高鵬程特意進行了…

Timeplus-proton流處理器調研

概念 Timeplus是一個流處理器。它提供強大的端到端功能&#xff0c;利用開源流引擎Proton來幫助數據團隊快速直觀地處理流數據和歷史數據&#xff0c;可供各種規模和行業的組織使用。它使數據工程師和平臺工程師能夠使用 SQL 釋放流數據價值。 Timeplus 控制臺可以輕松連接到不…

K8S相關小技巧《一》

在實際使用Kubernetes的時候有一些常用的小技巧&#xff0c;在此分享給大家&#xff1a; 獲取用于拉取docker的密鑰的原本值&#xff0c;k8s docker registry pull secret decode&#xff1a; kubectl get secret/registry-pull-secret -n kube-iapply-qa -o json | jq .data…

女性三八節禮物攻略:她無法抗拒的五大禮物

隨著春風的溫柔拂面&#xff0c;我們即將迎來一年一度的三八國際婦女節。這個特別的日子&#xff0c;不僅是對女性貢獻的認可和慶祝&#xff0c;也是向我們生命中的女性表達感激和愛意的絕佳時機。在這個充滿溫馨和敬意的時刻&#xff0c;我們常常在思考&#xff0c;如何用一份…

信息學奧賽一本通1310:【例2.2】車廂重組

1310&#xff1a;【例2.2】車廂重組 時間限制: 1000 ms 內存限制: 65536 KB 提交數: 48051 通過數: 28919 【題目描述】 在一個舊式的火車站旁邊有一座橋&#xff0c;其橋面可以繞河中心的橋墩水平旋轉。一個車站的職工發現橋的長度最多能容納兩節車廂&#xff0c…

elementUI el-table中的對齊問題

用elementUI時&#xff0c;遇到了一個無法對齊的問題&#xff1a;代碼如下&#xff1a; <el-table :data"form.dataList" <el-table-column label"驗收結論" prop"checkResult" width"200"> <template slot-sco…

0005TS函數類型詳解

TypeScript 中的函數類型用于為函數定義參數類型和返回值類型。這提供了一個清晰的契約&#xff0c;指明函數應該如何被調用和期望返回什么類型的結果。以下是 TypeScript 中函數類型的一些基本用法和概念&#xff1a; 函數聲明 在 TypeScript 中&#xff0c;你可以為函數的參…

揭秘!Excel如何成為職場中的價值創造利器

文章目錄 一、Excel在生產力提升中的作用二、Excel在創造價值方面的應用案例三、Excel實用技巧分享四、Excel與其他工具的協同應用五、Excel學習的建議與展望《Excel函數與公式應用大全》亮點內容簡介作者簡介目錄 在當今信息爆炸的時代&#xff0c;數據處理和分析能力已成為職…

AI智能分析網關V4智慧商場方案,打造智慧化商業管理生態

AI智能視頻檢測技術在商場樓宇管理中的應用越來越廣泛。通過實時監控、自動識別異常事件和智能預警&#xff0c;這項技術為商場管理提供了更高效、更安全的保障。今天我們以TSINGSEE青犀視頻AI智能分析網關為例&#xff0c;給大家介紹一下AI視頻智能分析技術如何應用在商場樓宇…

搶單情況下的均衡分配機制

背景&#xff1a; 1、工單有多種類型。 2、客戶提交工單。 3、不同客服受理不同類型工單&#xff0c;受理工單類型存在交叉。 4、按照類型維度實現均衡分配。 方案&#xff1a; 1、為每種類型創建一個工單池&#xff0c;使用隊列&#xff0c;左進右出&#xff1b;客戶提交…

Android AIDL RemoteCallbackLIst

RemoteCallbackLIst 參考地址 RemoteCallbackList 是 Android SDK 中的一個類&#xff0c;用于幫助管理進程之間的回調。它專為進程間通信 (IPC) 場景而設計&#xff0c;在該場景中&#xff0c;應用程序的不同部分甚至不同的應用程序可能在不同的進程中運行。 以下是其關鍵功能…