Příklady úplné syntaxe vyhledávání Lucene (pokročilé dotazy)

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, které demonstrují 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=2024-07-01

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

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • search nastavená na * je nespecifikovaný dotaz, který odpovídá hledání s hodnotou null nebo prázdným vyhledáváním. 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.

  • queryType Hodnota nastavená na úplné vyvolá úplný analyzátor dotazů Lucene a pro tuto syntaxi je vyžadována.

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

  • 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).

Obory vyhledávání v polích jsou jednotlivé vložené vyhledávací výrazy do konkrétního pole. Tento příklad hledá názvy hotelů s termínem hotel v nich, ale ne motel. Můžete zadat více polí pomocí AND.

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=2024-07-01
{
    "search": "HotelName:(hotel NOT motel) AND Category:'Boutique'",
    "queryType": "full",
    "select": "HotelName, Category",
    "count": true
}

Odpověď pro tento dotaz by měla vypadat podobně jako v následujícím příkladu, vyfiltrované podle Boutique, vrácení hotelů, které zahrnují hotel v názvu, a současně s výjimkou výsledků, které zahrnují motel v názvu.

{
  "@odata.count": 5,
  "value": [
    {
      "@search.score": 2.2289815,
      "HotelName": "Stay-Kay City Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.3862944,
      "HotelName": "City Skyline Antiquity Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.355046,
      "HotelName": "Old Century Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.355046,
      "HotelName": "Sublime Palace Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.355046,
      "HotelName": "Red Tide Hotel",
      "Category": "Boutique"
    }
  ]
}

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 vyhodnotily jako jedna entita, nezapomeňte zadat do uvozovek, protože v tomto případě hledáte dvě různá umístění v Address/StateProvince poli. 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. Informace 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=2024-07-01
{
    "search": "Tags:conserge~",
    "queryType": "full",
    "select": "HotelName, Category, Tags",
    "searchFields": "HotelName, Category, Tags",
    "count": true
}

Odpověď pro tento dotaz se přeloží na concierge v odpovídajících dokumentech, oříznutá kvůli stručnosti:

{
  "@odata.count": 9,
  "value": [
    {
      "@search.score": 1.4947624,
      "HotelName": "Twin Vortex Hotel",
      "Category": "Luxury",
      "Tags": [
        "bar",
        "restaurant",
        "concierge"
      ]
    },
    {
      "@search.score": 1.1685618,
      "HotelName": "Stay-Kay City Hotel",
      "Category": "Boutique",
      "Tags": [
        "view",
        "air conditioning",
        "concierge"
      ]
    },
    {
      "@search.score": 1.1465473,
      "HotelName": "Old Century Hotel",
      "Category": "Boutique",
      "Tags": [
        "pool",
        "free wifi",
        "concierge"
      ]
    },
. . .
  ]
}

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 službě praní prádla.

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 ~ následovaný počtem slov, která vytvoří hranici blízkosti.

Tento dotaz vyhledá termíny hotel a letiště v pěti slovech v dokumentu. Uvozovky se uvozovky uvozovky\" zachovají, aby se zachovala fráze:

POST /indexes/hotel-samples-index/docs/search?api-version=2024-07-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": 1,
  "value": [
    {
      "@search.score": 0.69167054,
      "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."
    }
  ]
}

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 vyhledejte přístup k pláži a všimněte si, že existuje šest dokumentů, které se shodují s jedním nebo oběma termíny.

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

Ve skutečnosti se při přístupu shodují jenom dva dokumenty. První instance je na druhé pozici, i když v dokumentu chybí termín pláž.

{
  "@odata.count": 6,
  "value": [
    {
      "@search.score": 1.068669,
      "HotelName": "Johnson's Family Resort",
      "Description": "Family oriented resort located in the heart of the northland. Operated since 1962 by the Smith family, we have grown into one of the largest family resorts in the state. The home of excellent Smallmouth Bass fishing with 10 small cabins, we're a home not only to fishermen but their families as well. Rebuilt in the early 2000's, all of our cabins have all the comforts of home. Sporting a huge **beach** with multiple water toys for those sunny summer days and a Lodge full of games for when you just can't swim anymore, there's always something for the family to do. A full marina offers watercraft rentals, boat launch, powered dock slips, canoes (free to use), & fish cleaning facility. Rent pontoons, 14' fishing boats, 16' fishing rigs or jet ski's for a fun day or week on the water. Pets are accepted in the lakeside cottages.",
      "Tags": [
        "24-hour front desk service",
        "pool",
        "coffee in lobby"
      ]
    },
    {
      "@search.score": 1.0162708,
      "HotelName": "Campus Commander Hotel",
      "Description": "Easy **access** to campus and steps away from the best shopping corridor in the city. From meetings in town or gameday, enjoy our prime location between the union and proximity to the university stadium.",
      "Tags": [
        "free parking",
        "coffee in lobby",
        "24-hour front desk service"
      ]
    },
    {
      "@search.score": 0.9050383,
      "HotelName": "Lakeside B & B",
      "Description": "Nature is Home on the **beach**. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
      "Tags": [
        "laundry service",
        "concierge",
        "free parking"
      ]
    },
    {
      "@search.score": 0.8955848,
      "HotelName": "Windy Ocean Motel",
      "Description": "Oceanfront hotel overlooking the **beach** features rooms with a private balcony and 2 indoor and outdoor pools. Inspired by the natural beauty of the island, each room includes an original painting of local scenes by the owner. Rooms include a mini fridge, Keurig coffee maker, and flatscreen TV. Various shops and art entertainment are on the boardwalk, just steps away.",
      "Tags": [
        "pool",
        "air conditioning",
        "bar"
      ]
    },
    {
      "@search.score": 0.83636594,
      "HotelName": "Happy Lake Resort & Restaurant",
      "Description": "The largest year-round resort in the area offering more of everything for your vacation – at the best value! What can you enjoy while at the resort, aside from the mile-long sandy **beaches** of the lake? Check out our activities sure to excite both young and young-at-heart guests. We have it all, including being named “Property of the Year” and a “Top Ten Resort” by top publications.",
      "Tags": [
        "pool",
        "bar",
        "restaurant"
      ]
    },
    {
      "@search.score": 0.7808502,
      "HotelName": "Swirling Currents Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking **access** to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. ",
      "Tags": [
        "air conditioning",
        "laundry service",
        "24-hour front desk service"
      ]
    }
  ]
}

V dotazu po opakování hledání tentokrát zvýšíte výsledky s termínem pláž přes přístup k termínu. 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.

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

Po posílení termínu pláže, zápas na Campus Commander Hotel se přesune dolů na páté místo.

{
  "@odata.count": 6,
  "value": [
    {
      "@search.score": 2.137338,
      "HotelName": "Johnson's Family Resort",
      "Description": "Family oriented resort located in the heart of the northland. Operated since 1962 by the Smith family, we have grown into one of the largest family resorts in the state. The home of excellent Smallmouth Bass fishing with 10 small cabins, we're a home not only to fishermen but their families as well. Rebuilt in the early 2000's, all of our cabins have all the comforts of home. Sporting a huge beach with multiple water toys for those sunny summer days and a Lodge full of games for when you just can't swim anymore, there's always something for the family to do. A full marina offers watercraft rentals, boat launch, powered dock slips, canoes (free to use), & fish cleaning facility. Rent pontoons, 14' fishing boats, 16' fishing rigs or jet ski's for a fun day or week on the water. Pets are accepted in the lakeside cottages.",
      "Tags": [
        "24-hour front desk service",
        "pool",
        "coffee in lobby"
      ]
    },
    {
      "@search.score": 1.8100766,
      "HotelName": "Lakeside B & B",
      "Description": "Nature is Home on the beach. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
      "Tags": [
        "laundry service",
        "concierge",
        "free parking"
      ]
    },
    {
      "@search.score": 1.7911696,
      "HotelName": "Windy Ocean Motel",
      "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Inspired by the natural beauty of the island, each room includes an original painting of local scenes by the owner. Rooms include a mini fridge, Keurig coffee maker, and flatscreen TV. Various shops and art entertainment are on the boardwalk, just steps away.",
      "Tags": [
        "pool",
        "air conditioning",
        "bar"
      ]
    },
    {
      "@search.score": 1.6727319,
      "HotelName": "Happy Lake Resort & Restaurant",
      "Description": "The largest year-round resort in the area offering more of everything for your vacation – at the best value! What can you enjoy while at the resort, aside from the mile-long sandy beaches of the lake? Check out our activities sure to excite both young and young-at-heart guests. We have it all, including being named “Property of the Year” and a “Top Ten Resort” by top publications.",
      "Tags": [
        "pool",
        "bar",
        "restaurant"
      ]
    },
    {
      "@search.score": 1.0162708,
      "HotelName": "Campus Commander Hotel",
      "Description": "Easy access to campus and steps away from the best shopping corridor in the city. From meetings in town or gameday, enjoy our prime location between the union and proximity to the university stadium.",
      "Tags": [
        "free parking",
        "coffee in lobby",
        "24-hour front desk service"
      ]
    },
    {
      "@search.score": 0.7808502,
      "HotelName": "Swirling Currents Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. ",
      "Tags": [
        "air conditioning",
        "laundry service",
        "24-hour front desk service"
      ]
    }
  ]
}

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=2024-07-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 (zkráceně kvůli stručnosti):

{
  "@odata.count": 25,
  "value": [
    {
      "@search.score": 1,
      "HotelName": "Country Residence Hotel"
    },
    {
      "@search.score": 1,
      "HotelName": "Downtown Mix Hotel"
    },
    {
      "@search.score": 1,
      "HotelName": "Gastronomic Landscape Hotel"
    },
    . . . 
    {
      "@search.score": 1,
      "HotelName": "Trails End Motel"
    },
    {
      "@search.score": 1,
      "HotelName": "Nordick's Valley Motel"
    },
    {
      "@search.score": 1,
      "HotelName": "King's Cellar 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. 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=2024-07-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": 1,
  "value": [
    {
      "@search.score": 1,
      "HotelName": "Waterfront 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.

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

Další referenční informace o syntaxi, architektuře dotazů a příklady najdete v následujících článcích: