Udostępnij za pośrednictwem


Przykłady pełnej składni wyszukiwania Lucene (zapytania zaawansowane)

Podczas tworzenia zapytań dla usługi Azure AI Search można zastąpić domyślny prosty analizator zapytań bardziej zaawansowanym analizatorem zapytań Lucene, aby sformułować wyspecjalizowane i zaawansowane wyrażenia zapytań.

Analizator Lucene obsługuje złożone formaty zapytań, takie jak zapytania w zakresie pola, wyszukiwanie rozmyte, wyszukiwanie przyrostowe i sufiks, wyszukiwanie zbliżeniowe, zwiększanie terminów i wyszukiwanie wyrażeń regularnych. Dodatkowa moc jest dostarczana z większymi wymaganiami dotyczącymi przetwarzania, więc należy oczekiwać nieco dłuższego czasu wykonywania. W tym artykule przedstawiono przykłady demonstrujące operacje zapytań na podstawie pełnej składni.

Uwaga

Wiele wyspecjalizowanych konstrukcji zapytań włączonych za pomocą pełnej składni zapytania Lucene nie jest analizowanych tekstowo, co może być zaskakujące, jeśli spodziewasz się powstania lub lemmatyzacji. Analiza leksykalna jest wykonywana tylko na pełnych terminach (zapytanie terminowe lub zapytanie frazy). Typy zapytań z niepełnymi terminami (zapytanie prefiksu, zapytanie wieloznaczne, zapytanie regularne, zapytanie rozmyte) są dodawane bezpośrednio do drzewa zapytań, pomijając etap analizy. Jedyną transformacją wykonywaną na częściowych terminach zapytania jest małe litery.

Przykładowy indeks hoteli

Poniższe zapytania są oparte na indeksie hotels-sample-index, który można utworzyć, postępując zgodnie z instrukcjami w tym przewodniku Szybki start.

Przykładowe zapytania są wyrażane przy użyciu interfejsu API REST i żądań POST. Możesz wkleić je i uruchomić w kliencie REST. Możesz też użyć widoku JSON Eksploratora wyszukiwania w witrynie Azure Portal. W widoku JSON możesz wkleić przykłady zapytań pokazane tutaj w tym artykule.

Nagłówki żądań muszą mieć następujące wartości:

Key Wartość
Typ zawartości application/json
api-key <your-search-service-api-key>, zapytanie lub klucz administracyjny

Parametry identyfikatora URI muszą zawierać punkt końcowy usługi wyszukiwania z nazwą indeksu, kolekcjami dokumentacji, poleceniem wyszukiwania i wersją interfejsu API, podobnie jak w poniższym przykładzie:

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

Treść żądania powinna zostać utworzona jako prawidłowy kod JSON:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • search ustawiono wartość * to nieokreślone zapytanie, równoważne z wyszukiwaniem o wartości null lub pustym. Nie jest to szczególnie przydatne, ale jest to najprostsze wyszukiwanie, które można wykonać, i pokazuje wszystkie pola możliwe do pobrania w indeksie ze wszystkimi wartościami.

  • queryType ustawienie na pełne wywołuje pełny analizator zapytań Lucene i jest wymagany dla tej składni.

  • select ustawienie na rozdzielaną przecinkami listę pól jest używane do tworzenia wyników wyszukiwania, w tym tylko tych pól, które są przydatne w kontekście wyników wyszukiwania.

  • count Zwraca liczbę dokumentów spełniających kryteria wyszukiwania. W pustym ciągu wyszukiwania liczba jest wszystkimi dokumentami w indeksie (50 w indeksie hotels-sample-index).

Zakresy wyszukiwania pól pojedyncze, osadzone wyrażenia wyszukiwania do określonego pola. W tym przykładzie wyszukiwane są nazwy hoteli z terminem hotel w nich, ale nie motel. Można określić wiele pól przy użyciu polecenia AND.

Jeśli używasz tej składni zapytania, możesz pominąć searchFields parametr, gdy pola, które chcesz wykonać zapytanie, znajdują się w samym wyrażeniu wyszukiwania. Jeśli uwzględnisz searchFields wyszukiwanie w polu, fieldName:searchExpression zawsze ma pierwszeństwo przed 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
}

Odpowiedź dla tego zapytania powinna wyglądać podobnie do poniższego przykładu, odfiltrowana pod kątem butiku, zwracając hotele, które zawierają hotel w nazwie, z wyłączeniem wyników, które zawierają motel w nazwie.

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

Wyrażenie wyszukiwania może być pojedynczym terminem lub frazą lub bardziej złożonym wyrażeniem w nawiasach, opcjonalnie z operatorami logicznymi. Oto kilka przykładów:

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

Pamiętaj, aby umieścić frazę w cudzysłowie, jeśli chcesz, aby oba ciągi były oceniane jako pojedyncza jednostka, tak jak w tym przypadku wyszukiwanie dwóch odrębnych lokalizacji w Address/StateProvince polu. W zależności od klienta może być konieczne ucieczka (\) znaków cudzysłowu.

Pole określone w pliku fieldName:searchExpression musi być polem z możliwością wyszukiwania. Aby dowiedzieć się, jak są przypisywane definicje pól, zobacz Tworzenie indeksu (interfejs API REST).

Wyszukiwanie rozmyte pasuje do terminów, które są podobne, w tym błędnie napisanych słów. Aby przeprowadzić wyszukiwanie rozmyte, dołącz symbol tyldy ~ na końcu pojedynczego wyrazu z opcjonalnym parametrem, wartością z zakresu od 0 do 2, która określa odległość edycji. Na przykład blue~ lub blue~1 zwraca niebieski, niebieski i klej.

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
}

Odpowiedź dla tego zapytania jest rozpoznawana jako concierge w pasujących dokumentach, przycięta do zwięzłości:

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

Frazy nie są obsługiwane bezpośrednio, ale można określić dopasowanie rozmyte dla każdego terminu wieloczęściowej frazy, takiej jak search=Tags:landy~ AND sevic~. To wyrażenie zapytania znajduje 15 dopasowań w usłudze pralni.

Uwaga

Zapytania rozmyte nie są analizowane. Typy zapytań z niepełnymi terminami (zapytanie prefiksu, zapytanie wieloznaczne, zapytanie regularne, zapytanie rozmyte) są dodawane bezpośrednio do drzewa zapytań, pomijając etap analizy. Jedyną transformacją wykonywaną na częściowych terminach zapytania jest niższa wielkość liter.

Wyszukiwanie w pobliżu znajduje terminy znajdujące się blisko siebie w dokumencie. Wstaw symbol tyldy ~ na końcu frazy, po której następuje liczba wyrazów tworzących granicę zbliżeniową.

To zapytanie wyszukuje terminy hotel i lotnisko w ciągu pięciu słów w dokumencie. Znaki cudzysłowu są ucieczki (\"), aby zachować frazę:

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
}

Odpowiedź dla tego zapytania powinna wyglądać podobnie do następującego przykładu:

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

Przykład 4. Zwiększanie terminów

Termin zwiększający odnosi się do klasyfikowania dokumentu wyższego, jeśli zawiera wzmocniony termin w stosunku do dokumentów, które nie zawierają terminu. Aby zwiększyć termin, użyj karetki , ^symbol z współczynnikiem zwiększenia (liczba) na końcu wyszukiwanego terminu. Wartość domyślna współczynnika zwiększenia wynosi 1 i chociaż musi być dodatnia, może być mniejsza niż 1 (na przykład 0,2). Zwiększenie terminu różni się od profilów oceniania w tych profilach oceniania, które zwiększają niektóre pola, a nie określone terminy.

W tym przed zapytaniem wyszukaj dostęp do plaży i zwróć uwagę, że istnieje sześć dokumentów, które pasują do jednego lub obu terminów.

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
}

W rzeczywistości tylko dwa dokumenty są zgodne z dostępem. Pierwsze wystąpienie znajduje się na drugiej pozycji, mimo że dokument brakuje terminu plaża.

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

W po zapytaniu powtórz wyszukiwanie, tym razem zwiększając wyniki z terminem plaża w okresie dostępu. Czytelna dla człowieka wersja zapytania to search=Description:beach^2 access. W zależności od klienta może być konieczne wyrażenie ^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 zwiększeniu terminu plaża, mecz w Campus Commander Hotel przenosi się w dół do piątego miejsca.

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

Przykład 5. Wyrażeń regularnych

Wyszukiwanie wyrażeń regularnych znajduje dopasowanie na podstawie zawartości między ukośnikami /, zgodnie z dokumentacją w klasie RegExp.

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

Odpowiedź dla tego zapytania powinna wyglądać podobnie do poniższego przykładu (przycięta do zwięzłości):

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

Uwaga

Zapytania wyrażeń regularnych nie są analizowane. Jedyną transformacją wykonywaną na częściowych terminach zapytania jest niższa wielkość liter.

Można użyć ogólnie rozpoznawane składni dla wielu (*) lub pojedynczych? () symboli wieloznacznych wyszukiwania. Analizator zapytań Lucene obsługuje używanie tych symboli z pojedynczym terminem, a nie frazą.

W tym zapytaniu wyszukaj nazwy hoteli zawierające prefiks sc. Nie można użyć symbolu * lub ? jako pierwszego znaku wyszukiwania.

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

Odpowiedź dla tego zapytania powinna wyglądać podobnie do następującego przykładu:

{
  "@odata.count": 1,
  "value": [
    {
      "@search.score": 1,
      "HotelName": "Waterfront Scottish Inn"
    }
  ]
}

Uwaga

Zapytania wieloznaczne nie są analizowane. Jedyną transformacją wykonywaną na częściowych terminach zapytania jest niższa wielkość liter.

Spróbuj określić zapytania w kodzie. Poniższy link zawiera opis sposobu konfigurowania zapytań wyszukiwania przy użyciu zestawów SDK platformy Azure.

Więcej informacji o składni, architekturze zapytań i przykładach można znaleźć w następujących artykułach: