Elasticsearch 字符串包含子字符串:高級查詢技巧

作者:來自 Elastic?Justin Castilla

想要獲得 Elastic 認證?看看下一次 Elasticsearch Engineer 培訓什么時候開始吧!

Elasticsearch 擁有大量新功能,可以幫助你為你的使用場景構建最佳的搜索解決方案。深入了解我們的示例 notebooks,開始免費 cloud 試用,或立即在本地機器上體驗 Elastic。


在 Elasticsearch 中,在字段中搜索包含特定子字符串的文檔是一項常見需求。本文將探討在 Elasticsearch 中進行查詢的高級技巧,以找到字段中包含特定子字符串的文檔。我們將討論 query_string、match_phrase 和 wildcard 查詢的使用,使用分析器和分詞器來提高搜索準確性,以及可用于定位字段中子字符串的 ES|QL 函數。如果你想了解精確值與全文本的使用差異,請查看本指南。

1)query_string 查詢

query_string 查詢是一種強大且靈活的方式,用于搜索包含特定子字符串的文檔。它允許你使用 Lucene 查詢語法,提供了多種搜索選項。以下是一個 query_string 查詢的示例,用于搜索包含子字符串 “example” 的文檔:

GET /_search
{"query": {"query_string": {"query": "*example*"}}
}

在這個示例中,星號( * )被用作通配符,匹配任意字符序列。query_string 查詢會返回在任意字段中包含子字符串 “example” 的文檔。但需要注意的是,前綴通配符可能會對你的集群性能產生負面影響。

2)match_phrase 查詢

match_phrase 查詢是另一種搜索包含特定子字符串文檔的方式。它會在字段中搜索精確短語,并且可以配合 slop 參數使用,以允許單詞順序的變化。以下是一個 match_phrase 查詢的示例,用于搜索包含子字符串 “quick brown” 的文檔:

GET /_search
{"query": {"match_phrase": {"field_name": "quick brown"}}
}

在這個示例中,match_phrase 查詢會返回在指定字段中包含確切短語 “quick brown” 的文檔。

3)wildcard 查詢

wildcard 查詢是一種簡單的方式,用于搜索包含特定子字符串的文檔。它使用通配符來匹配字段中任意字符序列。以下是一個 wildcard 查詢的示例,用于搜索包含子字符串 “exam” 的文檔:

GET /_search
{"query": {"wildcard": {"field_name": "*exam*"}}
}

在這個示例中,wildcard 查詢會返回在指定字段中包含子字符串 “exam” 的文檔。在這種情況下,也需要特別注意在 wildcard 查詢中使用前綴通配符,因為這可能會降低搜索性能。

4)分析器和分詞器

為了提高子字符串搜索的準確性,你可以使用分析器和分詞器來處理文檔中的文本。分析器負責將文本分解成 token,這些 token 會用于索引和搜索。分詞器是分析器的一個組件,用于將文本拆分為單個 token。

例如,你可以使用 n-gram 分詞器從輸入文本中創建不同長度的 token。這樣可以通過匹配不同長度的子字符串來提高子字符串搜索的準確性。以下是一個使用 n-gram 分詞器創建自定義分析器的示例:

PUT /my_index
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer"}},"tokenizer": {"my_tokenizer": {"type": "ngram","min_gram": 3,"max_gram": 5}}}}
}

在這個示例中,自定義分析器使用了一個 n-gram 分詞器,其最小 token 長度為 3,最大 token 長度為 5。你可以在索引文檔時以及進行子字符串搜索時使用這個自定義分析器。

需要注意的是,將大量文本分詞為 n?gram 會顯著增加倒排索引中的 term 數量,從而不必要地增加存儲,并降低索引和查詢的速度。最好只對需要子字符串匹配的文本字段使用 n?gram 分詞器。

5)ES|QL 函數

LOCATE

ES|QL 的 LOCATE 函數用于查找文檔中指定子字符串的首次出現位置。LOCATE 函數的調用方式如下:

