Udostępnij za pośrednictwem


Szybki start: wyszukiwanie wektorów przy użyciu interfejsu REST

Dowiedz się, jak używać interfejsów API REST wyszukiwania do tworzenia, ładowania i wektorów zapytań w usłudze Azure AI Search.

W usłudze Azure AI Search magazyn wektorów ma schemat indeksu, który definiuje pola wektorów i niewektorów, konfigurację wyszukiwania wektorów dla algorytmów tworzących miejsce osadzania i ustawienia definicji pól wektorów, które są oceniane w czasie zapytania. Interfejs API REST tworzenia indeksu tworzy magazyn wektorów.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Uwaga

Ten przewodnik Szybki start pomija krok wektoryzacji i udostępnia osadzanie w przykładowych dokumentach. Jeśli chcesz dodać wbudowane fragmentowanie i wektoryzację danych na własną zawartość, wypróbuj kreatora Importowanie i wektoryzowanie danych w celu uzyskania kompleksowego przewodnika.

Wymagania wstępne

  • Program Visual Studio Code z klientem REST.

  • Usługa Azure AI Search w dowolnym regionie i w dowolnej warstwie. Utwórz lub znajdź istniejący zasób usługi Azure AI Search w ramach bieżącej subskrypcji.

    • W większości tych przewodników Szybki start możesz użyć warstwy Bezpłatna , ale w przypadku większych plików danych zaleca się użycie warstwy Podstawowa lub nowsza.
    • Aby uruchomić przykład zapytania, który wywołuje semantyczne ponowne korbowanie, usługa wyszukiwania musi być warstwą Podstawowa lub nowszą z włączonym semantycznym rankerem.

Pobieranie informacji o zasobie

Żądania do punktu końcowego wyszukiwania muszą być uwierzytelnione i autoryzowane. W tym zadaniu można użyć kluczy interfejsu API lub ról. Zalecamy używanie połączenia bez klucza za pośrednictwem identyfikatora Entra firmy Microsoft.

Wybierz kartę odpowiadającą preferowanej metodzie uwierzytelniania. Użyj tej samej metody dla wszystkich żądań w tym przewodniku Szybki start.

  1. Zaloguj się do witryny Azure Portal i znajdź usługę wyszukiwania.

  2. Na stronie głównej Przegląd znajdź adres URL. Przykładowy punkt końcowy może wyglądać podobnie jak https://mydemo.search.windows.net.

    Zrzut ekranu przedstawiający właściwość ADRESU URL na stronie przeglądu.

  3. Wykonaj kroki opisane w przewodniku Szybki start bez kluczy, aby uzyskać token entra firmy Microsoft.

    Token otrzymasz po uruchomieniu az account get-access-token polecenia w kroku 3 poprzedniego przewodnika Szybki start.

    az account get-access-token --scope https://search.azure.com/.default --query accessToken --output tsv
    

Tworzenie lub pobieranie pliku kodu

Użyj jednego .rest pliku lub .http , aby uruchomić wszystkie żądania w tym przewodniku Szybki start. Możesz pobrać plik REST zawierający kod tego przewodnika Szybki start lub utworzyć nowy plik w programie Visual Studio Code i skopiować do niego kod.

  1. W programie Visual Studio Code utwórz nowy plik z .rest rozszerzeniem lub .http . Na przykład az-search-vector-quickstart.rest. Skopiuj i wklej nieprzetworzona zawartość pliku Azure-Samples/azure-search-rest-samples/blob/main/Quickstart-vectors/az-search-vector-quickstart.rest do tego nowego pliku.

  2. W górnej części pliku zastąp wartość symbolu zastępczego adresem @baseUrl URL usługi wyszukiwania. Zobacz sekcję Pobieranie informacji o zasobie, aby uzyskać instrukcje dotyczące znajdowania adresu URL usługi wyszukiwania.

    @baseUrl = PUT-YOUR-SEARCH-SERVICE-URL-HERE
    
  3. W górnej części pliku zastąp wartość symbolu zastępczego uwierzytelniania. Zobacz sekcję Pobieranie informacji o zasobie, aby uzyskać instrukcje dotyczące uzyskiwania tokenu lub klucza interfejsu API firmy Microsoft.

    W przypadku zalecanego uwierzytelniania bez klucza za pośrednictwem identyfikatora Entra firmy Microsoft należy zastąpić @apiKey zmienną @token .

    @token = PUT-YOUR-MICROSOFT-ENTRA-TOKEN-HERE
    

    Jeśli wolisz użyć klucza interfejsu API, zastąp ciąg @apiKey kluczem skopiowanym z witryny Azure Portal.

    @apiKey = PUT-YOUR-ADMIN-KEY-HERE
    
  4. W przypadku zalecanego uwierzytelniania bez klucza za pośrednictwem identyfikatora Entra firmy Microsoft należy zastąpić api-key: {{apiKey}} ciąg ciągiem Authorization: Bearer {{token}} w nagłówkach żądania. Zastąp wszystkie wystąpienia api-key: {{apiKey}} , które znajdziesz w pliku.

Tworzenie indeksu wektorowego

Interfejs API REST tworzenia indeksu służy do tworzenia indeksu wektora i konfigurowania fizycznych struktur danych w usłudze wyszukiwania.

Schemat indeksu w tym przykładzie jest zorganizowany wokół zawartości hotelowej. Przykładowe dane składają się z nazw wektorów i niewektorów oraz opisów fikcyjnych hoteli. Ten schemat obejmuje konfiguracje indeksowania wektorów i zapytań oraz klasyfikacji semantycznej.

  1. W programie Visual Studio Code otwórz az-search-vector-quickstart.rest utworzony wcześniej plik.

  2. ### Create a new index Znajdź blok kodu w pliku. Ten blok zawiera żądanie utworzenia indeksu hotels-vector-quickstart w usłudze wyszukiwania.

    ### Create a new index
    POST  {{baseUrl}}/indexes?api-version=2023-11-01  HTTP/1.1
    Content-Type: application/json
    Authorization: Bearer {{token}}
    
    {
        "name": "hotels-vector-quickstart",
        "fields": [
            {
                "name": "HotelId", 
                "type": "Edm.String",
                "searchable": false, 
                "filterable": true, 
                "retrievable": true, 
                "sortable": false, 
                "facetable": false,
                "key": true
            },
            {
                "name": "HotelName", 
                "type": "Edm.String",
                "searchable": true, 
                "filterable": false, 
                "retrievable": true, 
                "sortable": true, 
                "facetable": false
            },
            {
                "name": "HotelNameVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-vector-profile"
            },
            {
                "name": "Description", 
                "type": "Edm.String",
                "searchable": true, 
                "filterable": false, 
                "retrievable": true, 
                "sortable": false, 
                "facetable": false
            },
            {
                "name": "DescriptionVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-vector-profile"
            },
                    {
                "name": "Description_fr", 
                "type": "Edm.String",
                "searchable": true, 
                "filterable": false, 
                "retrievable": true, 
                "sortable": false, 
                "facetable": false,
                "analyzer": "en.microsoft"
            },
            {
                "name": "Description_frvector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-vector-profile"
            },
            {
                "name": "Category", 
                "type": "Edm.String",
                "searchable": true, 
                "filterable": true, 
                "retrievable": true, 
                "sortable": true, 
                "facetable": true
            },
            {
                "name": "Tags",
                "type": "Collection(Edm.String)",
                "searchable": true,
                "filterable": true,
                "retrievable": true,
                "sortable": false,
                "facetable": true
            },
                    {
                "name": "ParkingIncluded",
                "type": "Edm.Boolean",
                "searchable": false,
                "filterable": true,
                "retrievable": true,
                "sortable": true,
                "facetable": true
            },
            {
                "name": "LastRenovationDate",
                "type": "Edm.DateTimeOffset",
                "searchable": false,
                "filterable": true,
                "retrievable": true,
                "sortable": true,
                "facetable": true
            },
            {
                "name": "Rating",
                "type": "Edm.Double",
                "searchable": false,
                "filterable": true,
                "retrievable": true,
                "sortable": true,
                "facetable": true
            },
            {
                "name": "Address", 
                "type": "Edm.ComplexType",
                "fields": [
                    {
                        "name": "StreetAddress", "type": "Edm.String",
                        "searchable": true, "filterable": false, "retrievable": true, "sortable": false, "facetable": false
                    },
                    {
                        "name": "City", "type": "Edm.String",
                        "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                    },
                    {
                        "name": "StateProvince", "type": "Edm.String",
                        "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                    },
                    {
                        "name": "PostalCode", "type": "Edm.String",
                        "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                    },
                    {
                        "name": "Country", "type": "Edm.String",
                        "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                    }
                ]
            },
            {
                "name": "Location",
                "type": "Edm.GeographyPoint",
                "searchable": false, 
                "filterable": true, 
                "retrievable": true, 
                "sortable": true, 
                "facetable": false
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "my-hnsw-vector-config-1",
                    "kind": "hnsw",
                    "hnswParameters": 
                    {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                },
                {
                    "name": "my-hnsw-vector-config-2",
                    "kind": "hnsw",
                    "hnswParameters": 
                    {
                        "m": 4,
                        "metric": "euclidean"
                    }
                },
                {
                    "name": "my-eknn-vector-config",
                    "kind": "exhaustiveKnn",
                    "exhaustiveKnnParameters": 
                    {
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [      
                {
                    "name": "my-vector-profile",
                    "algorithm": "my-hnsw-vector-config-1"
                }
          ]
        },
        "semantic": {
            "configurations": [
                {
                    "name": "my-semantic-config",
                    "prioritizedFields": {
                        "titleField": {
                            "fieldName": "HotelName"
                        },
                        "prioritizedContentFields": [
                            { "fieldName": "Description" }
                        ],
                        "prioritizedKeywordsFields": [
                            { "fieldName": "Category" }
                        ]
                    }
                }
            ]
        }
    }
    
  3. Wybierz pozycję Wyślij wniosek. Powinna zostać wyświetlona HTTP/1.1 201 Created odpowiedź.

Treść odpowiedzi powinna zawierać reprezentację JSON schematu indeksu.

{
    "@odata.context": "https://my-demo-search.search.windows.net/$metadata#indexes/$entity",
    "@odata.etag": "\"0x8DD2E70E6C36D8E\"",
    "name": "hotels-vector-quickstart",
    "defaultScoringProfile": null,
    "fields": [
    {
        "name": "HotelId",
        "type": "Edm.String",
        "searchable": false,
        "filterable": true,
        "retrievable": true,
        "sortable": false,
        "facetable": false,
        "key": true,
        "indexAnalyzer": null,
        "searchAnalyzer": null,
        "analyzer": null,
        "dimensions": null,
        "vectorSearchProfile": null,
        "synonymMaps": []
    },
    [MORE FIELD DEFINITIONS OMITTED FOR BREVITY]
    ],
    "scoringProfiles": [],
    "corsOptions": null,
    "suggesters": [],
    "analyzers": [],
    "tokenizers": [],
    "tokenFilters": [],
    "charFilters": [],
    "encryptionKey": null,
    "similarity": {
    "@odata.type": "#Microsoft.Azure.Search.BM25Similarity",
    "k1": null,
    "b": null
    },
    "vectorSearch": {
    "algorithms": [
        {
        "name": "my-hnsw-vector-config-1",
        "kind": "hnsw",
        "hnswParameters": {
            "metric": "cosine",
            "m": 4,
            "efConstruction": 400,
            "efSearch": 500
        },
        "exhaustiveKnnParameters": null
        },
        {
        "name": "my-hnsw-vector-config-2",
        "kind": "hnsw",
        "hnswParameters": {
            "metric": "euclidean",
            "m": 4,
            "efConstruction": 400,
            "efSearch": 500
        },
        "exhaustiveKnnParameters": null
        },
        {
        "name": "my-eknn-vector-config",
        "kind": "exhaustiveKnn",
        "hnswParameters": null,
        "exhaustiveKnnParameters": {
            "metric": "cosine"
        }
        }
    ],
    "profiles": [
        {
        "name": "my-vector-profile",
        "algorithm": "my-hnsw-vector-config-1"
        }
    ]
    },
    "semantic": {
    "defaultConfiguration": null,
    "configurations": [
        {
        "name": "my-semantic-config",
        "prioritizedFields": {
            "titleField": {
            "fieldName": "HotelName"
            },
            "prioritizedContentFields": [
            {
                "fieldName": "Description"
            }
            ],
            "prioritizedKeywordsFields": [
            {
                "fieldName": "Category"
            }
            ]
        }
        }
    ]
    }
}

Najważniejsze wnioski dotyczące interfejsu API REST tworzenia indeksu:

  • Kolekcja fields zawiera wymagane pole klucza oraz pola tekstowe i wektorowe (takie jak Description i DescriptionVector) do wyszukiwania tekstu i wektora. Kolokowanie wektorów i pól niewektorów w tym samym indeksie umożliwia wykonywanie zapytań hybrydowych. Na przykład można połączyć filtry, wyszukiwanie tekstu z semantycznym rankingiem i wektorami w jedną operację zapytania.

  • Pola wektorowe muszą mieć type: Collection(Edm.Single) dimensions właściwości i .vectorSearchProfile

  • Sekcja vectorSearch jest tablicą przybliżonych konfiguracji i profilów algorytmu najbliższego sąsiada. Obsługiwane algorytmy obejmują hierarchiczny mały świat i wyczerpujący k najbliższy sąsiad. Aby uzyskać więcej informacji, zobacz Ocenianie istotności w wyszukiwaniu wektorów.

  • Konfiguracja (opcjonalnie) semantic umożliwia ponowne korbowanie wyników wyszukiwania. Wyniki można ponowić w zapytaniach typu semantic dla pól ciągów określonych w konfiguracji. Aby dowiedzieć się więcej, zobacz Semantic ranking overview (Omówienie klasyfikacji semantycznej).

Przekaż dokumenty

Tworzenie i ładowanie indeksu to oddzielne kroki. Schemat indeksu został utworzony w poprzednim kroku. Teraz musisz załadować dokumenty do indeksu.

W usłudze Azure AI Search indeks zawiera wszystkie dane z możliwością wyszukiwania i zapytania uruchamiane w usłudze wyszukiwania. W przypadku wywołań REST dane są udostępniane jako dokumenty JSON. Użyj interfejsu API REST indeksu dokumentów dla tego zadania. Identyfikator URI został rozszerzony w celu uwzględnienia docs kolekcji i index operacji.

  1. W programie Visual Studio Code otwórz az-search-vector-quickstart.rest utworzony wcześniej plik.

  2. ### Upload documents Znajdź blok kodu w pliku. Ten blok zawiera żądanie przekazania dokumentów do indeksu hotels-vector-quickstart w usłudze wyszukiwania.

    ### Upload documents
    POST {{baseUrl}}/indexes/hotels-quickstart-vectors/docs/index?api-version=2023-11-01  HTTP/1.1
    Content-Type: application/json
    Authorization: Bearer {{token}}
    
    {
        "value": [
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "1",
                "HotelName": "Stay-Kay City Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "The hotel is ideally located on the main commercial artery of the city 
                    in the heart of New York.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Boutique",
                "Tags": [
                    "pool",
                    "air conditioning",
                    "concierge"
                ],
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "2",
                "HotelName": "Old Century Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "The hotel is situated in a  nineteenth century plaza, which has been 
                    expanded and renovated to the highest architectural standards to create a modern, 
                    functional and first-class hotel in which art and unique historical elements 
                    coexist with the most modern comforts.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Boutique",
                "Tags": [
                    "pool",
                    "air conditioning",
                    "free wifi",
                    "concierge"
                ]
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "3",
                "HotelName": "Gastronomic Landscape Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "The Hotel stands out for its gastronomic excellence under the management of 
                    William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Resort and Spa",
                "Tags": [
                    "air conditioning",
                    "bar",
                    "continental breakfast"
                ]
            }
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "4",
                "HotelName": "Sublime Palace Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "Sublime Palace Hotel is located in the heart of the historic center of 
                    Sublime in an extremely vibrant and lively area within short walking distance to 
                    the sites and landmarks of the city and is surrounded by the extraordinary beauty 
                    of churches, buildings, shops and monuments. 
                    Sublime Palace is part of a lovingly restored 1800 palace.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Boutique",
                "Tags": [
                    "concierge",
                    "view",
                    "24-hour front desk service"
                ]
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "13",
                "HotelName": "Luxury Lion Resort",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury 
                    accommodations. Moments from the stadium, we feature the best in comfort",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Resort and Spa",
                "Tags": [
                    "view",
                    "free wifi",
                    "pool"
                ]
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "48",
                "HotelName": "Nordick's Valley Motel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "Only 90 miles (about 2 hours) from the nation's capital and nearby 
                    most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring 
                    the caverns?  It's all nearby and we have specially priced packages to help make 
                    our B&B your home base for fun while visiting the valley.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Boutique",
                "Tags": [
                    "continental breakfast",
                    "air conditioning",
                    "free wifi"
                ],
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "49",
                "HotelName": "Swirling Currents Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "Spacious rooms, glamorous suites and residences, rooftop pool, walking 
                    access to shopping, dining, entertainment and the city center.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Luxury",
                "Tags": [
                    "air conditioning",
                    "laundry service",
                    "24-hour front desk service"
                ]
            }
        ]
    }
    

    Ważne

    Kod w tym przykładzie nie jest uruchamiany. W celu zwięzłości usunięto kilka znaków lub wierszy. Użyj kodu w az-search-vector-quickstart.rest pliku, aby uruchomić żądanie.

  3. Wybierz pozycję Wyślij wniosek. Powinna zostać wyświetlona HTTP/1.1 200 OK odpowiedź. Treść odpowiedzi powinna zawierać reprezentację JSON dokumentów wyszukiwania.

Najważniejsze wnioski dotyczące żądania interfejsu API REST indeksu :

  • Dokumenty w ładunku składają się z pól zdefiniowanych w schemacie indeksu.

  • Pola wektorowe zawierają wartości zmiennoprzecinkowe. Atrybut wymiarów ma co najmniej 2 i maksymalnie 3072 wartości zmiennoprzecinkowe każdy. Ten przewodnik Szybki start ustawia atrybut wymiarów na 1536, ponieważ jest to rozmiar osadzania wygenerowany przez model osadzania w usłudze Azure OpenAI text-embedding-ada-002 .

Uruchamianie zapytań

Teraz, gdy dokumenty są ładowane, można wysyłać zapytania wektorowe względem nich przy użyciu funkcji Dokumenty — wyszukiwanie w wpisie (REST).

W następnych sekcjach uruchamiamy zapytania względem indeksu hotels-vector-quickstart . Zapytania obejmują:

Przykładowe zapytania wektorowe są oparte na dwóch ciągach:

  • Ciąg wyszukiwania: historic hotel walk to restaurants and shopping
  • Ciąg zapytania wektorowego (wektoryzowany do reprezentacji matematycznej): classic lodging near running trails, eateries, retail

Ciąg zapytania wektorowego jest semantycznie podobny do ciągu wyszukiwania, ale zawiera terminy, które nie istnieją w indeksie wyszukiwania. Jeśli wyszukujesz classic lodging near running trails, eateries, retailsłowo kluczowe , wyniki są zerowe. W tym przykładzie pokazano, jak można uzyskać odpowiednie wyniki, nawet jeśli nie ma pasujących terminów.

  1. W programie Visual Studio Code otwórz az-search-vector-quickstart.rest utworzony wcześniej plik.

  2. ### Run a single vector query Znajdź blok kodu w pliku. Ten blok zawiera żądanie zapytania względem indeksu wyszukiwania.

    ### Run a single vector query
    POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        Authorization: Bearer {{token}}
    
        {
            "count": true,
            "select": "HotelId, HotelName, Description, Category",
            "vectorQueries": [
                {
                    "vector"": [0.01944167, 0.0040178085
                        . . .  TRIMMED FOR BREVITY
                        010858015, -0.017496133],
                    "k": 7,
                    "fields": "DescriptionVector",
                    "kind": "vector",
                    "exhaustive": true
                }
            ]
        }
    

    To zapytanie wektorowe jest skracane w celu zwięzłości. Zawiera vectorQueries.vector wektoryzowany tekst danych wejściowych zapytania, fields określa, które pola wektorowe są przeszukiwane i k określa liczbę najbliższych sąsiadów do zwrócenia.

    Ciąg zapytania wektorowego to classic lodging near running trails, eateries, retail, który jest wektoryzowany do 1536 osadzania dla tego zapytania.

    Ważne

    Kod w tym przykładzie nie jest uruchamiany. W celu zwięzłości usunięto kilka znaków lub wierszy. Użyj kodu w az-search-vector-quickstart.rest pliku, aby uruchomić żądanie.

  3. Wybierz pozycję Wyślij wniosek. Powinna zostać wyświetlona HTTP/1.1 200 OK odpowiedź. Treść odpowiedzi powinna zawierać reprezentację JSON wyników wyszukiwania.

Odpowiedź dla wektora równoważnego classic lodging near running trails, eateries, retail zawiera siedem wyników. Każdy wynik zawiera wynik wyszukiwania i pola wymienione w selectpliku . W wyszukiwaniu podobieństwa odpowiedź zawsze zawiera k wyniki uporządkowane według wyniku podobieństwa wartości.

{
  "@odata.context": "https://my-demo-search.search.windows.net/indexes('hotels-vector-quickstart')/$metadata#docs(*)",
  "@odata.count": 7,
  "value": [
    {
      "@search.score": 0.85773647,
      "HotelId": "48",
      "HotelName": "Nordick's Motel",
      "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
      "Category": "Boutique"
    },
    {
      "@search.score": 0.8399132,
      "HotelId": "49",
      "HotelName": "Old Carrabelle Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
      "Category": "Luxury"
    },
    {
      "@search.score": 0.83839583,
      "HotelId": "13",
      "HotelName": "Historic Lion Resort",
      "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
      "Category": "Resort and Spa"
    },
    {
      "@search.score": 0.82543474,
      "HotelId": "4",
      "HotelName": "Sublime Cliff Hotel",
      "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace.",
      "Category": "Boutique"
    },
    {
      "@search.score": 0.82380104,
      "HotelId": "1",
      "HotelName": "Secret Point Hotel",
      "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York.",
      "Category": "Boutique"
    },
    {
      "@search.score": 0.8151413,
      "HotelId": "2",
      "HotelName": "Twin Dome Hotel",
      "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
      "Category": "Boutique"
    },
    {
      "@search.score": 0.8133767,
      "HotelId": "3",
      "HotelName": "Triple Landscape Hotel",
      "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel\u2019s restaurant services.",
      "Category": "Resort and Spa"
    }
  ]
}

Wyszukiwanie jednowektorowe z filtrem

Filtry można dodawać, ale filtry są stosowane do zawartości niewektorowej w indeksie. W tym przykładzie filtr dotyczy Tags pola, aby odfiltrować wszystkie hotele, które nie zapewniają bezpłatnej sieci Wi-Fi.

  1. W programie Visual Studio Code otwórz az-search-vector-quickstart.rest utworzony wcześniej plik.

  2. ### Run a vector query with a filter Znajdź blok kodu w pliku. Ten blok zawiera żądanie zapytania względem indeksu wyszukiwania.

    ### Run a vector query with a filter
    POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        Authorization: Bearer {{token}}
    
        {
            "count": true,
            "select": "HotelId, HotelName, Category, Tags, Description",
            "filter": "Tags/any(tag: tag eq 'free wifi')",
            "vectorFilterMode": "postFilter",
            "vectorQueries": [
            {
                "vector": [ VECTOR OMITTED ],
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            },
        ]
    }
    

    Ważne

    Kod w tym przykładzie nie jest uruchamiany. W celu zwięzłości usunięto kilka znaków lub wierszy. Użyj kodu w az-search-vector-quickstart.rest pliku, aby uruchomić żądanie.

  3. Wybierz pozycję Wyślij wniosek. Powinna zostać wyświetlona HTTP/1.1 200 OK odpowiedź. Treść odpowiedzi powinna zawierać reprezentację JSON wyników wyszukiwania.

Zapytanie było takie samo jak w poprzednim przykładzie wyszukiwania pojedynczego wektora, ale zawiera filtr wykluczeń po przetworzeniu i zwraca tylko trzy hotele, które mają bezpłatne Wi-Fi.

{
  "@odata.context": "https://my-demo-search.search.windows.net/indexes('hotels-vector-quickstart')/$metadata#docs(*)",
  "@odata.count": 3,
  "value": [
    {
      "@search.score": 0.85773647,
      "HotelId": "48",
      "HotelName": "Nordick's Motel",
      "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
      "Category": "Boutique",
      "Tags": [
        "continental breakfast",
        "air conditioning",
        "free wifi"
      ]
    },
    {
      "@search.score": 0.83839583,
      "HotelId": "13",
      "HotelName": "Historic Lion Resort",
      "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
      "Category": "Resort and Spa",
      "Tags": [
        "view",
        "free wifi",
        "pool"
      ]
    },
    {
      "@search.score": 0.8151413,
      "HotelId": "2",
      "HotelName": "Twin Dome Hotel",
      "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
      "Category": "Boutique",
      "Tags": [
        "pool",
        "free wifi",
        "air conditioning",
        "concierge"
      ]
    }
  ]
}

Wyszukiwanie hybrydowe składa się z zapytań słów kluczowych i zapytań wektorowych w jednym żądaniu wyszukiwania. W tym przykładzie zapytanie wektorowe i wyszukiwanie pełnotekstowe są uruchamiane współbieżnie:

  • Ciąg wyszukiwania: historic hotel walk to restaurants and shopping
  • Ciąg zapytania wektorowego (wektoryzowany do reprezentacji matematycznej): classic lodging near running trails, eateries, retail
  1. W programie Visual Studio Code otwórz az-search-vector-quickstart.rest utworzony wcześniej plik.

  2. ### Run a hybrid query Znajdź blok kodu w pliku. Ten blok zawiera żądanie zapytania względem indeksu wyszukiwania.

    ### Run a hybrid query
    POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        Authorization: Bearer {{token}}
    
    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelName, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [ VECTOR OMITTED],
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    

    Ważne

    Kod w tym przykładzie nie jest uruchamiany. W celu zwięzłości usunięto kilka znaków lub wierszy. Użyj kodu w az-search-vector-quickstart.rest pliku, aby uruchomić żądanie.

  3. Wybierz pozycję Wyślij wniosek. Powinna zostać wyświetlona HTTP/1.1 200 OK odpowiedź. Treść odpowiedzi powinna zawierać reprezentację JSON wyników wyszukiwania.

Ponieważ jest to zapytanie hybrydowe, wyniki są klasyfikowane przez wzajemne łączenie rangi (RRF). Funkcja RRF ocenia wyniki wyszukiwania wielu wyników wyszukiwania, przyjmuje odwrotność, a następnie scala i sortuje połączone wyniki. Zwracana top jest liczba wyników.

Przejrzyj odpowiedź:

{
    "@odata.count": 7,
    "value": [
        {
            "@search.score": 0.03279569745063782,
            "HotelName": "Luxury Lion Resort",
            "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort"
        },
        {
            "@search.score": 0.03226646035909653,
            "HotelName": "Sublime Palace Hotel",
            "Description": "Sublime Palace Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Palace is part of a lovingly restored 1800 palace."
        },
        {
            "@search.score": 0.03226646035909653,
            "HotelName": "Swirling Currents Hotel",
            "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center."
        },
        {
            "@search.score": 0.03205128386616707,
            "HotelName": "Nordick's Valley Motel",
            "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley."
        },
        {
            "@search.score": 0.03128054738044739,
            "HotelName": "Gastronomic Landscape Hotel",
            "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services."
        },
        {
            "@search.score": 0.03100961446762085,
            "HotelName": "Old Century Hotel",
            "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts."
        },
        {
            "@search.score": 0.03077651560306549,
            "HotelName": "Stay-Kay City Hotel",
            "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York."
        }
    ]
}

Ponieważ funkcja RRF scala wyniki, pomaga przejrzeć dane wejściowe. Poniższe wyniki pochodzą tylko z zapytania pełnotekstowego. Dwa najlepsze wyniki to Sublime Palace Hotel and History Lion Resort. Hotel Sublime Palace ma silniejszy wynik istotności BM25.

{
    "@search.score": 2.2626662,
    "HotelName": "Sublime Palace Hotel",
    "Description": "Sublime Palace Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Palace is part of a lovingly restored 1800 palace."
},
{
    "@search.score": 0.86421645,
    "HotelName": "Luxury Lion Resort",
    "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort"
},

W zapytaniu tylko wektorów, które używa HNSW do znajdowania dopasowań, Hotel Sublime Palace spada na czwartą pozycję. Historyczny Lew, który był drugi w wyszukiwaniu pełnotekstowym i trzecim w wyszukiwaniu wektorowym, nie doświadcza tego samego zakresu wahań, więc wydaje się być najlepszym dopasowaniem w zestawie wyników homogenizowanych.

"value": [
    {
        "@search.score": 0.857736,
        "HotelId": "48",
        "HotelName": "Nordick's Valley Motel",
        "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
        "Category": "Boutique"
    },
    {
        "@search.score": 0.8399129,
        "HotelId": "49",
        "HotelName": "Swirling Currents Hotel",
        "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
        "Category": "Luxury"
    },
    {
        "@search.score": 0.8383954,
        "HotelId": "13",
        "HotelName": "Luxury Lion Resort",
        "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 0.8254346,
        "HotelId": "4",
        "HotelName": "Sublime Palace Hotel",
        "Description": "Sublime Palace Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Palace is part of a lovingly restored 1800 palace.",
        "Category": "Boutique"
    },
    {
        "@search.score": 0.82380056,
        "HotelId": "1",
        "HotelName": "Stay-Kay City Hotel",
        "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York.",
        "Category": "Boutique"
    },
    {
        "@search.score": 0.81514084,
        "HotelId": "2",
        "HotelName": "Old Century Hotel",
        "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
        "Category": "Boutique"
    },
    {
        "@search.score": 0.8133763,
        "HotelId": "3",
        "HotelName": "Gastronomic Landscape Hotel",
        "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
        "Category": "Resort and Spa"
    }
]

Semantyczne wyszukiwanie hybrydowe z filtrem

Oto ostatnie zapytanie w kolekcji. To zapytanie hybrydowe z klasyfikacją semantyczną jest filtrowane, aby pokazać tylko hotele w promieniu 500 kilometrów od Waszyngtonu. Można ustawić vectorFilterMode wartość null, która jest równoważna wartości domyślnej (preFilter dla nowszych indeksów i postFilter starszych).

  1. W programie Visual Studio Code otwórz az-search-vector-quickstart.rest utworzony wcześniej plik.

  2. ### Run a hybrid query with semantic reranking Znajdź blok kodu w pliku. Ten blok zawiera żądanie zapytania względem indeksu wyszukiwania.

    ### Run a hybrid query with semantic reranking
    POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        Authorization: Bearer {{token}}
    
    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Description,Address/City, Address/StateProvince",
        "filter": "geo.distance(Location, geography'POINT(-77.03241 38.90166)') le 500",
        "vectorFilterMode": null,
        "facets": [ "Address/StateProvince"],
        "top": 7,
        "queryType": "semantic",
        "answers": "extractive|count-3",
        "captions": "extractive|highlight-true",
        "semanticConfiguration": "my-semantic-config",
        "vectorQueries": [
            {
                "vector": [ VECTOR OMITTED ],
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    

    Ważne

    Kod w tym przykładzie nie jest uruchamiany. W celu zwięzłości usunięto kilka znaków lub wierszy. Użyj kodu w az-search-vector-quickstart.rest pliku, aby uruchomić żądanie.

  3. Wybierz pozycję Wyślij wniosek. Powinna zostać wyświetlona HTTP/1.1 200 OK odpowiedź. Treść odpowiedzi powinna zawierać reprezentację JSON wyników wyszukiwania.

Przejrzyj odpowiedź. Odpowiedź to trzy hotele, które są filtrowane według lokalizacji i semantycznie StateProvince ponownie sklasyfikowane w celu podwyższenia poziomu wyników znajdujących się najbliżej zapytania ciągu wyszukiwania (historic hotel walk to restaurants and shopping).

Swirling Currents Hotel przenosi się teraz na pierwsze miejsce. Bez semantycznego rankingu, Nordick's Valley Motel jest numerem jeden. Dzięki semantycznemu rankingowi modele zrozumienia maszyn rozpoznają, że historic dotyczy "hotelu, w odległości spaceru od restauracji i zakupów".

{
  "@odata.context": "https://my-demo-search.search.windows.net/indexes('hotels-vector-quickstart')/$metadata#docs(*)",
  "@odata.count": 2,
  "@search.facets": {
    "Address/StateProvince": [
      {
        "count": 1,
        "value": "VA"
      }
    ]
  },
  "@search.answers": [],
  "value": [
    {
      "@search.score": 0.03306011110544205,
      "@search.rerankerScore": 2.8773112297058105,
      "HotelId": "49",
      "HotelName": "Old Carrabelle Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
      "Category": "Luxury",
      "Address": {
        "City": "Arlington",
        "StateProvince": "VA"
      }
    },
    {
      "@search.score": 0.03306011110544205,
      "@search.rerankerScore": 2.1703834533691406,
      "HotelId": "48",
      "HotelName": "Nordick's Motel",
      "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
      "Category": "Boutique",
      "Address": {
        "City": "Washington D.C.",
        "StateProvince": null
      }
    }
  ]
}

Najważniejsze wnioski dotyczące dokumentów — interfejs API REST wyszukiwania postów :

  • Wyszukiwanie wektorowe vectors.value jest określane za pośrednictwem właściwości . Wyszukiwanie słów kluczowych jest określane za pośrednictwem search właściwości .

  • W wyszukiwaniu hybrydowym można zintegrować wyszukiwanie wektorów z wyszukiwaniem pełnotekstowym za pomocą słów kluczowych. Filtry, sprawdzanie pisowni i klasyfikacja semantyczna mają zastosowanie tylko do zawartości tekstowej, a nie do wektorów. W tym ostatnim zapytaniu nie ma semantyki answer , ponieważ system nie wyprodukował takiego, który był wystarczająco silny.

  • Rzeczywiste wyniki zawierają więcej szczegółów, w tym semantyczne podpisy i wyróżnienia. Wyniki zostały zmodyfikowane pod kątem czytelności. Aby uzyskać pełną strukturę odpowiedzi, uruchom żądanie w kliencie REST.

Czyszczenie

Jeśli pracujesz w ramach własnej subskrypcji, dobrym pomysłem po zakończeniu projektu jest sprawdzenie, czy dalej potrzebujesz utworzonych zasobów. Uruchomione zasoby mogą generować koszty. Zasoby możesz usuwać pojedynczo lub jako grupę zasobów, usuwając cały zestaw zasobów.

Zasoby można znaleźć w witrynie Azure Portal i zarządzać nimi, korzystając z linku Wszystkie zasoby lub Grupy zasobów w okienku po lewej stronie.

Jeśli chcesz zachować usługę wyszukiwania, ale usunąć indeks i dokumenty, możesz użyć DELETE polecenia w kliencie REST. To polecenie (na końcu az-search-vector-quickstart.rest pliku) usuwa hotels-vector-quickstart indeks:

### Delete an index
DELETE  {{baseUrl}}/indexes/hotels-vector-quickstart?api-version=2023-11-01 HTTP/1.1
    Content-Type: application/json
    Authorization: Bearer {{token}}

Następne kroki

W następnym kroku zalecamy, aby dowiedzieć się, jak wywoływać wywołania interfejsu API REST bez kluczy interfejsu API.

Możesz również przejrzeć kod demonstracyjny dla języka Python, C# lub JavaScript.