ES 20 - 查詢Elasticsearch中的數據 (基於DSL的查詢, 包括validate、match、bool)

来源:https://www.cnblogs.com/shoufeng/archive/2019/06/27/11096521.html
-Advertisement-
Play Games

本文介紹Elasticsearch的DSL(領域特定語言)的使用, 包括validate、match query、bool query等的使用方法, 詳細而且都有使用示例~ 歡迎交流呀(⊙ o ⊙) ...


目錄

1 什麼是DSL

DSL: Domain Specific Language, 領域特定語言, 指的是專註於某個應用程式領域的、具有高度針對性的電腦語言.

Query String 與 Query DSL之間的區別:

Query String: 在請求的URL後直接拼接查詢條件;
Query DSL: 在請求的Request Body中攜帶查詢條件.

DSL功能強大, 可以構建複雜的查詢、過濾、聚合條件, 所以這種查詢方式的用途最廣.

2 _validate - 校驗查詢語句是否合法

對於複雜的查詢, 很有必要在查詢前使用validate API進行驗證, 保證DSL語句的正確有效:

// 要查詢name中包含"java"的文檔: 
GET shop/it_book/_validate/query?explain
{
    "query": {
        "math": {            // 錯誤的查詢名稱, 應該是match
            "name": "java"
        }
    }
}

// 校驗結果: 
{
    "valid": false,
    "error": "org.elasticsearch.common.ParsingException: no [query] registered for [math]"
}

// 修改math為match後, 校驗結果為: 
{
    "valid": true,
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "explanations": [
        {
            "index": "shop",
            "valid": true,    // 校驗通過, DSL有效
            "explanation": "+name:java #_type:it_book"  // 查詢條件, +表示必須存在
        }
    ]
}

3 match query - 匹配查詢

3.1 簡單功能示例

3.1.1 查詢所有文檔

GET shop/it_book/_search
{
    "query": {
        "match_all": {}
    }
}

3.1.2 查詢滿足一定條件的文檔

查詢name中包含"java"的文檔, 同時按照價格升序排序:

GET shop/it_book/_search
{
    "query": {
        "match": {
            "name": "java"
        }
    }, 
    "sort": [
        { 
            "price": {"order": "asc"} 
        }
    ]
}

3.1.3 分頁查詢文檔

GET shop/it_book/_search
{
    "query": {
        "match_all": {}
    },
    "from": 0,      // 開始記錄數, 起始數為0
    "size": 1       // 頁大小, 即每頁顯示的記錄數
}

3.1.4 指定返回的結果中包含的欄位

GET shop/it_book/_search
{
    "query": {
        "match_all": {}
    }, 
    "_source": [
        "name",     // 顯示商品名稱
        "price"     // 顯示商品價格
    ]
}

3.2 精確查詢 - match_phrase

不同的數據類型在建立倒排索引時, 有的會作為full text處理, 有的作為exact value處理.

對查詢串分詞時, 使用的分析器(analyzer)必須和創建index時使用的相同, 否則將檢索不到準確的數據.

3.2.1 精確匹配 - exact value

常見的exact value類型有date - 日期類型.

ES檢索時, 不會對String進行分詞, 而是完全根據String的值去精確匹配, 查找相應的文檔.

在DSL中, 通過match_phrase短語匹配達到精確匹配的目的 —— 不會對查詢串進行分詞, 而是直接精確匹配查找.

示例: 查詢name中包含"thinking in java"的文檔, 不會對查詢串進行分詞:

GET shop/_search
{
    "query": {
        "match_phrase": {
            "name": "thinking in java"
        }
    }
}

3.2.2 全文搜索 - full text

常見的full text類型有: text - 文本串.

ES檢索時, 會對檢索串進行分詞, 包括縮寫、時態、同義詞等轉換手段, 然後根據分詞結果與倒排索引進行匹配, 查找相應的文檔.

索引中只要有任意一個相關field的分詞 匹配拆分後的詞, 這個文檔就可以出現在結果中, 只是匹配度越高的排名越靠前.

示例: 查詢name中包含"thinking in java"的文檔, 會將查詢串拆分為"think", "in", "java"三個詞:

GET shop/_search
{
    "query": {
        "match": {
            "name": "thinking in java"
        }
    }
}

3.3 控制匹配規則 - operator

operator 操作符, 用來指定ES對分詞後的詞項如何進行檢索過濾. 選項有:

and, 作用 == match_phrase, 即全部匹配;
or, 作用 == match, 即部分匹配.

使用示例:

GET shop/_search
{
    "query": {
        "match": {
            "name": {                   // 要查詢的field 
                "query": "編程思想",
                "operator": "or"        // 操作符
            }
        }
    }
}

3.4 指定命中的百分比 - minimum_should_match

minimum_should_match 用來指定最少要匹配多少比例的分詞, 才算符合條件並返回結果.

示例: 搜索name中包含"併發編程的藝術", 被拆分成"併發", "編程", "藝術"等詞, 現在要求至少匹配50%的分詞, 可以這樣:

GET shop/_search
{
    "query": {
        "match": {
            "name": {
                "query": "併發編程的藝術", 
                "minimum_should_match": "50%"
            }
        }
    }
}

當然這種需求也可以用 must、must_not、should 匹配同一個欄位的方式進行組合查詢.

3.5 多欄位的匹配 - multi_match

multi_match 用來對多個欄位同時進行匹配: 任意一個欄位中存在相應的分詞, 就可作為結果返回.