這里,string 是要查詢的字段,substring 是目標子字符串,start 是字符串中的整數偏移量。這個函數會返回從提供的 start 位置之后首次出現子字符串的位置的整數值;如果子字符串不存在,則返回 0。

對于字段中出現多次的子字符串,不建議使用這個函數,因為 ES|QL 中不支持迭代處理,它是一種純聲明式、流水線風格的查詢語言。

MATCH

MATCH 函數會返回布爾值 true,如果傳入 query 參數的子字符串出現在傳入 field 參數的文本中。它適用于一般的全文搜索,相關性由術語是否存在決定,而不考慮它們的位置。

可選的命名函數參數可以傳入以獲得更細粒度的控制,比如模糊度( fuzziness )、用于解釋文本的操作符,以及寬容度( leniency )值。

注意,查詢中可以包含多個詞項,結果可能包含這些詞項中的任意一個,但不一定按給定順序出現。

示例:搜索 “quick brown fox” 會匹配包含 “the fox is quick and brown” 的文檔。

MATCH_PHRASE

MATCH_PHRASE 與 MATCH 函數類似,但它必須匹配傳入函數的整個短語,而不是單個詞項。它適用于你想搜索確切短語而不僅僅是單個詞項是否存在的情況。

MATCH_PHRASE 也有可選的命名參數,允許各種細化設置,比如 slop 和 token 分析器。

示例:搜索 “quick brown fox” 只會匹配包含確切短語 “quick brown fox” 的文檔。

KQL

KQL 查詢指的是用 Kibana Query Language(KQL)編寫的查詢。KQL 是 Kibana 中使用的搜索和過濾語言,Kibana 是我們的數據可視化工具。Elastic 已將這種查詢語言引入 ES|QL,以增強搜索功能。

示例:搜索 “foo: bar” AND “baz > 12” 會返回所有 “foo” 字段包含 “bar” 且 “baz” 字段值大于 12 的文檔。

QSTR

QSTR 是 Lucene 使用的一種查詢格式,提供對文本字段的靈活、基于相關性的搜索,類似于在 Elasticsearch DSL 中使用 match 查詢。

示例:在工單索引中使用 QSTR 搜索 "timeout error OR "connection refused"",會返回包含 “timeout error” 或確切短語 “connection refused” 的工單文檔。

QSTR 還提供最多的選項,能夠在搜索中提供高度的粒度和靈活性。

附加內容:區間查詢和跨度查詢

區間查詢 - interval queries

區間查詢是搜索必須按照給定順序出現的詞項的查詢。以下是一個示例查詢:

POST _search
{"query": {"intervals" : {"my_text" : {"all_of" : {"ordered" : true,"intervals" : [{"match" : {"query" : "it's rainy outside","max_gaps" : 0,"ordered" : true}},{"any_of" : {"intervals" : [{ "match" : { "query" : "curl up with a good book" } },{ "match" : { "query" : "listen to a podcast" } }]}}]}}}}
}

該查詢搜索短語 “it’s rainy outside”,后面緊跟著 “curl up with a good book” 或 “listen to a podcast” 中的任意一個詞項。

這句話會匹配:“When it’s rainy outside, I like to dress up in cozy clothes, turn on some classical music, and curl up with a good book.”

這句話不會匹配:“I find it best to listen to a podcast in my car when there’s a lot of traffic and it’s rainy outside.”

這是因為 “all_of”: {“ordered”: true} 條款,要求上述順序必須嚴格遵守。

這是一個非常強大且可擴展的查詢,適合用于動態且復雜的子字符串搜索。

跨度查詢 - span

跨度查詢通過操作 token 偏移量而非原始文本,提供了一種低級且帶位置感知的子字符串搜索方法。跨度可以嵌套子跨度,這些子跨度必須滿足諸如在指定距離內出現在另一個跨度之前或之后等約束條件。這使得它們非常適合處理某些領域(如法律文件),在這些領域中常見術語在靠近特定關鍵詞時會獲得特殊含義。

GET /_search
{"query": {"span_near": {"clauses": [{ "span_term": { "field": "contract" } },{ "span_term": { "field": "breach" } }],"slop": 3,"in_order": false}}
}

例如,你可以使用 span_near 查詢來查找距離 “breach” 四個 token 以內的 “contract”。一份冗長的法律摘要中可能多次提到 “contract”,但只有兩個地方出現了短語 “breach of obligation and contract” 或 “breach of contract litigation”。通過調整跨度距離(例如 slop: 3),你只會匹配這兩個上下文,忽略所有其他的 “contract” 出現。

總結

Elasticsearch 提供了多種高級技術,用于查詢包含特定子字符串的文檔。通過使用 query_string、match_phrase 和 wildcard 查詢,自定義分析器和分詞器,ES|QL 函數,甚至是區間查詢或跨度查詢,你可以提高子字符串搜索的準確性和靈活性。嘗試這些技術,找到最適合你具體用例和數據集的方法。

原文:https://www.elastic.co/search-labs/blog/elasticsearch-string-contains-substring

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

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

相關文章

Vue、Laravel 項目初始化命令對比 / curl 命令/ CORS 機制總結與案例

前言一個疑問衍生出另一個疑問再衍生出又一個疑問,于是有了這篇文章。一、Vue 項目初始化命令 基于 Vite 創建 Vue 項目 命令:npm create vitelatest my-project -- --template vue適用場景:需輕量級、高速開發環境關鍵點:使用 Vi…

Jenkins 流水線配置

