Elasticsearch-DSL高級查詢操作

一、禁用元數據和過濾數據

1、禁用元數據_source

GET product/_search
{"_source": false, "query": {"match_all": {}}
}

查詢結果不顯示元數據
禁用之前:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 5,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "product","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"name" : "xiaomi phone","desc" : "shouji zhong de zhandouji","date" : "2021-06-01","price" : 3999,"tags" : ["xingjiabi","fashao","buka"]}},{"_index" : "product","_type" : "_doc","_id" : "2","_score" : 1.0,"_source" : {"name" : "xiaomi nfc phone","desc" : "zhichi quangongneng nfc,shouji zhong de jianjiji","date" : "2021-06-02","price" : 4999,"tags" : ["xingjiabi","fashao","gongjiaoka"]}},{"_index" : "product","_type" : "_doc","_id" : "3","_score" : 1.0,"_source" : {"name" : "nfc phone","desc" : "shouji zhong de hongzhaji","date" : "2021-06-03","price" : 2999,"tags" : ["xingjiabi","fashao","menjinka"]}},{"_index" : "product","_type" : "_doc","_id" : "4","_score" : 1.0,"_source" : {"name" : "xiaomi erji","desc" : "erji zhong de huangmenji","date" : "2021-04-15","price" : 999,"tags" : ["low","bufangshui","yinzhicha"]}},{"_index" : "product","_type" : "_doc","_id" : "5","_score" : 1.0,"_source" : {"name" : "hongmi erji","desc" : "erji zhong de kendeji 2021-06-01","date" : "2021-04-16","price" : 399,"tags" : ["lowbee","xuhangduan","zhiliangx"]}}]}
}

禁用之后:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 5,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "product","_type" : "_doc","_id" : "1","_score" : 1.0},{"_index" : "product","_type" : "_doc","_id" : "2","_score" : 1.0},{"_index" : "product","_type" : "_doc","_id" : "3","_score" : 1.0},{"_index" : "product","_type" : "_doc","_id" : "4","_score" : 1.0},{"_index" : "product","_type" : "_doc","_id" : "5","_score" : 1.0}]}
}

2、數據源過濾器

Including:結果中返回哪些field
Excluding:結果中不要返回哪些field,不返回的field不代表不能通過該字段進行檢索,因為元數據不存在不代表索引不存在

兩種實現方式,
1:在創建索引的時候,mapping中配置;
這樣配置映射,在查詢的時候只顯示name和price,不顯示desc和tags

PUT product2
{"mappings": {"_source": {"includes": ["name","price"],"excludes": ["desc","tags"]}}
}

查看映射信息:GET product2/_mapping

{"product2" : {"mappings" : {"_source" : {"includes" : ["name","price"],"excludes" : ["desc","tags"]},"properties" : {"desc" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"name" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"owner" : {"properties" : {"age" : {"type" : "long"},"name" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"sex" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}},"price" : {"type" : "long"},"tags" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}}}
}

插入數據:

PUT /product2/_doc/1
{"owner":{"name":"zhangsan","sex":"男","age":18},"name": "hongmi erji","desc": "erji zhong de kendeji","price": 399,"tags": ["lowbee","xuhangduan","zhiliangx"]
}

查詢數據:
GET product2/_search
可以看到查詢的結果沒有上面excludes的數據

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "product2","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"price" : 399,"name" : "hongmi erji"}}]}
}

2:在寫get search查詢的時候指定;
基于上面的測試數據,先DELETE product2刪除索引 再重新PUT /product2/_doc/1創建索引直接自動映射。
兩種寫法:
1.“_source”: 直接寫展示的字段,
只展示owner.name和owner.sex

GET product2/_search
{"_source": ["owner.name","owner.sex"], "query": {"match_all": {}}
}

結果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "product2","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"owner" : {"sex" : "男","name" : "zhangsan"}}}]}
}

2.source里用includes和excludes

GET product2/_search
{"_source": {"includes": ["owner.*","name"],"excludes": ["name", "desc","price"]},"query": {"match_all": {}}
}

結果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "product2","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"owner" : {"sex" : "男","name" : "zhangsan","age" : 18}}}]}
}

二、query string search

1.查看索引的結構
GET product/_mapping

2.查詢索引的數據 默認10條
GET product/_search

3.查詢索引的數據 限制條數20條
GET /product/_search?size=20

4.查詢name分詞后含有nfc的數據
GET /product/_search?q=name:nfc

5.查詢前20條數據并且按照價格降序排列
GET /product/_search?from=0&size=20&sort=price:desc

6.createtime的數據類型是date,不會索引,所以這里是精準匹配createtime:2020-08-19的數據
GET /product/_search?q=createtime:2020-08-19

7.查詢所有text分詞后的詞條中包含炮這個單詞的
GET /product/_search?q=炮

三、全文檢索-Fulltext query

查詢模板:

GET index/_search
{"query": {"match": {"field": "searchContent"}}
}

造測試數據:
put mapping 就像關系型數據庫的表結構:ddl語句

PUT product
{"mappings" : {"properties" : {"createtime" : {"type" : "date"},"date" : {"type" : "date"},"desc" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}},"analyzer":"ik_max_word"},"lv" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"name" : {"type" : "text","analyzer":"ik_max_word","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"price" : {"type" : "long"},"tags" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"type" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}}
}

插入數據:就像關系型數據庫的insert

PUT /product/_doc/1
{"name" : "小米手機","desc" :  "手機中的戰斗機","price" :  3999,"lv":"旗艦機","type":"手機","createtime":"2020-10-01T08:00:00Z","tags": [ "性價比", "發燒", "不卡頓" ]
}
PUT /product/_doc/2
{"name" : "小米NFC手機","desc" :  "支持全功能NFC,手機中的滑翔機","price" :  4999,"lv":"旗艦機","type":"手機","createtime":"2020-05-21T08:00:00Z","tags": [ "性價比", "發燒", "公交卡" ]
}
PUT /product/_doc/3
{"name" : "NFC手機","desc" :  "手機中的轟炸機","price" :  2999,"lv":"高端機","type":"手機","createtime":"2020-06-20","tags": [ "性價比", "快充", "門禁卡" ]
}
PUT /product/_doc/4
{"name" : "小米耳機","desc" :  "耳機中的黃燜雞","price" :  999,"lv":"百元機","type":"耳機","createtime":"2020-06-23","tags": [ "降噪", "防水", "藍牙" ]
}
PUT /product/_doc/5
{"name" : "紅米耳機","desc" :  "耳機中的肯德基","price" :  399,"type":"耳機","lv":"百元機","createtime":"2020-07-20","tags": [ "防火", "低音炮", "聽聲辨位" ]
}
PUT /product/_doc/6
{"name" : "小米手機10","desc" :  "充電賊快掉電更快,超級無敵望遠鏡,高刷電競屏","price" :  "","lv":"旗艦機","type":"手機","createtime":"2020-07-27","tags": [ "120HZ刷新率", "120W快充", "120倍變焦" ]
}
PUT /product/_doc/7
{"name" : "挨炮 SE2","desc" :  "除了CPU,一無是處","price" :  "3299","lv":"旗艦機","type":"手機","createtime":"2020-07-21","tags": [ "割韭菜", "割韭菜", "割新韭菜" ]
}
PUT /product/_doc/8
{"name" : "XS Max","desc" :  "聽說要出新款12手機了,終于可以換掉手中的4S了","price" :  4399,"lv":"旗艦機","type":"手機","createtime":"2020-08-19","tags": [ "5V1A", "4G全網通", "大" ]
}
PUT /product/_doc/9
{"name" : "小米電視","desc" :  "70寸性價比只選,不要一萬八,要不要八千八,只要兩千九百九十八","price" :  2998,"lv":"高端機","type":"耳機","createtime":"2020-08-16","tags": [ "巨饃", "家庭影院", "游戲" ]
}
PUT /product/_doc/10
{"name" : "紅米電視","desc" :  "我比上邊那個更劃算,我也2998,我也70寸,但是我更好看","price" :  2999,"type":"電視","lv":"高端機","createtime":"2020-08-28","tags": [ "大片", "藍光8K", "超薄" ]
}
PUT /product/_doc/11
{"name": "紅米電視","desc": "我比上邊那個更劃算,我也2998,我也70寸,但是我更好看","price": 2998,"type": "電視","lv": "高端機","createtime": "2020-08-28","tags": ["大片","藍光8K","超薄"]
}

