利用字詞提升來改善文件的順位
當最相關的結果優先顯示時,搜尋效果最佳。 因此搜尋查詢時,所有搜尋引擎都會嘗試傳回最相關的結果。 Azure AI 搜尋服務實作了增強版的 Apache Lucene 以進行全文檢索搜尋。
在這裡,您將探索如何撰寫更複雜的 Lucene 查詢。 如此一來,您即可提升搜尋查詢中的特定字詞來改善結果的相關性。
搜尋索引
Azure AI 搜尋服務可讓您使用 REST 端點,或 Azure 入口網站內的搜尋總管工具來查詢索引。 如果您想要快速回顧查詢處理的階段,請參閱建立 Azure AI 搜尋服務解決方案中的「搜尋索引」單元。
本單元著重於查詢剖析。
您將使用搜尋總管,查看使用簡單和完整查詢類型的差異,及其對搜尋結果的影響。
注意
若要自行執行查詢,您需要具備 Azure 訂閱。 建立 Azure AI 搜尋服務服務,並將旅館的範例資料匯入索引。
撰寫簡單查詢
旅館範例資料包含 50 家旅館,其中包含描述、房間詳細資料及其位置。 假設您經營旅館預訂業務,並擁有一個可讓使用者預訂旅館的應用程式。 使用者在其中搜尋時,必須先顯示最相關的旅館。
在您的使用案例中,客戶嘗試尋找豪華 (luxury) 旅館。 我們先來看這個簡單查詢的搜尋結果:
search=luxury&$select=HotelId, HotelName, Category, Tags, Description&$count=true
查詢剖析會在索引文件的所有欄位搜尋 luxury
字詞。
查詢字串也會新增 select
選項,以限制從文件傳回的欄位。
&$select=HotelId, HotelName, Category, Tags, Description
查詢上的最後一個參數會要求索引計算總結果。
$count=true
由於不需要語彙分析,因此文件擷取會傳回 14 份文件。 前三份為:
{
"@odata.context": "https://advanced-cognitive-search.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
"@odata.count": 14,
"value": [
{
"@search.score": 2.633778,
"HotelId": "13",
"HotelName": "Historic Lion Resort",
"Description": "Unmatched Luxury. Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
"Category": "Budget",
"Tags": [
"view",
"free wifi",
"free wifi"
]
},
{
"@search.score": 2.1104424,
"HotelId": "18",
"HotelName": "Oceanside Resort",
"Description": "New Luxury Hotel. Be the first to stay. Bay views from every room, location near the piper, rooftop pool, waterfront dining & more.",
"Category": "Budget",
"Tags": [
"view",
"laundry service",
"air conditioning"
]
},
{
"@search.score": 1.966516,
"HotelId": "40",
"HotelName": "Trails End Motel",
"Description": "Only 8 miles from Downtown. On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport.",
"Category": "Luxury",
"Tags": [
"continental breakfast",
"view",
"view"
]
},
...
]
}
最頂端顯示的旅館,理應為豪華 (luxury) 旅館,卻屬於預算類別,而且沒有任何空調設備,這會讓客戶大吃一驚。 如果客戶在其搜尋中輸入多個單字,應用程式會假設結果應該包含所有字詞,進而在查詢的字詞之間新增 +。 其傳送至 API 的查詢為:
search=luxury + air con&$select=HotelId, HotelName, Category, Tags, Description&$count=true
搜尋服務現在會傳回五份文件,但頂端的結果仍屬於預算類別。
啟用 Lucene 查詢剖析器
您可以將 &queryType=full
新增至查詢字串,指示搜尋總管使用 Lucene 查詢剖析器。
search=luxury AND air con&$select=HotelId, HotelName, Category, Tags, Description&$count=true&queryType=full
Lucene 語法可讓您撰寫更精確的查詢。 以下是可用功能的摘要:
- 布林運算子:
AND
、OR
、NOT
,例如luxury AND 'air con'
。 - 欄位搜尋:
fieldName:search term
,例如Description:luxury AND Tags:air con
。 - 模糊搜尋:
~
,例如Description:luxury~
會傳回 luxury 拼字錯誤的結果。 - 字詞鄰近搜尋:
"term1 term2"~n
,例如"indoor swimming pool"~3
會傳回含 indoor swimming pool 這幾個字、且其彼此相距三個字以內的文件。 - 規則運算式搜尋:
/regular expression/
會在/
之間使用規則運算式,例如/[mh]otel/
會傳回含 hotel 和 motel 的文件。 - 萬用字元搜尋:
*
、?
,其中*
會比對許多字元,?
會比對單一字元,例如'air con'*
會尋找 air con 和 air conditioning。 - 優先順序群組:
(term AND (term OR term))
,例如(Description:luxury OR Category:luxury) AND Tags:air?con*
。 - 字詞提升:
^
,例如Description:luxury OR Category:luxury^3
會讓屬於 luxury 類別的旅館分數高於描述中包含 luxury 的旅館。
若要深入了解這些功能,請參閱 Azure AI 搜尋服務中的 Lucene 查詢語法。
提升搜尋字詞
您可以使用上述功能來改善結果。 剖析器應該給豪華 (luxury) 類別的旅館較高分數。 您也可以更精確,並在 [標籤] 欄位中尋找 air conditioning。
(Description:luxury OR Category:luxury^3) AND Tags:'air con'*
新增其他查詢字串參數時,可取得以下查詢字串:
search=(Description:luxury OR Category:luxury^3) AND Tags:'air con'*&$select=HotelId, HotelName, Category, Tags, Description&$count=true&queryType=full
前三家旅館現在為:
{
"@odata.context": "https://advanced-cognitive-search.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
"@odata.count": 5,
"value": [
{
"@search.score": 5.3537707,
"HotelId": "8",
"HotelName": "Sapphire Resort",
"Description": "Downtown, close to everything, steps to the park, shopping, and restaurants.",
"Category": "Luxury",
"Tags": [
"free wifi",
"continental breakfast",
"air conditioning"
]
},
{
"@search.score": 5.3522806,
"HotelId": "49",
"HotelName": "Old Carrabelle Hotel",
"Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
"Category": "Luxury",
"Tags": [
"air conditioning",
"laundry service",
"24-hour front desk service"
]
},
{
"@search.score": 4.1448884,
"HotelId": "18",
"HotelName": "Oceanside Resort",
"Description": "New Luxury Hotel. Be the first to stay. Bay views from every room, location near the piper, rooftop pool, waterfront dining & more.",
"Category": "Budget",
"Tags": [
"view",
"laundry service",
"air conditioning"
]
},
...
]
}
Sapphire Resorts 的搜尋分數已從 2.3321536 增加到 5.3537707,因此現在是客戶最先看到的旅館。 Oceanside Resort 現在則位於第三名。