示例 ① : 查詢 name 或 desc 欄位中包含 "面試經典" 的文檔 —— 會對查詢串進行分詞:

GET shop/_search
{
    "query": {
        "multi_match": {
            "query": "面試經典", 
            "fields": [
                "name", 
                "desc"
            ]
        }
    }
}

示例 ② : 查詢 name 或 desc 欄位中同時包含 "面試經典" 的文檔 —— 不對查詢串進行分詞:

GET shop/_search
{
    "query": {
        "multi_match": {
            "query": "面試經典",
            "type": "cross_fields", // 還有best_fields、most_fields、phrase、phrase_prefix選項
            "operator": "and",      // 全部匹配, or是部分匹配
            "fields": [
                "name", 
                "desc"
            ]
        }
    }
}

4 bool query - 布爾查詢(真假查詢)

bool query, 顧名思義, 就是 真假/有無 查詢. 包括4個子查詢:

① must - 必須匹配, 類似於SQL中的 = ;
② must_not - 必須不匹配, 類似於SQL中的 != ;
③ should - 不強制匹配, 類似於SQL中的 or ;
④ filter - 過濾, 將滿足一定條件的文檔篩選出來.

除filter之外, 每個子查詢都會根據自己的條件計算出每個文檔的相關度分數, 然後bool綜合所有分數, 合併為一個.

4.1 簡單功能示例

GET shop/_search
{
    "query": {
        "bool": {
            "must":[ 
                { "match": { "name": "Java" } }
            ], 
            "must_not": [
                { "match": { "desc": "編程" } }
            ], 
            "should": [
                { "match": { "publisher": "機械工業" } }
            ], 
            "filter": {
                "bool": { 
                    "must": [
                        { "range": { "date": { "gte": "2010-01-01" }}},
                        { "range": { "price": { "lte": 99.00 }}}
                    ]
                }
            }
            
        }
    }
}

4.2 嵌套使用bool query

GET shop/_search
{
    "query": {
        "bool": {
            "should": [
                { "term": { "name.keyword": "Java編程思想" } },
                {
                    "bool": {
                        "must": [
                            { "term": { "product_desc": "刷頭" } }
                        ]
                    }
                }
            ]
        }
    }
}

4.3 直接filter操作 - 使用constant_score

如果不指定query條件而直接filter, 將拋出no [query] registered for [filter], 此時通過constant_score即可實現直接filter.

GET shop/_search 
{
    "query": {
        "constant_score": {
            "filter": {
                "range": { "price": { "gte": 80 } }
            }
        }
    }
}

4.4 指定should的匹配個數 - minimum_should_match

如果組合查詢中沒有must, 就會至少匹配一個should.

可以通過 minimum_should_match 指定匹配的should的個數.

GET shop/_search
{
    "query": {
        "bool": {
            "should": [
                { "match": { "name": "java" } }, 
                { "match": { "desc": "編程"} }, 
                { "match": { "price": 109 } }
            ], 
            "minimum_should_match": 2
        }
    }
}

參考資料

Elasticsearch DSL 常用語法介紹

版權聲明

作者: 馬瘦風(https://healchow.com)

出處: 博客園 馬瘦風的博客(https://www.cnblogs.com/shoufeng)

感謝閱讀, 如果文章有幫助或啟發到你, 點個[

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL簡介 SQL,即Structured Query Language 結構化查詢語言,用於存取數據以及查詢、更新和管理關係型資料庫。 常見的關係型資料庫有MySQL、SQL Server、Access、Oracle 等,SQL是關係型資料庫的通用語言。 SQL只是一個標準,由各關係資料庫廠商來實 ...
  • SQL語句(增、刪、改、查)一、增:有4種方法1.使用insert插入單行數據:語法:insert By hyx1013 at 2014-05-07 142 閱讀 0 回覆 0.0 希賽幣 By hyx1013 at 2014-05-07 142 閱讀 0 回覆 0.0 希賽幣 請點擊下麵回答中的" ...
  • 背景: 1. 檢查C:\Windows\System32\drivers\etc下的hosts文件有: 127.0.0.1 localhost 2.MySQL的my.ini配置文件: [mysqld] 節點下已經加入以下兩行代碼 skip-name-resolve #忽略主機名的方式訪問 lower ...
  • 一、添加操作 1. 添加節點: create (x:學生{studentId:'1001',age:20} 2. 添加關係: 對現有的節點添加關係 match (x:學生{studentId:1001}),(y:教師{tid:'09'}) create (x)-[jx:課程{name:'高數'}]- ...
  • 1. 利用xshell連接好服務後,輸入 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 下載軟體安裝包文件 2. 輸入 yum localinstall mysql57-community-relea ...
  • 一、清理老的mysql (1)卸載已有的mysql 查找以前是否裝有mysql命令: 1 rpm -qa|grep -i mysql 停止mysql服務,卸載之前安裝的mysql 1 rpm -ev 包名 如果卸載過程中報依賴錯誤,直接在卸載命名後面加參數 --nodeps 1 rpm -ev 包名 ...
  • 1.數據如下 TimePoint | PollutantCode | StatusName | Value | | | 2019 03 16 01:00:00.000|PM10|大氣溫度|11.096 2019 03 16 01:00:00.000|PM10|大氣壓力|102.354 2019 03 ...
  • --建表CREATE TABLE kudu_testdb.perf_test_t1( id string ENCODING PLAIN_ENCODING COMPRESSION SNAPPY, int_value int, bigint_value bigint, timestamp_value t ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...