Jenkinsfile dsl文件:pipeline {// 指定任務在哪個集群節點執行agent any// 聲明全局變量environment {keyvalueAPPLICATION_NAMEspringboot-demo // 項目名稱HOST_PORT7777 // 宿主機暴露服務端口CONTAINER_PORT8080 // 容器內部服務端口…

服務器重裝后如何“復活”舊硬盤上的 Anaconda 環境?—— 一次完整的排錯與恢復記錄

目錄 摘要 一、 背景:熟悉的陌生人 二、 問題浮現:一次次失敗的嘗試 問題一:source activate 失效,被寫死的舊路徑 問題二:官方安裝器修復失敗,神秘的“進程池損壞” 問題三:核心腳本也“背…

Redis的多并發實際業務場景下的使用分析:布隆過濾器

文章目錄前言什么是布隆過濾器項目中引入布隆過濾器與緩存結合的最佳實踐場景:高并發用戶訪問商品詳情頁(防止緩存穿透)總結:前言 okok 我們已經學完了 所有的redis中的常用的數據結構 下面就是進階 我會用一系列的例子 去講解 如…

【AI】人工智能領域關鍵術語全解析

一、前言 人工智能(AI)作為當今最熱門的技術領域之一,正在深刻改變著我們的生活和工作方式。然而,對于初學者或非技術背景的人士來說,理解AI領域的專業術語可能是一項挑戰。本文旨在全面解析人工智能領域的關鍵術語&a…

【Linux基礎知識系列】第四十三篇 - 基礎正則表達式與 grep/sed

在Linux系統中,正則表達式是一種強大的文本處理工具,廣泛用于文本搜索、替換和批量處理。通過掌握基礎正則表達式的語法,結合grep和sed命令,用戶可以高效地完成復雜的文本處理任務。無論是數據分析師、軟件開發者還是系統管理員&a…

SIMATIC S7-1200的以太網通信能力:協議與資源詳細解析

SIMATIC S7-1200的以太網通信能力:協議與資源解析 在工業自動化領域,PLC的通信能力往往直接影響著整個控制系統的靈活性與高效性。西門子SIMATIC S7-1200系列PLC作為一款廣泛應用的中小型控制器,其強大的以太網通信功能是其核心優勢之一。本文…

什么是高防 IP?從技術原理到實戰部署的深度解析

目錄 前言 一、高防 IP 的定義與核心價值 二、高防 IP 的技術原理與架構 2.1 流量牽引技術 2.2 流量清洗引擎 2.3 回源機制 三、高防 IP 的核心防護技術詳解 3.1 DDoS 攻擊防御技術 3.2 高防 IP 的彈性帶寬設計 四、實戰:基于 Linux 的高防 IP 環境配置 …

NW710NW713美光固態閃存NW719NW720

美光NW系列固態閃存深度解析:技術、性能與市場洞察一、技術架構與核心創新美光NW系列固態閃存(包括NW710、NW713、NW719、NW720)的技術根基源于其先進的G9 NAND架構。該架構通過5納米制程工藝和多層3D堆疊技術,在單位面積內實現了…

JVM匯總

1.什么是JVM?Java虛擬機,Java具有自動內存管理等一系列特性,為實現Java跨平臺,一次編譯處處執行。2.JVM結構圖3.類加載器-入口加載class文件,將類信息存放到運行時數據區的方法區內存空間中通過魔數和文件格式來判斷是…

2024.09.20 leetcode刷題記錄

# 前言 昨天發布了第一遍博客,感覺很好,趁著我現在還是很感興趣就多發幾遍,希望能堅持下去,在這里記錄下自己學習成長的經歷。 今天是周五,下周一就又要去實習啦,距離上一段實習剛結束一個月,之…

SQLite3 中列(變量)的特殊屬性

在 SQLite3 中,列的特殊屬性通常通過約束(Constraints)和數據類型修飾符來定義。這些屬性可以在創建表時指定,用于限制數據的完整性或定義特殊行為。以下是 SQLite3 支持的主要特殊屬性及其說明: 1. 主鍵約束&#xff…

Datawhale AI 夏令營:用戶洞察挑戰賽 Notebook(2)

針對文本聚類優化 優化TF-IDF特征工程# 調整ngram_range:設置為(1, 2),捕捉單字和雙字詞(如“不錯”“不滿意”)。 # 限制特征數量:通過max_features5000保留高信息密度特征,降低維度。 # 過濾低頻/高頻詞&…

【博主親測可用】PS2025最新版:Adobe Photoshop 2025 v26.8.1 激活版(附安裝教程)

軟件簡介 Adobe Photoshop 2025是Adobe公司開發的一款圖像處理軟件。作為行業標準的數字圖像編輯工具,其核心定位是創意設計、后期攝影、3D建模和AI驅動創作,適用于專業設計師、攝影師、插畫家和多媒體創作者。界面設計簡單直觀,易于操作&…

unity A星尋路

算法 fCost gCost hCost gCost 是當前節點到移動起始點的消耗,hCost是當前節點到終點的消耗 網格為變成為1的矩形,左右相鄰的兩個網格直接的gCost為1,斜對角相鄰的兩個網格的gCost為1.4 hCost 當前網格到終點網格的 水平距離 垂直距離 比如…

十一 Javascript的按值傳遞

你將知道:“傳遞” 值是什么意思什么是按值傳遞傳遞物品JavaScript 中沒有傳遞引用!介紹當需要在 JavaScript 中分配或簡單地將一個值傳遞給其他標識符時,我們就會看到通常所說的 按值傳遞 。嚴格來說,JavaScript 中傳遞值的方式只…

SpringBoot ThreadLocal 全局動態變量設置

需求說明: 現有一個游戲后臺管理系統,該系統可管理多個大區的數據,但是需要使用大區id實現數據隔離,并且提供了大區選擇功能,先擇大區后展示對應的數據。需要實現一下幾點: 1.前端請求時,area_i…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘logging’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘logging’問題 摘要: 在使用 PyCharm 2025 控制臺通過 pip install 安裝第三方庫時,常會遇到諸如 ModuleNotFoundError: No module name…

打破技術債困境:從“保持現狀”到成為變革的推動者

相信許多在科技行業的同行都面臨過類似的挑戰:明知系統存在“技術債”,卻因為溝通成本、團隊壓力和短期KPI等原因,難以推動改進,最終陷入“想做卻不敢做”的矛盾心態。這不僅影響個人心情,更重要的是,它像一…

Spring Boot 整合 RabbitMQ

Spring Boot 整合 RabbitMQ 一、概述:RabbitMQ 是什么? 你可以把 RabbitMQ 想象成一個「快遞中轉站」。 比如你在網上買了一本書,賣家(生產者)把包裹(消息)交給快遞站(RabbitMQ&…