bool查詢原理 es_ES系列之原理copy_to用好了這么香

寫在前面

4ab6e1944f42761c15209acfa8962bf2.png

Elasticsearch(以下簡稱ES)有個copy_to的功能,之前在一個項目中用到,感覺像是發現了一個神器。這個東西并不是像有些人說的是個語法糖。它用好了不但能提高檢索的效率,還可以簡化查詢語句。

基本用法介紹

直接上示例。

先看看mapping,

PUT?my_index
{
??"mappings":?{
????"properties":?{
??????"first_name":?{
????????"type":?"text",
????????"copy_to":?"full_name"?
??????},
??????"last_name":?{
????????"type":?"text",
????????"copy_to":?"full_name"?
??????},
??????"full_name":?{
????????"type":?"text"
??????}
????}
??}
}

first_name和last_name都指定了copy_to,表示他們這兩個字段的值都會復制到full_name上。寫入兩條文檔看看,

PUT?my_index/_doc/1
{
??"first_name":?"John",
??"last_name":?"Smith"
}

PUT?my_index/_doc/2
{
??"first_name":?"Tom",
??"last_name":?"Cruise"
}

然后我們在查詢的時候,就可以指定從full_name這個字段查詢了,

GET?my_index/_search
{
??"query":?{
????"match":?{
??????"full_name":?{?
????????"query":?"John?Smith",
????????"operator":?"and"
??????}
????}
??}
}

查詢結果如下:

"hits"?:?{
????"total"?:?{
??????"value"?:?1,
??????"relation"?:?"eq"
????},
????"max_score"?:?1.3862944,
????"hits"?:?[
??????{
????????"_index"?:?"my_index",
????????"_type"?:?"_doc",
????????"_id"?:?"1",
????????"_score"?:?1.3862944,
????????"_source"?:?{
??????????"first_name"?:?"John",
??????????"last_name"?:?"Smith"
????????}
??????}
????]
??}

如果沒有使用copy_to的話,我們需要指定兩個字段查詢,類似如下的語句:

GET?my_index/_search
{
??"query":?{
????"bool":?{
??????"must":?[
????????{"match":?{
??????????"first_name":?"John"
????????}},
????????{"match":?{
??????????"last_name":?"Smith"
????????}}
??????]
????}
??}
}

兩種方式查詢的結果是一樣的。

進階

聊完了基本用法,來看看一些高級的功能。假如說我們想獲取full_name的內容,有些業務場景下,我們會需要返回這個字段,怎么辦呢?其實很簡單,如下所示,我們在設置mapping的時候加上store:true即可。

PUT?my_index
{
??"mappings":?{
????"properties":?{
??????"first_name":?{
????????"type":?"text",
????????"copy_to":?"full_name"?
??????},
??????"last_name":?{
????????"type":?"text",
????????"copy_to":?"full_name"?
??????},
??????"full_name":?{
????????"type":?"text",
????????"store":?true
??????}
????}
??}
}

然后再寫入文檔,我們可以通過下面的語句查詢到full_name的內容。

GET?my_index/_doc/1?stored_fields=full_name

得的結果是:

{
??"_index"?:?"my_index",
??"_type"?:?"_doc",
??"_id"?:?"1",
??"_version"?:?1,
??"_seq_no"?:?0,
??"_primary_term"?:?1,
??"found"?:?true,
??"fields"?:?{
????"full_name"?:?[
??????"John",
??????"Smith"
????]
??}
}

如果你沒有指定store為true,查詢的結果是這樣的:

{
??"_index"?:?"my_index",
??"_type"?:?"_doc",
??"_id"?:?"1",
??"_version"?:?1,
??"_seq_no"?:?0,
??"_primary_term"?:?1,
??"found"?:?true
}

再來看另外一個問題。把上面的mapping改一下,text改為keyword,如下:

PUT?my_index
{
??"mappings":?{
????"properties":?{
??????"first_name":?{
????????"type":?"keyword",
????????"copy_to":?"full_name"?
??????},
??????"last_name":?{
????????"type":?"keyword",
????????"copy_to":?"full_name"?
??????},
??????"full_name":?{
????????"type":?"keyword",
????????"store":?true
??????}
????}
??}
}

