「完整」Lucene 搜尋語法範例(Azure AI 搜尋中的進階查詢)

建構 Azure AI 搜尋的查詢時,您可以將預設的簡單查詢剖析器取代為更強大的 Lucene 查詢剖析器,以制定特製化和進階查詢表達式。

Lucene 剖析器支援複雜的查詢格式,例如欄位範圍查詢、模糊搜尋、infix 和後綴通配符搜尋、鄰近搜尋、詞彙提升和正則表達式搜尋。 額外的電源隨附更多處理需求,因此您應該預期運行時間稍長。 在本文中,您可以逐步示範以完整語法為基礎的查詢作業範例。

注意

透過完整 Lucene 查詢語法啟用的許多特製化查詢建構不是 以文字分析,如果您預期詞幹或解體化,可能會出人意料。 語彙分析只會在完整詞彙上執行(詞彙查詢或片語查詢)。 含不完整詞彙的查詢類型(前置詞查詢、通配符查詢、regex 查詢、模糊查詢)會直接新增至查詢樹狀結構,略過分析階段。 在部分查詢詞彙上執行的唯一轉換是降低。

旅館範例索引

下列查詢是以 hotels-sample-index 為基礎,您可以依照本 快速入門中的指示來建立。

範例查詢會使用 REST API 和 POST 要求來表達。 您可以在 REST 用戶端中貼上並執行它們。 或者,在 Azure 入口網站 中使用搜尋總管的 JSON 檢視。 在 JSON 檢視中,您可以貼上本文此處所示的查詢範例。

要求標頭必須具有下列值:

機碼
內容-類型 application/json
api-key <your-search-service-api-key>、查詢或系統管理金鑰

URI 參數必須包含索引名稱、檔集合、搜尋命令和 API 版本的搜尋服務端點,類似下列範例:

https://{{service-name}}.search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2023-11-01

要求本文應形成為有效的 JSON:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • 設定為 * 的 「search」 是未指定的查詢,相當於 Null 或空白搜尋。 它並不特別有用,但它是最簡單的搜尋,它會顯示索引中所有可擷取的欄位,其中包含所有值。

  • “queryType” 設定為 “full” 會叫用完整的 Lucene 查詢剖析器,而且此語法是必要的。

  • [選取] 設定為以逗號分隔的欄位清單用於搜尋結果組合,包括那些在搜尋結果內容中很有用的欄位。

  • “count” 會傳回符合搜尋準則的文件數目。 在空的搜尋字串上,計數是索引中的所有檔(hotels-sample-index 中為 50 份)。

欄位搜尋範圍個別,內嵌搜尋表達式至特定欄位。 此範例會搜尋具有 「hotel」 一詞的旅館名稱,但不會搜尋 「hotel」。。 您可以使用 AND 指定多個字段。

當您使用此查詢語法時,當您想要查詢的欄位位於搜尋表示式本身時,可以省略 searchFields 參數。 如果您隨附 searchFields 於欄位搜尋,則一 fieldName:searchExpression 律優先於 searchFields

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:(hotel NOT motel) AND Category:'Resort and Spa'",
    "queryType": "full",
    "select": "HotelName, Category",
    "count": true
}

此查詢的回應看起來應該類似下列範例,篩選為「度假村和 Spa」,傳回名稱中包含「旅館」的酒店,同時排除名稱中包含「汽車旅館」的結果。

"@odata.count": 4,
"value": [
    {
        "@search.score": 4.481559,
        "HotelName": "Nova Hotel & Spa",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.4524608,
        "HotelName": "King's Palace Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.3970203,
        "HotelName": "Triple Landscape Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.2953436,
        "HotelName": "Peaceful Market Hotel & Spa",
        "Category": "Resort and Spa"
    }
]

搜尋表達式可以是單一字詞或片語,或是括弧中更複雜的表達式,選擇性地搭配布爾運算元。 部分範例包括以下內容:

  • HotelName:(hotel NOT motel)
  • Address/StateProvince:("WA" OR "CA")
  • Tags:("free wifi" NOT "free parking") AND "coffee in lobby"

如果您想要將這兩個字串評估為單一實體,請務必將片語放在引號內,在此案例中搜尋 Address/StateProvince 欄位中的兩個不同的位置。 視用戶端而定,您可能需要逸出 (\) 引號。

中指定的 fieldName:searchExpression 欄位必須是可搜尋的欄位。 如需欄位定義屬性的詳細資訊,請參閱建立索引 (REST API)。

模糊搜尋會比對類似字詞,包括拼字錯誤。 若要進行模糊搜尋,請使用選擇性參數,在單一單字結尾附加波浪 ~ 符號,這個值介於 0 到 2 之間,指定編輯距離。 例如, blue~blue~1 會傳回藍色、藍調和黏附。

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Tags:conserge~",
    "queryType": "full",
    "select": "HotelName, Category, Tags",
    "searchFields": "HotelName, Category, Tags",
    "count": true
}

此查詢的回應會解析為比對檔中的「指引」,並因簡潔起見而修剪:

"@odata.count": 12,
"value": [
    {
        "@search.score": 1.1832147,
        "HotelName": "Secret Point Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "air conditioning",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1819803,
        "HotelName": "Twin Dome Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "free wifi",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1773309,
        "HotelName": "Smile Hotel",
        "Category": "Suite",
        "Tags": [
            "view",
            "concierge",
            "laundry service"
        ]
    },

不支援直接使用片語,但您可以在多部分片語的每個字詞上指定模糊比對,例如 search=Tags:landy~ AND sevic~。 此查詢表達式在「洗衣服務」上尋找15個相符專案。

注意

不會 分析模糊查詢。 含不完整詞彙的查詢類型(前置詞查詢、通配符查詢、regex 查詢、模糊查詢)會直接新增至查詢樹狀結構,略過分析階段。 在部分查詢詞彙上執行的唯一轉換是較低的大小寫。

鄰近搜尋會尋找檔中彼此接近的字詞。 在片語結尾插入一個波浪線 “~” 符號,後面接著建立鄰近界限的字數。

此查詢會在檔中的 5 個單字內搜尋 「hotel」 和 「airport」 一詞。 引號會逸出 (\") 以保留字組:

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Description: \"hotel airport\"~5",
    "queryType": "full",
    "select": "HotelName, Description",
    "searchFields": "HotelName, Description",
    "count": true
}

此查詢的回應看起來應該類似下列範例:

"@odata.count": 2,
"value": [
    {
        "@search.score": 0.6331726,
        "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."
    },
    {
        "@search.score": 0.43032226,
        "HotelName": "Catfish Creek Fishing Cabins",
        "Description": "Brand new mattresses and pillows.  Free airport shuttle. Great hotel for your business needs. Comp WIFI, atrium lounge & restaurant, 1 mile from light rail."
    }
]

範例 4:詞彙提升

字詞提升是指如果檔包含提升字詞,則是指相對於不包含字詞的檔,將檔排名更高。 若要提升字詞,請在您要搜尋的字詞結尾,使用插入號符號 ^搭配提升因數(數位)。 提升因數預設值為 1,雖然它必須是正數,但它可能小於 1(例如 0.2)。 字詞提升與評分配置檔不同,因為評分配置檔可提升特定欄位,而不是特定字詞。

在此「之前」查詢中,搜尋「海灘存取」,並注意到有七份檔符合一或兩個詞彙。

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "beach access",
    "queryType": "full",
    "select": "HotelName, Description, Tags",
    "searchFields": "HotelName, Description, Tags",
    "count": true
}

事實上,只有一份檔符合「存取」,而且因為它是唯一的相符專案,即使檔遺漏「海灘」一詞,它的位置還是很高(第二個位置)。

"@odata.count": 7,
"value": [
    {
        "@search.score": 2.2723424,
        "HotelName": "Nova Hotel & Spa",
        "Description": "1 Mile from the airport.  Free WiFi, Outdoor Pool, Complimentary Airport Shuttle, 6 miles from the beach & 10 miles from downtown."
    },
    {
        "@search.score": 1.5507699,
        "HotelName": "Old Carrabelle Hotel",
        "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center."
    },
    {
        "@search.score": 1.5358944,
        "HotelName": "Whitefish Lodge & Suites",
        "Description": "Located on in the heart of the forest. Enjoy Warm Weather, Beach Club Services, Natural Hot Springs, Airport Shuttle."
    },
    {
        "@search.score": 1.3433652,
        "HotelName": "Ocean Air Motel",
        "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Various shops and art entertainment are on the boardwalk, just steps away."
    },

在「之後」查詢中,重複搜尋,這次會在「存取」一詞上提升「海灘」一詞的結果。 人類可讀取的查詢版本是 search=Description:beach^2 access。 視您的用戶端而定,您可能需要以 表示^2%5E2

在提升「海灘」一詞后,老卡拉貝爾酒店的比賽被降級到第六位。

範例 5:Regex

正則表達式搜尋會根據正斜線 「/」 之間的內容尋找相符專案,如 RegExp 類別中所述

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:/(Mo|Ho)tel/",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

此查詢的回應看起來應該類似下列範例:

    "@odata.count": 22,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Days Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Triple Landscape Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Smile Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Pelham Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Sublime Cliff Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Twin Dome Motel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Nova Hotel & Spa"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },

注意

不會分析 Regex 查詢。 在部分查詢詞彙上執行的唯一轉換是較低的大小寫。

您可以針對多個 () 或單一 (*?) 字元通配符搜尋使用一般辨識的語法。 請注意,Lucene 查詢剖析器支援將這些符號與單一字詞搭配使用,而不是片語。

在此查詢中,搜尋包含前置詞 'sc' 的酒店名稱。 您無法使用 *? 符號作為搜尋的第一個字元。

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:sc*",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

此查詢的回應看起來應該類似下列範例:

    "@odata.count": 2,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scottish Inn"
        }
    ]

注意

不會 分析通配符查詢。 在部分查詢詞彙上執行的唯一轉換是較低的大小寫。

下一步

請嘗試在程式代碼中指定查詢。 下列連結涵蓋如何使用 Azure SDK 來設定搜尋查詢。

您可以在下列連結中找到更多語法參考、查詢架構和範例: