Sdílet prostřednictvím


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: