作者:Kathleen DeRusso
我們很高興地宣佈Elasticsearch 8.10中的查詢規則!查詢規則允許您根據查詢正在搜索的查詢詞或作為搜索查詢的一部分提供的上下文信息來更改查詢。
什麼是查詢規則?
查詢規則(query rules)允許自定義搜索相關性之外的搜索結果,這可以根據您提供的上下文信息更好地控制目標查詢的結果。 這為營銷活動、個性化和特定細分市場的搜索結果提供了更有針對性的搜索結果,所有這些都內置於 Elasticsearch® 中!
支持哪些類型的規則?
首先,我們支持固定查詢規則(pinned query rules),它允許你根據特定查詢中的上下文來識別要在搜索結果頂部推廣的文檔。
使用固定查詢規則,你可以:
- 當人們搜索 iPhone 時,固定結果以預訂最新的 iPhone
- 當人們搜索 iPhone 時,固定推薦其他品牌的文章
- 如果用户搜索 “football” 位於美國或英國,則固定不同的結果
- 固定重要的組織公告,使其位於每個人搜索結果的頂部
- 有關所有非經理員工即將進行的員工績效評估的固定信息
…等等!
支持哪些類型的標準?
查詢規則匹配條件可以是以下任意一種:
- exact:精確匹配指定值
- fuzzy:在允許的 Levenshtein 編輯距離內匹配指定值
- prefix:以指定值開頭
- suffix:以指定值結尾
- contains:包含指定值
- lt:小於規定值
- lte:小於或等於指定值
- gt:大於指定值
- gte:大於或等於指定值
- always:始終匹配所有規則查詢
支持哪些類型的操作?
對於固定查詢規則,操作可以是固定與索引 _id 字段對應的 id,也可以是固定指定索引中相應 _id 字段的文檔。
查詢規則如何工作?
在底層,創建和使用查詢規則的過程如下:
- 管理員創建包含一個或多個上下文查詢規則的查詢規則集。
- 使用 query rules management API,,我們將這些查詢規則存儲在 Elasticsearch 中。
- 搜索使用 rule_query,其中包括搜索查詢以及查詢規則集和匹配條件。
- Elasticsearch 識別規則集中與查詢中指定的條件相匹配的所有規則。
- 每個匹配規則按照其在規則集中出現的順序應用。
- 在查詢重寫階段,該查詢被重寫為固定查詢(pinned query),固定規則中標識的 ID 或文檔。
- 新的固定查詢運行並返回結果,匹配的升級結果位於頂部。
- 該圖顯示了生命週期:
例子
一家全球電子商務網站想要推廣其新型無線充電器 PureJuice Pro。
該索引包括以下文檔:
POST /products/_doc/us1
{
"name": "PureJuice Pro",
"description": "PureJuice Pro: Experience the pinnacle of wireless charging. Blending rapid charging tech with sleek design, it ensures your devices are powered swiftly and safely. The future of charging is here.",
"price": 15.00,
"currency": "USD",
"plug_type": "B",
"voltage": "120v"
}
POST /products/_doc/uk1
{
"name": "PureJuice Pro - UK Compatible",
"description": "PureJuice Pro: Redefining wireless charging. Seamlessly merging swift charging capabilities with a refined aesthetic, it guarantees your devices receive rapid and secure power. Welcome to the next generation of charging.",
"price": 20.00,
"currency": "GBP",
"plug_type": "G",
"voltage": "230V"
}
POST /products/_doc/eu1
{
"name": "PureJuice Pro - Wireless Charger suitable for European plugs",
"description": "PureJuice Pro: Elevating wireless charging. Combining unparalleled charging speeds with elegant design, it promises both rapid and dependable energy for your devices. Embrace the future of wireless charging.",
"price": 18.00,
"currency": "EUR",
"plug_type": "C",
"voltage": "230V"
}
使用以下查詢在該索引中搜索無線充電器(wireless charger):
POST /products/_search?filter_path=**.hits
{
"query": {
"multi_match": {
"query": "wireless charger",
"fields": [ "name^5", "description" ]
}
}
}
由於 name 匹配,此查詢將首先返回 European 充電器 - 但我們可能希望根據搜索者的位置推廣不同的版本。
{
"hits": {
"hits": [
{
"_index": "products",
"_id": "eu1",
"_score": 7.590337,
"_source": {
"name": "PureJuice Pro - Wireless Charger suitable for European plugs",
"description": "PureJuice Pro: Elevating wireless charging. Combining unparalleled charging speeds with elegant design, it promises both rapid and dependable energy for your devices. Embrace the future of wireless charging.",
"price": 18,
"currency": "EUR",
"plug_type": "C",
"voltage": "230V"
}
},
{
"_index": "products",
"_id": "us1",
"_score": 0.1323013,
"_source": {
"name": "PureJuice Pro",
"description": "PureJuice Pro: Experience the pinnacle of wireless charging. Blending rapid charging tech with sleek design, it ensures your devices are powered swiftly and safely. The future of charging is here.",
"price": 15,
"currency": "USD",
"plug_type": "B",
"voltage": "120v"
}
},
{
"_index": "products",
"_id": "uk1",
"_score": 0.1323013,
"_source": {
"name": "PureJuice Pro - UK Compatible",
"description": "PureJuice Pro: Redefining wireless charging. Seamlessly merging swift charging capabilities with a refined aesthetic, it guarantees your devices receive rapid and secure power. Welcome to the next generation of charging.",
"price": 20,
"currency": "GBP",
"plug_type": "G",
"voltage": "230V"
}
}
]
}
}
管理查詢規則
首先,具有 manage_search_query_rules 權限的管理員使用查詢規則管理 API 定義並存儲規則集。
PUT /_query_rules/promotion-rules
{
"rules": [
{
"rule_id": "us-charger",
"type": "pinned",
"criteria": [
{
"type": "contains",
"metadata": "my_query",
"values": ["wireless charger"]
},
{
"type": "exact",
"metadata": "country",
"values": ["us"]
}
],
"actions": {
"ids": [
"us1"
]
}
},
{
"rule_id": "uk-charger",
"type": "pinned",
"criteria": [
{
"type": "contains",
"metadata": "my_query",
"values": ["wireless charger"]
},
{
"type": "exact",
"metadata": "country",
"values": ["uk"]
}
],
"actions": {
"ids": [
"uk1"
]
}
}
]
}
在此規則集中,我們定義了兩個規則:
- 如果用户的搜索詞(my_query)包含短語 “wireless charger” 並且它們位於美國 (us),我們希望將美國產品固定在結果集的頂部。
- 如果用户執行相同的搜索(country)但位於英國 (uk),我們希望將該產品的英國版本固定在結果集的頂部。
只有在上面的兩個規則同時滿足的情況下,才算是一個匹配,並且結果會被 pinned 到最前面。
提示:因為我們正在將其轉換為底層的固定查詢,所以我們需要遵守一些基本規則:
- 我們可以定義要固定的 id 或文檔 (docs),但不能同時定義兩者。 為了避免混亂,最佳實踐是選擇其中之一併在查詢規則集中保持一致。
- 固定查詢(pinned query)最多隻能支持 100 個固定文檔。 任何給定的規則都會強制執行此限制。
搜索查詢規則
當我們根據查詢規則進行搜索時,我們想要使用 rule_query。 規則查詢示例可能如下所示:
POST /products/_search?filter_path=**.hits
{
"query": {
"rule_query": {
"organic": {
"multi_match": {
"query": "reliable wireless charger for iPhone",
"fields": [
"name^5",
"description"
]
}
},
"match_criteria": {
"my_query": "reliable wireless charger for iPhone",
"country": "us"
},
"ruleset_id": "promotion-rules"
}
}
}
該查詢由以下部分組成:
- organic 查詢,這是我們想要運行並對文檔進行排名的搜索。 如果沒有應用查詢規則,則不做任何修改地執行該查詢。
- 匹配標準,定義了我們要匹配的標準。 在此示例中,我們有兩條 match_criteria:
- my_query,在本例中與用户在搜索框中輸入的字符串相同
- country,通過對用户 IP 地址使用地理定位來確定
- ruleset ID,它確定我們在其中查找匹配規則的規則集。
我們驗證每個規則以確定是否應將其應用於查詢。 當我們處理規則查詢時,我們找到來自 us 的查詢 “wireless charger” 的匹配規則:
{
"rule_id": "us-charger",
"type": "pinned",
"criteria": [
{
"type": "contains",
"metadata": "description",
"values": ["wireless charger"]
},
{
"type": "exact",
"metadata": "country",
"values": ["us"]
}
],
"actions": {
"ids": [
"us1"
]
}
}
提醒一下,為了使查詢規則匹配,查詢規則中定義的所有條件都必須與規則查詢輸入匹配。在我們搜素時,我們在:
"match_criteria": {
"my_query": "reliable wireless charger for iPhone",
"country": "us"
},
中定義的規則很顯然匹配在 promotion-rules 中定義的第一個規則:my_query 中含有 "wireless charger", 而 country 和 us 完全匹配。這樣第一個規則就被匹配,那麼 action 中定義的 id 為 us1 的會 pinned 到搜索結果的最前面。
在執行查詢之前,它被重寫為固定查詢 (pinned query):
{
"query": {
"pinned": {
"organic": {
"query_string": {
"query": "reliable wireless charger for iPhone"
}
},
"ids": [
"us1"
]
}
}
}
Elasticsearch 使用這個新的固定查詢進行搜索,並返回結果,其中固定的美國版本產品位於結果集的頂部。
上面查詢的結果為:
{
"hits": {
"hits": [
{
"_index": "products",
"_id": "us1",
"_score": 1.7014122e+38,
"_source": {
"name": "PureJuice Pro",
"description": "PureJuice Pro: Experience the pinnacle of wireless charging. Blending rapid charging tech with sleek design, it ensures your devices are powered swiftly and safely. The future of charging is here.",
"price": 15,
"currency": "USD",
"plug_type": "B",
"voltage": "120v",
"country": "us"
}
},
{
"_index": "products",
"_id": "eu1",
"_score": 13.700377,
"_source": {
"name": "PureJuice Pro - Wireless Charger suitable for European plugs",
"description": "PureJuice Pro: Elevating wireless charging. Combining unparalleled charging speeds with elegant design, it promises both rapid and dependable energy for your devices. Embrace the future of wireless charging.",
"price": 18,
"currency": "EUR",
"plug_type": "C",
"voltage": "230V",
"country": "euro"
}
},
{
"_index": "products",
"_id": "uk1",
"_score": 0.104635,
"_source": {
"name": "PureJuice Pro - UK Compatible",
"description": "PureJuice Pro: Redefining wireless charging. Seamlessly merging swift charging capabilities with a refined aesthetic, it guarantees your devices receive rapid and secure power. Welcome to the next generation of charging.",
"price": 20,
"currency": "GBP",
"plug_type": "G",
"voltage": "230V",
"country": "uk"
}
}
]
}
}
結論
我們向您展示瞭如何定義查詢規則以根據用户輸入的查詢或個性化數據等上下文信息來推廣結果,以及如何使用這些規則進行搜索。
請在Elastic® 8.10發行説明中瞭解此功能及更多信息,並通過14 天免費試用 Elastic Cloud自行嘗試使用查詢規則進行搜索。 我們很樂意在GitHub和我們的討論論壇上收到你的來信。
本文中描述的任何特性或功能的發佈和時間安排均由 Elastic 自行決定。功能可能無法按時交付或根本無法交付。
原文:Introduction to query rules in Elasticsearch | Elastic Blog