探索 Elasticsearch 8.X Terms Set 檢索的應用與原理

大資料技術前線發表於2023-05-09

來源:銘毅天下Elasticsearch

1、Terms Set 檢索簡介

Terms Set查詢是Elasticsearch中一種強大的查詢型別,主要用於處理多值欄位中的文件匹配。

其核心功能在於,它可以檢索至少匹配一定數量給定詞項的文件,其中匹配的數量可以是固定值,也可以是基於另一個欄位的動態值。這種查詢方式在處理具有多個屬性、分類或標籤的複雜資料時非常有用。

2、Terms Set 檢索產生背景

Terms Set查詢是Elasticsearch 6.1版本中引入的新功能。在6.1版本之前,Elasticsearch提供了多種查詢型別,但在處理多值欄位時,使用者可能需要編寫更復雜的查詢或使用指令碼來實現特定的匹配條件。

引入Terms Set查詢的主要目的是為了簡化這類場景下的查詢處理。使用Terms Set查詢,使用者可以輕鬆地找到至少匹配一定數量給定詞項的文件,同時支援基於其他欄位或指令碼動態計算匹配數量。這種查詢方式在處理具有多個屬性、分類或標籤的複雜資料時非常有用。

3、Terms Set 檢索應用場景

Terms Set查詢在處理多值欄位和特定匹配條件時非常有用。

以下是一些常見的應用場景:

標籤系統

在具有標籤系統的應用中,如部落格、社交媒體或新聞網站,使用者可能會為內容(如文章、帖子或產品)分配多個標籤。使用Terms Set查詢,可以找到至少具有一定數量給定標籤的內容。這對於篩選和推薦功能非常有用。

搜尋引擎

在搜尋引擎中,使用者可能會輸入多個關鍵詞來查詢相關內容。使用Terms Set查詢,可以根據文件與給定關鍵詞的匹配程度對結果進行排序。例如,可以找到至少匹配使用者輸入關鍵詞一半數量的文件。

電子商務

在電子商務應用中,產品可能具有多個屬性,如顏色、尺寸或品牌。使用Terms Set查詢,可以找到同時滿足多個屬性條件的產品。例如,可以找到至少具有2個指定顏色和3個指定尺寸的產品。

文件管理系統

在文件管理系統中,文件可能具有多個分類或標籤。使用Terms Set查詢,可以根據文件的分類或標籤匹配程度進行篩選。例如,可以找到與給定分類或標籤至少匹配一定數量的文件。

技能匹配

在招聘或求職應用中,候選人可能具有多個技能。使用Terms Set查詢,可以找到至少具有一定數量給定技能的候選人。這對於篩選和推薦合適的候選人非常有用。總之,Terms Set查詢在處理具有多個屬性、分類或標籤的複雜資料時非常有用。透過靈活地設定匹配數量條件,可以輕鬆地找到滿足特定要求的文件。

4、Terms Set 檢索的工作原理

Terms Set查詢的基本語法如下:

{
  "query": {
    "terms_set": {
      "<欄位名>": {
        "terms": ["<詞項1>""<詞項2>", ...],
        "minimum_should_match_field""<匹配數量欄位名>",
        "minimum_should_match_script": {
          "source""<指令碼>"
        }
      }
    }
  }
}

Terms Set查詢的工作原理可以分為以下幾個步驟:

  • 指定要查詢的欄位名,這個欄位通常是一個多值欄位,如陣列或集合。
  • 提供一組詞項,用於在指定欄位中進行匹配。
  • 設定匹配數量的條件,可以有兩種方式(二者不可兼得,只能選擇其中一個):
    • 透過 minimum_should_match_field 引數指定一個包含匹配數量的欄位名。
    • 使用 minimum_should_match_script 引數提供一個指令碼,該指令碼可以動態計算匹配數量。
  • Elasticsearch會檢索匹配給定詞項數量要求的文件,並將它們作為查詢結果返回。

5、Terms Set 檢索應用示例

假設我們有一個電影資料庫,每部電影都有多個標籤。現在,我們希望找到同時具有一定數量給定標籤的電影。

以下是一個使用Terms Set查詢的例子:

5.1 資料準備

首先,建立一個名為movies的索引:

PUT movies
{
  "mappings": {
    "properties": {
      "title": {
        "type""text"
      },
      "tags": {
        "type""keyword"
      },
      "tags_count": {
        "type""integer"
      }
    }
  }
}

然後,向索引中新增一些電影資料:

POST /movies/_bulk
{"index":{"_id":1}}
{"title":"電影1","tags":["喜劇","動作","科幻"],"tags_count":3}
{"index":{"_id":2}}
{"title":"電影2","tags":["喜劇","愛情","家庭"],"tags_count":3}
{"index":{"_id":3}}
{"title":"電影3","tags":["動作","科幻","喜劇"],"tags_count":3}

5.2 使用Terms Set 檢索電影

現在,我們希望找到至少具有2個給定標籤("喜劇"、"動作"和"科幻")的電影。我們可以使用Terms Set查詢來實現這個需求:

基於minimum_should_match_field 檢索

 GET /movies/_search
{
  "query": {
    "terms_set": {
      "tags": {
        "terms": ["喜劇""動作""科幻"],
        "minimum_should_match_field""tags_count"
      }
    }
  }
}

上述程式碼使用 terms_set 查詢,在名為 movies 的索引中檢索滿足動態匹配數量要求的電影,匹配數量由 tags_count 欄位決定,查詢標籤包括"喜劇"、"動作"和"科幻"。返回結果如下,文件1被召回。

探索 Elasticsearch 8.X Terms Set 檢索的應用與原理

再看如下的檢索。

基於minimum_should_match_script 檢索

GET /movies/_search
{
  "query": {
    "terms_set": {
      "tags": {
        "terms": [
          "喜劇",
          "動作",
          "科幻"
        ],
        "minimum_should_match_script": {
          "source""doc['tags_count'].value * 0.7"
        }
      }
    }
  }
}

如上檢索從名為 movies 的索引中檢索至少匹配給定標籤("喜劇"、"動作"和"科幻")總數70%數量要求的電影,匹配數量由自定義指令碼doc['tags_count'].value * 0.7動態計算。“_id”為1和“_id”為3的兩個文件被召回。

探索 Elasticsearch 8.X Terms Set 檢索的應用與原理

6、小結

Terms Set查詢是Elasticsearch中一種非常強大的查詢方式,適用於處理具有多個屬性、分類或標籤的複雜資料。

透過靈活地設定匹配數量條件,我們可以輕鬆地找到滿足特定要求的文件。

然而,需要注意的是,使用Terms Set查詢時可能會遇到效能問題,特別是在處理大量資料時。為了提高查詢效能,可以考慮對資料進行預處理,例如使用聚類演算法將標籤分組,然後根據分組查詢文件。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2950924/,如需轉載,請註明出處,否則將追究法律責任。

相關文章