在這里插入圖片描述

在構造mapping映射的時候,對text類型的字段指定了"analyzer":"ik_max_word"分詞器,這里用的是IK分詞器,插入數據會對該字段進行分詞,建立倒排索引。*“type” : “keyword”*是用來后續精準查詢的時候通過field.keyword來精準匹配。

1、query->match->text類型字段
進行全文搜索,會對查詢的文本進行分詞。
query match 這個name會被分詞 name是txt類型 會被分詞 所以搜索條件被分詞后會和這個查詢字段的詞項進行匹配 匹配到的都返回
查詢條件和索引中的字段數據都會進行分詞 后 進行匹配 按照score返回

GET product/_search?_source=false
{"query": {"match": {"name": "NFC手機"}}
}

query->match->text.keyword類型字段
name是text類型字段,name.keyword做為查詢條件不會進行分詞,直接和索引數據中的name進行匹配,id為3的數據可以查詢匹配。

GET product/_search
{"query": {"match": {"name.keyword": "NFC手機"}}
}

2、query->match_all查詢全部數據
默認查詢返回10條,這里指定20條,禁用元數據不返回太多

GET product/_search?size=20&_source=false
{"query": {"match_all": {}}
}

3、query->multi_match 多個字段匹配
多個字段匹配 name或者desc 包含 query中的任意一個就行,name或者desc分詞后的數據包含手機就返回

GET product/_search?size=20&_source=false
{"query": {"multi_match": {"query": "手機","fields": ["name","desc"]}}
}

4、query->match_phrase 短語查詢
搜索與指定短語匹配的文檔,保留短語中詞語的相對位置。
name的分詞器是ik_max_word,看下name會被分為哪些詞

