【Elasticsearch】多字段查詢方式匯總

在 Elasticsearch 中,實現多字段查詢的常見方式有以下幾種,每種方式適用于不同的場景:

---

### 1. **`multi_match` 查詢**
? ?- **用途**:在多個字段中執行同一查詢,支持多種匹配策略。
? ?- **關鍵參數**:
? ? ?- `type`:指定匹配策略(如 `best_fields`, `most_fields`, `cross_fields`, `phrase`, `phrase_prefix`)。
? ? ?- `fields`:指定查詢的字段列表(支持通配符,如 `title^3` 表示字段權重提升)。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"multi_match": {
? ? ? ? ? ?"query": "elasticsearch",
? ? ? ? ? ?"fields": ["title", "content^2", "tags"],
? ? ? ? ? ?"type": "best_fields"
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 2. **`bool` 查詢組合多個子句**
? ?- **用途**:通過 `bool` 查詢的 `should`, `must`, `filter` 等子句組合多個字段的條件。
? ?- **場景**:需要更復雜的邏輯(如部分字段必須匹配,部分字段可選匹配)。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"bool": {
? ? ? ? ? ?"should": [
? ? ? ? ? ? ?{ "match": { "title": "elasticsearch" } },
? ? ? ? ? ? ?{ "match": { "description": "elasticsearch" } }
? ? ? ? ? ?],
? ? ? ? ? ?"minimum_should_match": 1
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 3. **`cross_fields` 類型**
? ?- **用途**:將查詢詞拆分后,分散到多個字段中匹配(如處理姓名分散在 `first_name` 和 `last_name` 的場景)。
? ?- **特點**:通過 `operator` 和 `analyzer` 統一控制字段行為。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"multi_match": {
? ? ? ? ? ?"query": "John Smith",
? ? ? ? ? ?"fields": ["first_name", "last_name"],
? ? ? ? ? ?"type": "cross_fields",
? ? ? ? ? ?"operator": "and"
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 4. **`query_string` 或 `simple_query_string`**
? ?- **用途**:使用 Lucene 語法直接指定多字段查詢,適合熟悉搜索語法的用戶。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"query_string": {
? ? ? ? ? ?"query": "(title:elasticsearch) OR (content:search)",
? ? ? ? ? ?"default_field": "content"
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 5. **`copy_to` 字段合并**
? ?- **用途**:通過 `copy_to` 將多個字段值復制到一個新字段,簡化單字段查詢。
? ?- **步驟**:
? ? ?1. 定義映射時指定 `copy_to`:
? ? ? ?```json
? ? ? ?"mappings": {
? ? ? ? ?"properties": {
? ? ? ? ? ?"title": { "type": "text", "copy_to": "full_text" },
? ? ? ? ? ?"content": { "type": "text", "copy_to": "full_text" }
? ? ? ? ?}
? ? ? ?}
? ? ? ?```
? ? ?2. 查詢合并后的字段:
? ? ? ?```json
? ? ? ?GET /_search
? ? ? ?{
? ? ? ? ?"query": {
? ? ? ? ? ?"match": { "full_text": "elasticsearch" }
? ? ? ? ?}
? ? ? ?}
? ? ? ?```

---

### 6. **`dis_max` 查詢**
? ?- **用途**:在多個查詢中取最佳匹配的評分,忽略其他字段的評分(避免評分累加)。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"dis_max": {
? ? ? ? ? ?"queries": [
? ? ? ? ? ? ?{ "match": { "title": "elasticsearch" } },
? ? ? ? ? ? ?{ "match": { "content": "elasticsearch" } }
? ? ? ? ? ?],
? ? ? ? ? ?"tie_breaker": 0.3
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 7. **`nested` 查詢**
? ?- **用途**:針對嵌套對象(nested type)中的多個字段進行聯合查詢。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"nested": {
? ? ? ? ? ?"path": "comments",
? ? ? ? ? ?"query": {
? ? ? ? ? ? ?"bool": {
? ? ? ? ? ? ? ?"must": [
? ? ? ? ? ? ? ? ?{ "match": { "comments.author": "John" } },
? ? ? ? ? ? ? ? ?{ "match": { "comments.text": "elasticsearch" } }
? ? ? ? ? ? ? ?]
? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### **總結**
| 方法 ? ? ? ? ? ? ? ?| 適用場景 ? ? ? ? ? ? ? ? ? ? ? ? ? |
|---------------------|----------------------------------|
| `multi_match` ? ? ? | 快速實現多字段查詢,支持多種匹配策略。 ? ?|
| `bool` + `should` ? | 需要復雜邏輯組合時使用。 ? ? ? ? ? ? ?|
| `cross_fields` ? ? ?| 字段間內容互補(如姓名、地址拆分存儲)。 ?|
| `copy_to` ? ? ? ? ? | 預定義合并字段,簡化后續查詢。 ? ? ? ? |
| `dis_max` ? ? ? ? ? | 避免低相關性字段拉低總體評分。 ? ? ? ? |
| `nested` ? ? ? ? ? ?| 嵌套對象內的多字段聯合查詢。 ? ? ? ? ? |

根據數據結構和查詢需求(如是否需要字段權重、是否處理嵌套對象等),選擇最合適的方式。

在 Elasticsearch 8.17 版本中,支持的多字段查詢方式非常豐富,涵蓋了從簡單到復雜的多種場景。以下是 Elasticsearch 8.17 版本中支持的主要多字段查詢方式及其特點:

---

### 1. **`multi_match` 查詢**
? ?- **用途**:在多個字段中執行同一查詢,支持多種匹配策略。
? ?- **關鍵參數**:
? ? ?- `type`:指定匹配策略(如 `best_fields`, `most_fields`, `cross_fields`, `phrase`, `phrase_prefix`)。
? ? ?- `fields`:指定查詢的字段列表(支持通配符,如 `title^3` 表示字段權重提升)。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"multi_match": {
? ? ? ? ? ?"query": "elasticsearch",
? ? ? ? ? ?"fields": ["title", "content^2", "tags"],
? ? ? ? ? ?"type": "best_fields"
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 2. **`bool` 查詢組合多個子句**
? ?- **用途**:通過 `bool` 查詢的 `should`, `must`, `filter` 等子句組合多個字段的條件。
? ?- **場景**:需要更復雜的邏輯(如部分字段必須匹配,部分字段可選匹配)。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"bool": {
? ? ? ? ? ?"should": [
? ? ? ? ? ? ?{ "match": { "title": "elasticsearch" } },
? ? ? ? ? ? ?{ "match": { "description": "elasticsearch" } }
? ? ? ? ? ?],
? ? ? ? ? ?"minimum_should_match": 1
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 3. **`cross_fields` 類型**
? ?- **用途**:將查詢詞拆分后,分散到多個字段中匹配(如處理姓名分散在 `first_name` 和 `last_name` 的場景)。
? ?- **特點**:通過 `operator` 和 `analyzer` 統一控制字段行為。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"multi_match": {
? ? ? ? ? ?"query": "John Smith",
? ? ? ? ? ?"fields": ["first_name", "last_name"],
? ? ? ? ? ?"type": "cross_fields",
? ? ? ? ? ?"operator": "and"
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 4. **`query_string` 或 `simple_query_string`**
? ?- **用途**:使用 Lucene 語法直接指定多字段查詢,適合熟悉搜索語法的用戶。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"query_string": {
? ? ? ? ? ?"query": "(title:elasticsearch) OR (content:search)",
? ? ? ? ? ?"default_field": "content"
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 5. **`copy_to` 字段合并**
? ?- **用途**:通過 `copy_to` 將多個字段值復制到一個新字段,簡化單字段查詢。
? ?- **步驟**:
? ? ?1. 定義映射時指定 `copy_to`:
? ? ? ?```json
? ? ? ?"mappings": {
? ? ? ? ?"properties": {
? ? ? ? ? ?"title": { "type": "text", "copy_to": "full_text" },
? ? ? ? ? ?"content": { "type": "text", "copy_to": "full_text" }
? ? ? ? ?}
? ? ? ?}
? ? ? ?```
? ? ?2. 查詢合并后的字段:
? ? ? ?```json
? ? ? ?GET /_search
? ? ? ?{
? ? ? ? ?"query": {
? ? ? ? ? ?"match": { "full_text": "elasticsearch" }
? ? ? ? ?}
? ? ? ?}
? ? ? ?```

---

### 6. **`dis_max` 查詢**
? ?- **用途**:在多個查詢中取最佳匹配的評分,忽略其他字段的評分(避免評分累加)。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"dis_max": {
? ? ? ? ? ?"queries": [
? ? ? ? ? ? ?{ "match": { "title": "elasticsearch" } },
? ? ? ? ? ? ?{ "match": { "content": "elasticsearch" } }
? ? ? ? ? ?],
? ? ? ? ? ?"tie_breaker": 0.3
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 7. **`nested` 查詢**
? ?- **用途**:針對嵌套對象(nested type)中的多個字段進行聯合查詢。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"nested": {
? ? ? ? ? ?"path": "comments",
? ? ? ? ? ?"query": {
? ? ? ? ? ? ?"bool": {
? ? ? ? ? ? ? ?"must": [
? ? ? ? ? ? ? ? ?{ "match": { "comments.author": "John" } },
? ? ? ? ? ? ? ? ?{ "match": { "comments.text": "elasticsearch" } }
? ? ? ? ? ? ? ?]
? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 8. **`combined_fields` 查詢(Elasticsearch 7.11+)**
? ?- **用途**:在多個字段中聯合搜索一個完整的短語或關鍵詞,支持字段權重和統一的文本分析。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"combined_fields": {
? ? ? ? ? ?"query": "distributed search engine",
? ? ? ? ? ?"fields": ["title", "content", "description"],
? ? ? ? ? ?"operator": "and"
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 9. **`span_near` 和 `span_multi` 查詢**
? ?- **用途**:用于復雜的跨度查詢(span queries),支持多字段的鄰近匹配。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"span_near": {
? ? ? ? ? ?"clauses": [
? ? ? ? ? ? ?{ "span_term": { "title": "elasticsearch" } },
? ? ? ? ? ? ?{ "span_term": { "content": "search" } }
? ? ? ? ? ?],
? ? ? ? ? ?"slop": 5,
? ? ? ? ? ?"in_order": false
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### 10. **`script_score` 查詢**
? ?- **用途**:通過腳本自定義評分邏輯,支持多字段聯合評分。
? ?- **示例**:
? ? ?```json
? ? ?GET /_search
? ? ?{
? ? ? ?"query": {
? ? ? ? ?"script_score": {
? ? ? ? ? ?"query": {
? ? ? ? ? ? ?"bool": {
? ? ? ? ? ? ? ?"should": [
? ? ? ? ? ? ? ? ?{ "match": { "title": "elasticsearch" } },
? ? ? ? ? ? ? ? ?{ "match": { "content": "elasticsearch" } }
? ? ? ? ? ? ? ?]
? ? ? ? ? ? ?}
? ? ? ? ? ?},
? ? ? ? ? ?"script": {
? ? ? ? ? ? ?"source": "doc['title'].value.length() + doc['content'].value.length()"
? ? ? ? ? ?}
? ? ? ? ?}
? ? ? ?}
? ? ?}
? ? ?```

---

### **總結**
| 方法 ? ? ? ? ? ? ? ?| 適用場景 ? ? ? ? ? ? ? ? ? ? ? ? ? |
|---------------------|----------------------------------|
| `multi_match` ? ? ? | 快速實現多字段查詢,支持多種匹配策略。 ? ?|
| `bool` + `should` ? | 需要復雜邏輯組合時使用。 ? ? ? ? ? ? ?|
| `cross_fields` ? ? ?| 字段間內容互補(如姓名、地址拆分存儲)。 ?|
| `copy_to` ? ? ? ? ? | 預定義合并字段,簡化后續查詢。 ? ? ? ? |
| `dis_max` ? ? ? ? ? | 避免低相關性字段拉低總體評分。 ? ? ? ? |
| `nested` ? ? ? ? ? ?| 嵌套對象內的多字段聯合查詢。 ? ? ? ? ? |
| `combined_fields` ? | 多字段聯合搜索短語,支持統一分析器。 ? ? |
| `span_near` ? ? ? ? | 復雜的鄰近匹配查詢。 ? ? ? ? ? ? ? ? |
| `script_score` ? ? ?| 自定義評分邏輯,支持多字段聯合評分。 ? ? |

根據數據結構和查詢需求(如是否需要字段權重、是否處理嵌套對象等),選擇最合適的方式。

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

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

相關文章

多線之旅:wait 與 notify

今天小編繼續來分享下多線程中的一些內容。 在多線程環境下,由于線程調度的不確定性,所以我們有時候無法很好的去保證其線程的執行順序。 但是呢,我們又要實現這個順序執行,所以我們可以使用到這兩個方法,wait 和 no…

批量修改mysql字符串字段子字符串

替換子字符串 使用 REPLACE 函數替換字段中的特定子字符串。 示例: 將 table_name 表中 column_name 字段的所有 old_value 替換為 new_value。 UPDATE table_name SET column_name REPLACE(column_name, old_value, new_value) WHERE column_name LIKE %old_val…

達夢:AWR 生成

目錄標題 AWR 性能診斷與報告生成1. 檢查 AWR 系統狀態2. 查看數據庫中的所有表空間3. 查看現有的 AWR 快照4. 設置 AWR 快照的時間間隔5. 創建 AWR 快照6. 查看最新的 AWR 快照7. 生成 AWR HTML 報告8. 將 AWR 報告保存到指定文件鏈接總結 自動工作集負載信息庫 AWR 報告解析指…

股票數據接口API實例代碼python、JAVA等多種語言演示免費獲取實時數據、歷史數據、CDMA、KDJ等指標數據配有API說明文檔

? 本文中所有接口均可直接在瀏覽器打開獲取數據,為了便于大家驗證有效性,已經做好了超鏈接,直接點擊即可! 滬深兩市股票列表 API接口鏈接(可點擊驗證):https://api.mairui.club/hslt/list/b…

深入理解DOM:22個核心知識點與代碼示例

本文系統介紹DOM相關的22個核心概念,每個知識點均提供代碼示例及簡要說明,幫助開發者全面掌握DOM操作技巧。 一、DOM基礎概念 1. DOM概念 DOM(Document Object Model)是HTML/XML的編程接口,通過JavaScript可動態修改…

【Map vs Set】:Java數據存儲的“雙子星”對決

個人主頁:?喜歡做夢 歡迎 👍點贊 ?關注 ??收藏 💬評論 目錄 🍰一、搜索 🍮1.概念 🍮2.模型 🍰二、Map 🍨1.什么是Map? 🍨2.Map的實例化 &…

【C語言 】C語言 桌游開發數字競拍(源碼)【獨一無二】

👉博__主👈:米碼收割機 👉技__能👈:C/Python語言 👉專__注👈:專注主流機器人、人工智能等相關領域的開發、測試技術。 【C語言 】C語言 桌游開發數字競拍(源碼…

Reinforcement Learning Heats Up 強化學習持續升溫

Reinforcement Learning Heats Up 強化學習持續升溫 核心觀點:強化學習正成為構建具有高級推理能力大語言模型(LLMs)的重要途徑。 最新進展 模型示例:近期出現了如DeepSeek - R1及其變體(DeepSeek - R1 - Zero&#xf…

Whisper+T5-translate實現python實時語音翻譯

1.首先下載模型,加載模型 import torch import numpy as np import webrtcvad import pyaudio import queue import threading from datetime import datetime from faster_whisper import WhisperModel from transformers import AutoTokenizer, AutoModelForSeq2…

湖倉分析|浙江霖梓基于 Doris + Paimon 打造實時/離線一體化湖倉架構

導讀:浙江霖梓早期使用 CDH 產品套件搭建了大數據系統,面臨業務邏輯冗余、查詢效率低下等問題,基于 Apache Doris 進行整體架構與表結構的重構,并基于湖倉一體和查詢加速展開深度探索與實踐,打造了 Doris Paimon 的實…

git bash在github的庫中上傳或更新本地文件

一、將本地文件上傳到 GitHub 倉庫 1. 創建 GitHub 倉庫 如果你還沒有在 GitHub 上創建倉庫,首先需要創建一個新的倉庫: 登錄到 GitHub。點擊右上角的 按鈕,選擇 New repository。給你的倉庫起個名字,并選擇 Public 或 Privat…

Jmeter壓測怎么控制TPS

壓測固定TPS的接口 有些任務需要我們控制接口的TPS,例如每秒請求一次。 TPS定時器 然后1個并發持續運行 壓測結果 需要注意TPS在1.0/s左右,有時可能是1.2、1.3,定時器會自動調整壓力,讓TPS保持在1.0左右。

ArcGISPro 新建shp+數據結構

import arcpy# 設置工作空間和 Shapefile 存放路徑 shp_path r"C:\path\to\your\folder\PolygonZY.shp" # Shapefile 存放路徑 fields [("CHBH", "TEXT", 20),("ZCMC", "TEXT", 100),("ZCLX", "TEXT"…

理解WebGPU 中的 GPUAdapter :連接瀏覽器與 GPU 的橋梁

在 WebGPU 開發中, GPUAdapter 是一個至關重要的對象,它作為瀏覽器與 GPU 之間的橋梁,為開發者提供了請求 GPU 設備、查詢 GPU 特性以及獲取適配器信息的能力。本文將詳細介紹 GPUAdapter 的核心屬性和方法,并通過實際代碼…

信呼OA辦公系統sql注入漏洞分析

漏洞描述 信呼OA辦公系統uploadAction存在SQL注入漏洞,攻擊者可利用該漏洞獲取數據庫敏感信息。 環境搭建 源碼下載地址:https://github.com/rainrocka/xinhu 下載后解壓到本地網站根目錄下,配置好數據庫,然后安裝即可 默認密…

vue框架生命周期詳細解析

Vue.js 的生命周期鉤子函數是理解 Vue 組件行為的關鍵。每個 Vue 實例在創建、更新和銷毀過程中都會經歷一系列的生命周期階段,每個階段都有對應的鉤子函數,開發者可以在這些鉤子函數中執行特定的操作。 Vue 生命周期概述 Vue 的生命周期可以分為以下幾…

一文深入了解DeepSeek-R1:模型架構

本文深入探討了 DeepSeek-R1 模型架構。讓我們從輸入到輸出追蹤 DeepSeek-R1 模型,以找到架構中的新發展和關鍵部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架構。本文旨在涵蓋其設計的所有重要方面。 📝 1. 輸入上下文長度 DeepSeek-R1的輸入上下文長…

開發基礎(8):鴻蒙圖表開發

mpchart mpchart是一個包含各種類型圖表的圖表庫,主要用于業務數據匯總,例如銷售數據走勢圖,股價走勢圖等場景中使用,方便開發者快速實現圖表UI,mpchart主要包括線形圖、柱狀圖、餅狀圖、蠟燭圖、氣泡圖、雷達圖、瀑布圖等自定義圖表庫。 柱狀圖 導入import {BarChart, …

條款03:盡可能使用 const

const 允許我們指定一個語義約束,使某個值應該保持不變 1、const 修飾 變量,指針,函數,函數返回值等,可以使程序減少錯誤,或者更容易檢測錯誤: 指針常量:int* const p;//指針地址不…

算法兵法全略(譯文)

目錄 始計篇 謀攻篇 軍形篇 兵勢篇 虛實篇 軍爭篇 九變篇 行軍篇 地形篇 九地篇 火攻篇 用間篇 始計篇 算法,在當今時代,猶如國家關鍵的戰略武器,也是處理各類事務的核心樞紐。算法的世界神秘且變化萬千,不夠賢能聰慧…