然后還是寫入上面示例的兩條數據。當我們用通用的查詢語句查詢時發現搜索不到結果了,這是為啥呢?

我這里先給出解決方案,但是不解釋原理,有興趣的可以思考下。

用下面兩個查詢語句都可以查詢到結果,你覺得是什么原因?

GET?my_index/_search
{
??"query":?{
????"bool":?{
??????"must":?[
????????{"term":?{
??????????"first_name":?{
????????????"value":?"John"
??????????}
????????}},
????????{"term":?{
??????????"last_name":?{
????????????"value":?"Smith"
??????????}
????????}}

??????]
????}
??}
}

GET?my_index/_search
{
??"query":?{
????"terms":?{
??????"full_name":?[
????????"John",
????????"Smith"
??????]
????}
??}
}

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

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

相關文章

加密算法—MD5、RSA、DES

最近因為要做一個加密的功能,簡單了解了一下加密算法,現在比較常用的有三個加密算法MD5加密算法、RSA加密算法、DES加密算法。 MD5加密算法 定義:MD5算法是將任意長度的“字節串”變換成一個128bit的大整數,并且它是一個不可逆的字…

隨機加密_隨機藝術和加密圣誕樹

隨機加密When I first learned how to code, one of my first tasks was setting up an SSH key so I could use encryption to securely connect to my friend’s Linux server.當我第一次學習如何編碼時,我的第一個任務是設置SSH密鑰,以便可以使用加密…

用c語言編寫一個2048 游戲,求c語言編寫的2048游戲代碼,盡量功能完善一些

正在編寫中,請稍后!追答 : 代碼來了!有點急,沒做界面。追答 : 2048_launcher。c:#include#include#includevoid main(){printf("正在啟動中,請稍后!");Sleep(1000);system("bin\…

MySQL之數據庫對象查看工具mysqlshow

mysqlshow:數據庫對象查看工具,用來快速查找存在哪些數據庫、數據庫中的表、表中的列或索引。選項:--count 顯示數據庫和表的統計信息-k 顯示指定的表中的索引-i 顯示表的狀態信息不帶任何參數顯示所有數據庫[rootwww mys…

軟件工程分組

電子零售系統 陳仔祥 孟拓 陳庚 汪力 郭澳林 崔祥岑 劉校 肖宇 武清 胡圣陽轉載于:https://www.cnblogs.com/2231c/p/9960751.html

vnr光學識別怎么打開_干貨|指紋鎖的指紋識別模塊的前世今生,智能鎖的指紋識別到底有多智能?...

智能鎖現在也有很多叫法:指紋鎖、電子鎖。可見指紋識別是智能鎖的核心功能了,那我們今天來聊聊智能鎖的指紋識別模塊。指紋識別的歷史指紋識別認證的流程指紋識別技術的種類指紋識別的歷史早在2000多年前我國古代的人就將指紋用于簽訂合同和破案了&#…

使用Kakapo.js進行動態模擬

by zzarcon由zzarcon 使用Kakapo.js進行動態模擬 (Dynamic mocking with Kakapo.js) 3 months after the first commit, Kakapo.js reaches the first release and we are proud to announce that now it is ready to use. Let us introduce you Kakapo.首次提交3個月后&#…

android ble 實現自動連接,Android:自動重新連接BLE設備

經過多次試驗和磨難之后,這就是我最好讓Android自動連接的唯一用戶操作是首先選擇設備(如果使用設置菜單然后首先配對).您必須將配對事件捕獲到BroadcastReceiver中并執行BluetoothDevice.connectGatt()將autoconnect設置為true.然后當設備斷開連接時,調用gatt.connect().更新&…

萊斯 (less)

less中的變量 1、聲明變量:變量名:變量值 使用變量名:變量名 less中的變量類型 ①數字類1 10px ②字符串:無引號字符串red和有引號字符串"haha" ③顏色類red#000000 rgb() …

hackintosh黑蘋果_如何構建用于編碼的Hackintosh

hackintosh黑蘋果by Simon Waters西蒙沃特斯(Simon Waters) 如何構建用于編碼的Hackintosh (How to build a Hackintosh for coding) Let’s talk about Hackintosh-ing — the installation of Mac OS X on PC hardware.我們來談談Hackintosh-ing-在PC硬件上安裝Mac OSX。 I…

hide show vue 動畫_(Vue動效)7.Vue中動畫封裝

關鍵詞&#xff1a;動畫封裝——進行可復用一、如何封裝&#xff1f;1、使用&#xff1a;局部組件傳遞數據局部組件中使用JS動畫2、原理&#xff1a;將動畫效果完全第封裝在一個名為<fade>的組件中&#xff0c;今后如要復用&#xff0c;只需要復制有其組件名的部分&#…

android項目編譯命令行,命令行編譯Android項目

1. 生成R文件> aapt package -f -m -J ./gen -S res -M AndroidManifest.xml -I D:\android.jar-f 如果編譯生成的文件已經存在&#xff0c;強制覆蓋。-m 使生成的包的目錄存放在-J參數指定的目錄-J 指定生成的R.java 的輸出目錄路徑-S 指定res文件夾的路徑-I 指定某個版本平…

jQuery datepicker和jQuery validator 共用時bug

當我們給一個元素綁定一個datepick后又要對它用validator進行驗證時會發現驗證并沒有成功 因為當點擊該元素時候input彈出datepick的UI就已經失去了焦點它驗證的仍然是前一個值&#xff0c; 不過還好 datepick提供了onSelect 事件我們可以在這個事件觸發的時候重新把焦點在賦給…

《Python地理數據處理》——導讀

前言本書可以幫助你學習使用地理空間數據的基礎知識&#xff0c;主要是使用GDAL / OGR。當然&#xff0c;還有其他選擇&#xff0c;但其中一些都是建立在GDAL的基礎之上&#xff0c;所以如果你理解了本書中的內容&#xff0c;就可以很輕松地學習其他知識。這不是一本關于地理信…

記一次Java AES 加解密 對應C# AES加解密 的一波三折

最近在跟三方對接 對方采用AES加解密 作為一個資深neter Ctrl CV 是我最大的優點 所以我義正言辭的問他們要了demo java demo代碼&#xff1a; public class EncryptDecryptTool {private static final String defaultCharset "UTF-8";private static final String …

zemax評價函數編輯器_ZEMAX與光學設計案例:激光擴束系統詳細設計與公差分析(二)...

目前超過兩千人的光學與光學設計方面的微信公眾號&#xff0c;歡迎您的到來&#xff01;激光擴束系統公差分析ZEMAX與光學設計案例&#xff1a;激光擴束系統詳細設計與公差分析(二)作者&#xff1a;墨子川上10倍擴束系統在上篇已經設計好了&#xff0c;接下來就是進行系統的公差…

決策者根據什么曲線做出決策_如何做出產品設計決策

決策者根據什么曲線做出決策by Tanner Christensen由Tanner Christensen 如何做出產品設計決策 (How Product Design Decisions are Made) Recently in a Facebook group dedicated to designers, known as Designers Guild, a young design student named Marina Candela ask…

移動前端框架重構幾個關鍵問題

1. 是否該廢棄iscroll&#xff1f; 我得出的結論是&#xff0c;是該廢棄了。那當時為什么要用iscroll&#xff1f; 原因有三個&#xff1a; 1. 因為別人也用了。 2. 為了iPhone上頁面滑動更順暢。 3. 為了用上拉、下拉刷新。 關于這三個原因有幾點觀點&#xff1a; 1. 人最容易…

android 內部共享存儲,Android共享內部存儲

我現在面對txt文件的類似情況,并做到了這一點.File downloadedFile new File( context.getFilesDir(),"simple.txt" );downloadedFile.setReadable( true,false );downloadedFile.setWritable( true,false ); //set read/write for othersUri downloadFileUri Uri.f…

UiPath: Selectors repair 選擇器的修復,即被選擇的按鈕發生改變如何選擇第二按鈕...

實現批量注冊用戶功能時&#xff0c;出現第一個用戶注冊完時&#xff0c;彈出確認按鈕&#xff0c;點擊即可&#xff0c;但是第二個用戶注冊完成時&#xff0c;彈出的按鈕與第一個有差異&#xff0c;圖形用戶界面元素及其父元素的屬性都發生改變。所以就點不了按鈕&#xff0c;…