GET _analyze
{"analyzer": "ik_max_word","text": "小米NFC手機"
}
結果:
{"tokens" : [{"token" : "小米","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "nfc","start_offset" : 2,"end_offset" : 5,"type" : "ENGLISH","position" : 1},{"token" : "手機","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 2}]
}GET _analyze
{"analyzer": "ik_max_word","text": "NFC手機"
}結果:
{"tokens" : [{"token" : "nfc","start_offset" : 0,"end_offset" : 3,"type" : "ENGLISH","position" : 0},{"token" : "手機","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 1}]
}

短語查詢 索引里面name字段要有NFC手機這個短語 順序不能顛倒,NFC手機會被分為nfc 手機
分詞后能和索引字段name分詞后的數據匹配到且順序不亂 就可以做為結果展示

GET product/_search
{"query": {"match_phrase": {"name": "NFC手機"}}
}

結果:

{"took" : 5,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 2.8616219,"hits" : [{"_index" : "product","_type" : "_doc","_id" : "3","_score" : 2.8616219},{"_index" : "product","_type" : "_doc","_id" : "2","_score" : 2.4492486}]}
}

5、Term 對字段進行精確匹配。

GET /my_index/_search
{"query": {  // "query"定義查詢條件"term": { // "term"查詢執行精確匹配"field_name": "exact_value" // "field_name"是要匹配的字段; "exact_value"是精確查詢的精確值,通常用于keyword標簽或其他不分析的文本字段}}
}

6、Bool 多條件組合查詢
組合多個查詢條件,支持must(必須)、should(至少一個)和must_not(必須不)關鍵字。
match支持全文檢索,對查詢條件分詞然后匹配索引中的分詞后的詞項
term精準查詢,不會分詞檢索,和非text類型或者text.keyword使用
range gte大于等于lte小于等于
minimum_should_match should默認至少滿足一個,這里表示至少滿足的數量自己控制

GET product/_search
{"query": {"bool": {"must": [{"match": {"name": "手機"}},{"match": {"desc": "手機"}}],"should": [{"term": {"type.keyword": {"value": "手機"}}},{"range": {"price": {"gte": 100,"lte": 300}}}],"minimum_should_match": 2,"must_not": [{"range": {"price": {"gte": 2999,"lte": 4500}}}]}}
}

filter:條件過濾查詢,過濾滿足條件的數據 不計算相關度得分

GET product/_search
{"query": {"bool": {"filter": [{"term": {"type.keyword": {"value": "手機"}}}]}}
}

7、terms
索引中tags含有性價比或者大片任意一個就行

GET product/_search
{"query": {"terms": {"tags.keyword": [ "性價比", "大片" ],"boost": 2.0}}
}

8、constant_score 意為固定得分
避免算分 提高性能

GET product/_search
{"query": {"constant_score": {"filter": {"term": {"type.keyword": "手機"}},"boost": 1.2}}
}

9、(must或者filter)和should組合 這時should滿足0也行 如果should單用 要至少滿足一個

GET product/_search
{"query": {"bool": {"filter": [{"range": {"price": {"gte": 10,"lte": 4000}}}],"should": [{"match": {"name": "哈哈哈哈哈哈哈哈哈哈哈哈"}},{"range": {"price": {"gte": 4001,"lte": 9000}}}],"minimum_should_match": 1}}
}

minimum_should_match不設置或者設置為0,即使should兩個條件一個都不符合也可以查出數據

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

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

相關文章

基于Spring Boot的體育商品推薦系統

一、系統背景與目的 隨著電子商務的快速發展和人們健康意識的提高,體育商品市場呈現出蓬勃發展的態勢。然而,傳統的體育商品銷售方式存在商品種類繁多、用戶選擇困難、個性化需求無法滿足等問題。為了解決這些問題,基于Spring Boot的體育商品…

【Java Nio Netty】基于TCP的簡單Netty自定義協議實現(萬字,全篇例子)

基于TCP的簡單Netty自定義協議實現(萬字,全篇例子) 前言 有一陣子沒寫博客了,最近在學習Netty寫一個實時聊天軟件,一個高性能異步事件驅動的網絡應用框架,我們常用的SpringBoot一般基于Http協議&#xff0…

【2025最新計算機畢業設計】基于SSM校園歌手賽事管理系統【提供源碼+答辯PPT+文檔+項目部署】

作者簡介:?CSDN新星計劃導師、Java領域優質創作者、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和學生畢業項目實戰,高校老師/講師/同行前輩交流。? 主要內容:🌟Java項目、Python項目、前端項目、PHP、ASP.NET、人工智能…

Visual Studio 使用 GitHub Copilot 協助調試

🎀🎀🎀【AI輔助編程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 與 IntelliCode 輔助編碼Visual Studio 安裝和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 擴展Visual Studio 使用 GitHu…

了解ARM的千兆以太網——RK3588

1. 簡介 本文并不重點講解調試內容,重點了解以太網在ARM設計中的框架以及在設備樹以及驅動的一個整體框架。了解作為一個驅動開發人員當拿到一款未開發過的ARM板卡應該怎么去把網卡配置使用起來。 2. 基礎知識介紹 在嵌入式ARM中實現以太網的解決方案通常有以下兩種…

Springboot家政服務管理系統

摘 要 科技進步的飛速發展引起人們日常生活的巨大變化,電子信息技術的飛速發展使得電子信息技術的各個領域的應用水平得到普及和應用。信息時代的到來已成為不可阻擋的時尚潮流,人類發展的歷史正進入一個新時代。在現實運用中,應用軟件的工作…

DC-9筆記

靶機信息 官網:DC: 9 ~ VulnHub 只有一個flag,官網上沒給其他提示 信息收集 nmap 192.168.66.2-254nmap 192.168.66.146 -A -p-開放了80端口,22端口是filtered的,被過濾? NMAP 六種端口狀態解讀_nmap filtered-CSDN博客 那來看看http服務吧 http(80) 頁腳是空白的,插件也…

STM32-筆記3-驅動蜂鳴器

1、復制03項目,重命名為04項目 打開04項目的Drivers/BSP/led文件夾,把led文件夾更改為beep文件夾,改文件夾內部的.c和.h文件更改為beep.c和beep.h文件,如下圖所示。 2、打開工程文件 出現彈窗,顯示找不到xx文件&#…

PHP開發日志 ━━ 基礎知識:四種不同的變量返回方式該如何調用

最近在給框架升級,其中涉及到古早的緩存系統升級,現在準備區分類型為混合、變量和普通文件,那么變量用什么形式存儲到緩存才能給后續開發帶來便利和通用性呢?于是就涉及到了本文的php基礎知識。 好吧,又是一個無用的知…

概率論得學習和整理30: 用EXCEL 描述泊松分布 poisson distribution

目錄 1 泊松分布的基本內容 1.1 泊松分布的關鍵點 1.1.1 屬于離散分布 1.1.2 泊松分布的特點:每個子區間內概率相等 , λ就是平均概率 1.2 核心參數 1.3 pmf公式 1.4 期望和方差 2 例1:用EXCEL計算泊松分布的概率 3 比較λ不同值時…

Java中的垃圾收集器

文章目錄 1. 理解不同類型的垃圾收集器1.1 Serial 收集器1.2 Parallel (吞吐量) 收集器1.3 CMS (Concurrent Mark-Sweep) 收集器1.4 G1 (Garbage First) 收集器1.5 ZGC 和 Shenandoah GC1.6 Epsilon GC1.7 ParNew 收集器1.8 Zing (Azul Systems) 2. 優化垃圾收集器的選擇和配置…

測試工程師八股文05|功能測試、業務測試

一、基礎概念 1、軟件測試分類 1??按照軟件產生的階段劃分 單元測試:針對程序源代碼進行測試【開發自測】集成測試:針對模塊之間功能交互進行測試系統測試:對整個系統(功能、非功能)進行全面測試驗收測試&#xff…

圖(dfs與bfs)算法2

進度:15/100 原題1: 給你一棵二叉樹的根節點 root ,翻轉這棵二叉樹,并返回其根節點。 (力扣的圖) 原題2: 給定二叉樹的根節點 root ,返回所有左葉子之和。 原題3: 給…

《鴻蒙開發-答案之書》字符串占位符格式化

《鴻蒙開發-答案之書》字符串占位符格式化 先在string.json定義: {"name":"message_arrive","value":"We will arrive at %s."}使用,它有兩種使用方式: 方式一: Text($r(app.string.…

Redis bitmaps 使用

應用場景: 記錄id為 1 的用戶,2024年12月簽到情況,并統計; 記錄 1號簽到 zxys-redis:0>setbit 1:202412 1 1 記錄 2號簽到 zxys-redis:0>setbit 1:202412 2 1 記錄 3號未簽到 zxys-redis:0>setbit 1:202412 3 0 …

【微服務】SpringBoot 整合Redis Stack 構建本地向量數據庫相似性查詢

目錄 一、前言 二、向量數據庫介紹 2.1 什么是向量數據庫 2.2 向量數據庫特點 2.3 向量數據庫使用場景 三、常用的向量數據庫解決方案 3.1 Milvus 3.1.1 Milvus是什么 3.1.2 Milvus主要特點 3.2 Faiss 3.2.1 Faiss是什么 3.2.2 Faiss主要特點 3.3 Pinecone 3.3.1 …

【數據庫】大二數據庫復習范圍 (快速版)幫助你快速復習數據庫

第一章 1. 信息=數據+語義 2:數據庫管理系統(database management system, DBMS) 3. 數據庫系統(database system, DBS)由數據庫、數據庫用戶、計算機硬件系統和計算機軟件系統等幾部分組成 4. 數據模型按應用層次可分為概念模型、邏輯模型和物理模型。 5.每個二維表…

FMIKit-Simulink 常見問題解決方案

將解壓后的文件夾添加到 MATLAB 路徑中: addpath(fullfile(pwd, FMIKit-Simulink-3.1));初始化 FMIKit: FMIKit.initialize(); 設置求解器rtwsfcnfmi.tlc、或grtfmi.tlc再CtrlB即可。 幫助文檔可查看導出FUM和導入FMU。 FMIKit-Simulink-3.1\html\index…

UE UMG 多級彈出菜單踩坑

多級彈出菜單 https://www.bilibili.com/video/BV1ub411J7nA 運行時添加 widget 的方法 create widget 然后 add child 到某個組件,比如 canvas 運行時修改 widget 位置的方法 set widget slot position 用起來沒效果 懷疑是因為我沒有傳入 slot 但是暫時不知…

sunset: midnight

https://www.vulnhub.com/entry/sunset-midnight,517/ 主機發現端口掃描 探測存活主機,8是靶機 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-05 16:49 CST Nmap scan report for 192.168.56.1 …