作者:來自 Elastic?Kofi Bartlett
解釋如何使用 terms query 和 enrich processor 來連接 Elasticsearch 中的兩個索引。
更多有關連接兩個索引的查詢,請參閱文章 “Elastic:開發者上手指南” 中的 “豐富數據及 lookup” 章節。
Elasticsearch 擁有豐富的新功能,幫助你為自己的使用場景構建最佳搜索解決方案。深入閱讀我們的示例筆記本,了解更多信息,開始免費云端試用,或立即在本地機器上嘗試 Elastic。
在 Elasticsearch 中,連接兩個索引不像傳統 SQL 數據庫那樣直接。然而,可以通過 Elasticsearch 提供的一些技術和功能實現類似的效果。本文將深入介紹在 Elasticsearch 中連接兩個索引的過程,重點講解如何使用 terms query 和 enrich processor。
?使用 terms query 連接兩個索引
terms query 是在 Elasticsearch 中連接兩個索引最有效的方法之一。這個查詢用于檢索某個字段中包含一個或多個精確值的文檔。以下是使用它來連接兩個索引的方法:?
- 首先,需要從第一個索引中獲取所需的數據。這可以通過一個簡單的 GET 請求完成。
- 獲取到第一個索引中的數據后,可以使用這些數據去查詢第二個索引。這通過 terms query 實現,你需要指定要匹配的字段和對應的值。
下面是一個示例:
- # 第一步:查 index A,得到 id:
GET index_a/_search
{"query": {"match": {"user": "alice"}}
}
- 第二步:根據 index A 的結果查詢 index B
GET index_b/_search
{"query": {"terms": {"user_id": [ "123", "456" ] # 從 index_a 拿到的 id}}
}
terms 查詢還支持使用一種稱為 terms lookup 的技術,在一次請求中執行上述兩個步驟。Elasticsearch 會自動從另一個索引中檢索匹配值。例如,你有一個名為 teams
的索引,里面包含球員列表:
PUT teams/_doc/team1
{"players": ["john", "bill", "michael"]
}PUT teams/_doc/team2
{"players": ["aaron", "joe", "donald"]
}
現在,可以查詢 people
索引,獲取所有在 team1
打球的人,如下所示:
GET people/_search?pretty
{"query": {"terms": {"name" : {"index" : "teams","id" : "team1","path" : "players"}}}
}
在上面的例子中,Elasticsearch 會透明地從 teams
索引中的 team1
文檔中檢索球員名字(即“john”,“bill”,“michael”),并找到所有在 people
文檔中 name
字段包含這些值的文檔。等效的 SQL 查詢如下:
SELECT p.* FROM people p
INNER JOIN teams t ON p.name = t.players
更多閱讀,請參閱 “Elasticsearch:Terms lookup query - 關聯兩個不同索引的搜索”。
使用 enrich 處理器連接兩個索引
enrich 處理器是另一個強大的工具,可以用于在 Elasticsearch 中連接兩個索引。此處理器通過從預定義的 enrich 索引中添加數據來豐富傳入文檔的數據。
以下是如何使用 enrich 處理器連接兩個索引的步驟:
-
首先,你需要創建一個 enrich 策略。該策略定義了要用于豐富的索引以及要匹配的字段。下面是一個示例:
PUT /_enrich/policy/my_enrich_policy {"match": {"indices": "first_index","match_field": "field_in_first_index","enrich_fields": ["field_to_enrich"]} }
-
?一旦創建了策略,你需要執行它:??
POST /_enrich/policy/my_enrich_policy/_execute
-
執行策略后,你可以在攝取管道中使用 enrich 處理器來豐富傳入文檔的數據:
PUT /_ingest/pipeline/my_pipeline
{"processors": [{"enrich": {"policy_name": "my_enrich_policy","field": "field_in_second_index","target_field": "enriched_field"}}]
}
在這個例子中,field_in_second_index
是第二個索引中你想要用第一個索引的數據來豐富的字段,enriched_field
是將包含豐富數據的新字段。
這種方法的一個缺點是,如果第一個索引中的數據發生變化,豐富策略需要重新執行,因為豐富索引不會自動從源索引同步或更新。然而,如果第一個索引相對穩定,那么這種方法效果很好。
更多閱讀,請參閱文章 “Elasticsearch:如何使用 Elasticsearch ingest 節點來豐富日志和指標” 及 “Elasticsearch:使用 Elasticsearch ingest pipeline 豐富數據”。
結論
總之,雖然 Elasticsearch 不支持傳統的連接操作,但它提供了像 terms
查詢和 enrich
處理器這樣的功能,可以用來實現類似的結果。需要注意的是,這些方法有其局限性,應該根據具體的需求和數據的性質謹慎使用。
原文:Joining two indexes in Elasticsearch - Elasticsearch Labs