Příklady "úplné" syntaxe vyhledávání Lucene (pokročilé dotazy ve službě Azure AI Search)

Při vytváření dotazů pro Azure AI Search můžete nahradit výchozí jednoduchý analyzátor dotazů výkonnějším analyzátorem dotazů Lucene a formulovat specializované a pokročilé výrazy dotazů.

Analyzátor Lucene podporuje složité formáty dotazů, jako jsou dotazy v oboru polí, přibližné vyhledávání, vyhledávání s příponou a vyhledávání zástupných znaků přípony, vyhledávání bezkontaktní komunikace, zvýšení termínu a vyhledávání regulárních výrazů. Dodatečný výkon má více požadavků na zpracování, takže byste měli očekávat o něco delší dobu provádění. V tomto článku si můžete projít příklady demonstrující operace dotazů na základě úplné syntaxe.

Poznámka:

Mnoho specializovaných konstrukcí dotazů povolených prostřednictvím úplné syntaxe dotazů Lucene není analyzováno textem, což může být překvapení, pokud očekáváte stemming nebo lemmatizaci. Lexikální analýza se provádí pouze s úplnými termíny (dotaz na termín nebo dotaz frází). Typy dotazů s neúplnými termíny (dotaz s předponou, zástupný dotaz, dotaz regex, přibližný dotaz) se přidají přímo do stromu dotazů a obcházejí fázi analýzy. Jediná transformace provedená u částečných termínů dotazů je nižší.

Ukázkový index hotelů

Následující dotazy jsou založené na ukázkovém indexu hotelů, které můžete vytvořit podle pokynů v tomto rychlém startu.

Příklady dotazů jsou vyjádřeny pomocí rozhraní REST API a požadavků POST. Můžete je vložit a spustit v klientovi REST. Nebo použijte zobrazení JSON Průzkumníka služby Search na webu Azure Portal. V zobrazení JSON můžete vložit příklady dotazů uvedené zde v tomto článku.

Hlavičky požadavku musí mít následující hodnoty:

Key Hodnota
Content-Type application/json
api-key <your-search-service-api-key>– dotaz nebo klíč správce

Parametry identifikátoru URI musí obsahovat koncový bod vyhledávací služby s názvem indexu, kolekcemi docs, příkazem pro vyhledávání a verzí rozhraní API, podobně jako v následujícím příkladu:

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

Text požadavku by se měl vytvořit jako platný JSON:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • Hodnota "search" nastavená na * není zadaný dotaz, který odpovídá hodnotě null nebo prázdnému vyhledávání. Není to zvlášť užitečné, ale je to nejjednodušší hledání, které můžete udělat, a zobrazuje všechna zobrazitelná pole v indexu se všemi hodnotami.

  • Parametr queryType nastavený na "full" vyvolá úplný analyzátor dotazů Lucene a vyžaduje se pro tuto syntaxi.

  • "select" nastavený na čárkami oddělený seznam polí se používá pro složení výsledků hledání, včetně jenom těch polí, která jsou užitečná v kontextu výsledků hledání.

  • Funkce count vrátí počet dokumentů odpovídajících kritériím hledání. U prázdného vyhledávacího řetězce je počet všech dokumentů v indexu (50 v indexu hotels-sample-index).

Jednotlivý obor vyhledávání v poli vložené vyhledávací výrazy do konkrétního pole Tento příklad vyhledá názvy hotelů s termínem "hotel" v nich, ale ne "motel". Pomocí funkce AND můžete zadat více polí.

Pokud použijete tuto syntaxi dotazu, můžete parametr vynechat searchFields , pokud jsou pole, která chcete dotazovat, v samotném hledaném výrazu. Pokud zahrnete searchFields pole hledání, fieldName:searchExpression bude mít vždy přednost před 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
}

Odpověď na tento dotaz by měla vypadat podobně jako v následujícím příkladu, vyfiltrovaná na "Resort and Spa", vracejí se hotely, které v názvu obsahují "hotel", a současně vyloučí výsledky, které v názvu obsahují "motel".

"@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"
    }
]

Hledaný výraz může být jeden termín nebo fráze nebo složitější výraz v závorkách, volitelně s logickými operátory. Mezi příklady patří:

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

Pokud chcete, aby se oba řetězce vyhodnocovaly jako jedna entita, nezapomeňte zadat do uvozovek, protože v tomto případě hledáte dvě různá umístění v poli Address/StateProvince. V závislosti na klientovi možná budete muset uvozovky uvozovek uvozovek použít\.

Pole zadané v fieldName:searchExpression poli musí být prohledávatelné pole. Podrobnosti o atributech definic polí najdete v tématu Vytvoření indexu (REST API ).

Přibližné hledání odpovídá termíny, které jsou podobné, včetně chybně napsaných slov. Pokud chcete provést přibližné hledání, připojte na konec jednoho slova symbol tilda ~ s volitelným parametrem, hodnotou mezi 0 a 2, která určuje vzdálenost úprav. Nebo by se například blue~blue~1 vrátila modrá, modrá a připevnění.

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
}

Odpověď na tento dotaz se přeloží na "concierge" v odpovídajících dokumentech a oříznou kvůli stručnosti:

"@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"
        ]
    },

Fráze nejsou podporované přímo, ale u každého termínu vícedílné fráze, například search=Tags:landy~ AND sevic~, můžete zadat přibližnou shodu. Tento výraz dotazu najde 15 shod ve výrazu "prádelna".

Poznámka:

Neanalyzuje se přibližné dotazy. Typy dotazů s neúplnými termíny (dotaz s předponou, zástupný dotaz, dotaz regex, přibližný dotaz) se přidají přímo do stromu dotazů a obcházejí fázi analýzy. Jediná transformace provedená u částečných termínů dotazů je menší velikost písmen.

Hledání bezkontaktní komunikace vyhledá termíny, které jsou v dokumentu blízko sebe. Na konec fráze vložte symbol tilda "~", za kterým následuje počet slov, která vytvářejí hranice blízkosti.

Tento dotaz vyhledá termíny "hotel" a "airport" do 5 slov mezi sebou v dokumentu. Uvozovky se uvozovky uvozovky\" zachovají, aby se zachovala fráze:

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
}

Odpověď pro tento dotaz by měla vypadat podobně jako v následujícím příkladu:

"@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."
    }
]

Příklad 4: Zvýšení termínu

Zvýšení termínu odkazuje na vyšší hodnocení dokumentu, pokud obsahuje zesílený termín vzhledem k dokumentům, které daný termín neobsahují. Pokud chcete výraz zvýšit, použijte stříšku , ^symbol se zvýšovacím faktorem (číslo) na konci hledného termínu. Výchozí faktor zvýšení je 1 a i když musí být pozitivní, může být menší než 1 (například 0,2). Zvýšení termínu se liší od hodnoticích profilů v těchto bodových profilech, ale zvýšování určitých polí, nikoli konkrétních termínů.

V tomto dotazu "před" vyhledejte "přístup k pláži" a všimněte si, že existuje sedm dokumentů, které se shodují s jedním nebo oběma termíny.

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
}

Ve skutečnosti existuje jenom jeden dokument, který odpovídá "přístupu", a protože se jedná o jedinou shodu, umístění je vysoké (druhé místo), i když v dokumentu chybí termín "pláž".

"@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."
    },

V dotazu "after" opakujte hledání, tentokrát zvýšíte výsledky výrazem "beach" nad termínem "access". Lidsky čitelná verze dotazu je search=Description:beach^2 access. V závislosti na vašem klientovi možná budete muset vyjádřit ^2 jako %5E2.

Po posílení termínu "pláž", zápas na Old Carrabelle Hotel se přesune dolů na šesté místo.

Příklad 5: Regex

Hledání regulárních výrazů najde shodu na základě obsahu mezi lomítky "/", jak je uvedeno ve třídě RegExp.

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

Odpověď pro tento dotaz by měla vypadat podobně jako v následujícím příkladu:

    "@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"
        },

Poznámka:

Dotazy regulárních výrazů nejsou analyzovány. Jediná transformace provedená u částečných termínů dotazů je menší velikost písmen.

Obecně rozpoznanou syntaxi můžete použít pro vyhledávání s více (*) nebo jedním (?) zástupným znakem. Všimněte si, že analyzátor dotazů Lucene podporuje použití těchto symbolů s jedním termínem, nikoli frází.

V tomto dotazu vyhledejte názvy hotelů, které obsahují předponu sc. Jako první znak hledání nemůžete použít * ani ? symbol.

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

Odpověď pro tento dotaz by měla vypadat podobně jako v následujícím příkladu:

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

Poznámka:

Dotazy se zástupnými znaky se neanalyzuje. Jediná transformace provedená u částečných termínů dotazů je menší velikost písmen.

Další kroky

Zkuste zadat dotazy v kódu. Následující odkaz popisuje, jak nastavit vyhledávací dotazy pomocí sad Azure SDK.

Další odkazy na syntaxi, architekturu dotazů a příklady najdete na následujících odkazech: