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).
Příklad 1: Hledání v poli
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říklad 2: Vyhledávání přibližných shod
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.
Příklad 3: Hledání bezkontaktní komunikace
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.
Příklad 6: Vyhledávání zástupných znaků
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: