Składnia zapytań Lucene w usłudze Azure AI Search

Podczas tworzenia zapytań w usłudze Azure AI Search możesz wybrać pełną składnię analizatora zapytań Lucene dla wyspecjalizowanych formularzy zapytań: symbol wieloznaczny, wyszukiwanie rozmyte, wyszukiwanie zbliżeniowe, wyrażenia regularne. Większość składni analizatora zapytań Lucene jest implementowana bez zmian w usłudze Azure AI Search, z wyjątkiem *wyszukiwań zakresu, które są konstruowane za pomocą $filter wyrażeń.

Aby użyć pełnej składni Lucene, ustaw parametr queryType na full i przekaż wyrażenie zapytania wzorowane na symbole wieloznaczne, wyszukiwanie rozmyte lub jeden z innych formularzy zapytań obsługiwanych przez pełną składnię. W interfejsie REST wyrażenia zapytań są udostępniane w parametrze searchżądania Search Documents (INTERFEJS API REST).

Przykład (pełna składnia)

Poniższy przykład to żądanie wyszukiwania skonstruowane przy użyciu pełnej składni. W tym konkretnym przykładzie pokazano wyszukiwanie w polu i zwiększanie terminów. Szuka hoteli, w których pole kategorii zawiera termin budget. Wszystkie dokumenty zawierające frazę "recently renovated" są klasyfikowane wyżej w wyniku terminu zwiększenie wartości (3).

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
  "queryType": "full",
  "search": "category:budget AND \"recently renovated\"^3",
  "searchMode": "all"
}

Chociaż nie jest specyficzny dla żadnego typu zapytania, searchMode parametr jest istotny w tym przykładzie. Za każdym razem, gdy operatory znajdują się w zapytaniu, należy ogólnie ustawić searchMode=all , aby upewnić się, że wszystkie kryteria są zgodne.

Aby uzyskać więcej przykładów, zobacz Przykłady składni zapytań Lucene. Aby uzyskać szczegółowe informacje na temat żądania i parametrów zapytania, w tym funkcji searchMode, zobacz Search Documents (INTERFEJS API REST).

Podstawy składni

Poniższe podstawy składni dotyczą wszystkich zapytań korzystających ze składni Lucene.

Ocena operatora w kontekście

Umieszczanie określa, czy symbol jest interpretowany jako operator, czy tylko inny znak w ciągu.

Na przykład w pełnej składni Lucene tylda (~) jest używana zarówno do wyszukiwania rozmytego, jak i wyszukiwania w pobliżu. Po umieszczeniu po zacytowanej frazie ~ wywołuje wyszukiwanie w pobliżu. Po umieszczeniu na końcu terminu ~ wywołuje wyszukiwanie rozmyte.

W ramach terminu, takiego jak business~analyst, znak nie jest oceniany jako operator. W tym przypadku przy założeniu, że zapytanie jest terminem lub zapytaniem frazy, wyszukiwanie pełnotekstowe z analiząleksykalizaną usuwa termin i ~ przerywa termin business~analyst w dwóch: business OR analyst.

Powyższy przykład to tylda (~), ale ta sama zasada ma zastosowanie do każdego operatora.

Ucieczka znaków specjalnych

Aby użyć dowolnych operatorów wyszukiwania w ramach tekstu wyszukiwania, należy użyć znaku ucieczki, poprzedzając go pojedynczym ukośnikiem odwrotnym (\). Na przykład w przypadku wyszukiwania symboli wieloznacznych w pliku https://, gdzie :// jest częścią ciągu zapytania, należy określić wartość search=https\:\/\/*. Podobnie wzorzec numeru telefonu ucieczki może wyglądać następująco \+1 \(800\) 642\-7676: .

Znaki specjalne, które wymagają ucieczki, obejmują następujące elementy:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \ /

Uwaga

Chociaż ucieczka utrzymuje tokeny razem, analiza leksykalna podczas indeksowania może je pozbawić. Na przykład standardowy analizator Lucene będzie przerywać wyrazy łączników, biały znak i inne znaki. Jeśli potrzebujesz znaków specjalnych w ciągu zapytania, może być potrzebny analizator, który zachowuje je w indeksie. Niektóre opcje obejmują analizatory języka naturalnego firmy Microsoft, które zachowują wyrazy łączników lub analizator niestandardowy dla bardziej złożonych wzorców. Aby uzyskać więcej informacji, zobacz Częściowe terminy, wzorce i znaki specjalne.

Kodowanie niebezpiecznych i zastrzeżonych znaków w adresach URL

Upewnij się, że wszystkie niebezpieczne i zastrzeżone znaki są kodowane w adresie URL. Na przykład jest niebezpiecznym znakiem, # ponieważ jest to identyfikator fragmentu/kotwicy w adresie URL. Znak musi być zakodowany tak, aby %23 był używany w adresie URL. & i = są przykładami znaków zarezerwowanych, ponieważ rozdzielają parametry i określają wartości w usłudze Azure AI Search. Aby uzyskać więcej informacji, zobacz RFC1738: Uniform Resource Locators (URL).

Niebezpieczne znaki to " ` < > # % { } | \ ^ ~ [ ]. Zastrzeżone znaki to ; / ? : @ = + &.

Operatory logiczne

Operatory logiczne można osadzić w ciągu zapytania, aby zwiększyć dokładność dopasowania. Pełna składnia obsługuje operatory tekstu oprócz operatorów znaków. Zawsze określaj operatory logiczne tekstu (AND, OR, NOT) we wszystkich limitach.

Operator tekstu Znak Przykład Użycie
ORAZ + wifi AND luxury Określa terminy, które musi zawierać dopasowanie. W tym przykładzie aparat zapytań wyszukuje dokumenty zawierające zarówno , jak wifi i luxury. Znak plus (+) może być również używany bezpośrednio przed terminem, aby był wymagany. Na przykład przewiduje, +wifi +luxury że oba terminy muszą znajdować się gdzieś w polu pojedynczego dokumentu.
LUB (brak) 1 wifi OR luxury Znajduje dopasowanie po znalezieniu dowolnego terminu. W tym przykładzie aparat zapytań zwraca dopasowanie do dokumentów zawierających elementy wifi lub luxury oba te elementy. Ponieważ or jest domyślnym operatorem połączenia, można również pominąć go, tak aby wifi luxury był odpowiednikiem wifi OR luxury.
NIE !, - wifi –luxury Zwraca dopasowanie w dokumentach, które wykluczają termin. Na przykład wyszukuje dokumenty, wifi –luxury które mają wifi termin , ale nie luxury.

1 Znak | nie jest obsługiwany dla operacji OR.

OPERATOR NOT Boolean

Ważne

Operator NOT (NOT, !, lub -) zachowuje się inaczej w pełnej składni niż w prostej składni.

  • W prostej składni zapytania z negacją zawsze mają automatycznie dodawany symbol wieloznaczny. Na przykład zapytanie -luxury jest automatycznie rozszerzane na -luxury *.
  • W pełnej składni zapytania z negacją nie mogą być łączone z symbolem wieloznacznymi. Na przykład zapytania -luxury * są niedozwolone.
  • W pełnej składni zapytania z pojedynczą negacją nie są dozwolone. Na przykład zapytanie -luxury jest niedozwolone.
  • W pełnej składni negacje będą zachowywać się tak, jakby zawsze były one anDed do zapytania niezależnie od trybu wyszukiwania.
    • Na przykład pełne zapytanie wifi -luxury składniowe w pełnej składni pobiera tylko dokumenty zawierające termin wifi, a następnie stosuje negację -luxury do tych dokumentów.
  • Jeśli chcesz użyć negacji do przeszukiwania wszystkich dokumentów w indeksie, zalecana jest prosta składnia z trybem any wyszukiwania.
  • Jeśli chcesz użyć negacji do przeszukiwania podzestawu dokumentów w indeksie, zalecana jest pełna składnia lub prosta składnia ze wszystkimi trybami wyszukiwania.
Typ kwerendy Tryb wyszukiwania Przykładowe zapytanie Zachowanie
Proste dowolny wifi -luxury Zwraca wszystkie dokumenty w indeksie. Dokumenty z terminem "wifi" lub dokumenty brakuje terminu "luksus" są w rankingu wyższym niż inne dokumenty. Zapytanie zostało rozwinięte do wifi OR -luxury OR *.
Uproszczony wszystkie wifi -luxury Zwraca tylko dokumenty w indeksie, które zawierają termin "wifi" i nie zawierają terminu "luksus". Zapytanie zostało rozwinięte do wifi AND -luxury AND *.
Pełny dowolny wifi -luxury Zwraca tylko dokumenty w indeksie, które zawierają termin "wifi", a następnie dokumenty zawierające termin "luksus" są usuwane z wyników.
Pełny wszystkie wifi -luxury Zwraca tylko dokumenty w indeksie, które zawierają termin "wifi", a następnie dokumenty zawierające termin "luksus" są usuwane z wyników.

Wyszukiwanie w polu

Operację wyszukiwania w polu można zdefiniować za fieldName:searchExpression pomocą składni, gdzie wyrażenie wyszukiwania może być pojedynczym wyrazem lub frazą albo bardziej złożonym wyrażeniem w nawiasach, opcjonalnie z operatorami logicznymi. Oto kilka przykładów:

  • genre:jazz NOT history

  • artists:("Miles Davis" "John Coltrane")

Pamiętaj, aby umieścić wiele ciągów w cudzysłowie, jeśli chcesz, aby oba ciągi były oceniane jako pojedyncza jednostka, w tym przypadku wyszukując dwóch odrębnych artystów w artists polu.

Pole określone w fieldName:searchExpression pliku musi być polem searchable . Zobacz Tworzenie indeksu , aby uzyskać szczegółowe informacje na temat sposobu użycia atrybutów indeksu w definicjach pól.

Uwaga

W przypadku korzystania z wyrażeń wyszukiwania w polu nie trzeba używać parametru searchFields , ponieważ każde wyrażenie wyszukiwania w polu ma jawnie określoną nazwę pola. Można jednak nadal użyć parametru searchFields , jeśli chcesz uruchomić zapytanie, w którym niektóre części są ograniczone do określonego pola, a reszta może mieć zastosowanie do kilku pól. Na przykład zapytanie będzie zgodne jazz tylko z polemgenre, podczas gdy będzie ono zgodne NOT history z polemdescription.search=genre:jazz NOT history&searchFields=description Nazwa pola podana w parametrze fieldName:searchExpression zawsze ma pierwszeństwo przed parametrem searchFields , dlatego w tym przykładzie nie musimy uwzględniać genre parametru searchFields .

Wyszukiwanie rozmyte

Wyszukiwanie rozmyte znajduje dopasowania w kategoriach, które mają podobną konstrukcję, rozszerzając termin do maksymalnie 50 terminów spełniających kryteria odległości dwóch lub mniej. Aby uzyskać więcej informacji, zobacz Wyszukiwanie rozmyte.

Aby przeprowadzić wyszukiwanie rozmyte, użyj symbolu tyldy ~ na końcu pojedynczego wyrazu z opcjonalnym parametrem, liczbą z zakresu od 0 do 2 (wartość domyślna), która określa odległość edycji. Na przykład blue~ lub blue~1 zwraca bluewartość , bluesi glue.

Wyszukiwanie rozmyte można stosować tylko do terminów, a nie fraz ujętych w cudzysłów, ale można dołączyć tyldę do każdego terminu indywidualnie w wieloczęściowej nazwie lub frazie. Na przykład Unviersty~ of~ Wshington~ będzie pasował do elementu .University of Washington

Wyszukiwanie zbliżeniowe

Wyszukiwania w pobliżu służą do znajdowania terminów znajdujących 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ą. Na przykład "hotel airport"~5 znajduje terminy hotel i airport w ciągu pięciu wyrazów w dokumencie.

Zwiększanie wagi terminu

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. Różni się to od profilów oceniania w tych profilach oceniania, które zwiększają niektóre pola, a nie określone terminy.

Poniższy przykład pomaga zilustrować różnice. Załóżmy, że istnieje profil oceniania, który zwiększa dopasowania w określonym polu, powiedzmy gatunek w przykładzie musicstoreindex. Zwiększenie terminu może służyć do dalszego zwiększania niektórych terminów wyszukiwania wyższych niż inne. Na przykład rock^2 electronic zwiększa liczbę dokumentów zawierających terminy wyszukiwania w polu gatunku wyższym niż inne pola z możliwością wyszukiwania w indeksie. Ponadto dokumenty zawierające skałę terminów wyszukiwania są klasyfikowane wyżej niż inny termin wyszukiwania elektronicznego w wyniku terminu zwiększenie wartości (2).

Aby zwiększyć termin, użyj karetki , ^symbol z współczynnikiem zwiększenia (liczba) na końcu wyszukiwanego terminu. Możesz również zwiększyć frazy. Im wyższy współczynnik zwiększenia, tym bardziej istotny jest termin w stosunku do innych terminów wyszukiwania. Domyślną wartością dla współczynnika wzmocnienia jest 1. Mimo że czynnik impulsu musi być dodatni, może być mniejszy niż 1 (na przykład 0,20).

Wyszukiwanie wyrażeń regularnych

Wyszukiwanie wyrażeń regularnych znajduje dopasowanie na podstawie wzorców, które są prawidłowe w obszarze Apache Lucene, zgodnie z dokumentacją w klasie RegExp. W usłudze Azure AI Search wyrażenie regularne jest ujęte między ukośnikami /.

Aby na przykład znaleźć dokumenty zawierające motel lub hotel, określ wartość /[mh]otel/. Wyszukiwania wyrażeń regularnych są dopasowywane do pojedynczych wyrazów.

Niektóre narzędzia i języki nakładają dodatkowe wymagania dotyczące znaków ucieczki poza reguły ucieczki nałożone przez usługę Azure AI Search. W przypadku formatu JSON ciągi zawierające ukośnik do przodu są ucieczki z ukośnikiem wstecznym: microsoft.com/azure/ staje się search=/.*microsoft.com\/azure\/.*/ miejscem search=/.* <string-placeholder>.*/ konfigurowania wyrażenia regularnego i microsoft.com\/azure\/ jest ciągiem z unikniętym ukośnikiem.

Dwa typowe symbole w zapytaniach wyrażeń regularnych to . i *. Obiekt . pasuje do dowolnego znaku i * pasuje do poprzedniego znaku zero lub więcej razy. Na przykład /be./ pasuje do terminów bee , a bet jednocześnie /be*/ będzie pasował bedo , beei beee , ale nie bet. Razem można dopasować dowolną serię znaków, .* tak aby /be.*/ pasował do dowolnego terminu rozpoczynającego się od be takiego jak better.

Jeśli wystąpią błędy składni w wyrażeniu regularnym, zapoznaj się z regułami ucieczki dla znaków specjalnych. Możesz również spróbować użyć innego klienta, aby potwierdzić, czy problem jest specyficzny dla narzędzia.

Wyszukiwanie wieloznaczne

Można użyć ogólnie rozpoznawane składni dla wielu (*) lub pojedynczych? () symboli wieloznacznych wyszukiwania. Pełna składnia Lucene obsługuje dopasowywanie prefiksów, prefiksów i sufiksów.

Zwróć uwagę, że analizator zapytań Lucene obsługuje używanie tych symboli z jednym terminem, a nie frazą.

Typ afiksu Opis i przykłady
Prefiks Fragment terminu występuje przed * lub ?. Na przykład wyrażenie search=alpha* zapytania zwraca alphanumeric lub alphabetical. Dopasowywanie prefiksów jest obsługiwane zarówno w prostej, jak i pełnej składni.
Sufiks Fragment terminu występuje po * lub ?, z ukośnikiem do przodu, aby rozdzielić konstrukcję. Na przykład search=/.*numeric/ zwraca wartość alphanumeric.
Infix Ujęcie * fragmentów terminów lub ?. Na przykład search=non*al zwraca wartości non-numerical i nonsensical.

Operatory można łączyć w jednym wyrażeniu. Na przykład 980?2* dopasuje wartości i 98072-122298052-1234, gdzie ? pasuje do pojedynczego (wymaganego) znaku i * pasuje do znaków o dowolnej długości, która następuje.

Dopasowanie sufiksu wymaga ograniczników ukośnika / wyrażenia regularnego. Ogólnie rzecz biorąc, nie można użyć symbolu * lub ? jako pierwszego znaku terminu bez znaku /. Należy również pamiętać, że funkcja * zachowuje się inaczej, gdy jest używana poza zapytaniami regularnymi. Poza ogranicznikiem * ukośnika / regularnego znak jest symbolem wieloznacznymi i pasuje do dowolnej serii znaków, podobnie jak .* w regex. Na przykład search=/non.*al/ tworzy ten sam zestaw wyników co search=non*al.

Uwaga

Z reguły dopasowywanie wzorców działa wolno, więc warto eksplorować alternatywne metody, takie jak tokenyzacja krawędzi n-gram, która tworzy tokeny dla sekwencji znaków w danym okresie. W przypadku tokenizacji n-gram indeks będzie większy, ale zapytania mogą być wykonywane szybciej, w zależności od konstrukcji wzorca i długości indeksowania ciągów. Aby uzyskać więcej informacji, zobacz Częściowe wyszukiwanie terminów i wzorce ze znakami specjalnymi.

Wpływ analizatora na zapytania wieloznaczne

Podczas analizowania zapytań zapytania, które są formułowane jako prefiks, sufiks, symbol wieloznaczny lub wyrażenia regularne są przekazywane jako do drzewa zapytań, pomijając analizę leksykową. Dopasowania zostaną znalezione tylko wtedy, gdy indeks zawiera ciągi w formacie określonym przez zapytanie. W większości przypadków potrzebny jest analizator podczas indeksowania, który zachowuje integralność ciągów, aby częściowe dopasowanie terminu i wzorca powiodło się. Aby uzyskać więcej informacji, zobacz Wyszukiwanie częściowe terminy w zapytaniach usługi Azure AI Search.

Rozważ sytuację, w której zapytanie terminal* wyszukiwania może zwracać wyniki zawierające terminy, takie jak terminate, terminationi terminates.

Gdyby użyć analizatora en.lucene (angielski Lucene), będzie on stosowany agresywny wynik każdego terminu. Na przykład , terminateterminationterminates wszystkie będą tokenizowane w dół do tokenu termi w indeksie. Po drugiej stronie terminy w zapytaniach używające symboli wieloznacznych lub wyszukiwania rozmytego nie są w ogóle analizowane, więc nie będzie żadnych wyników pasujących do terminat* zapytania.

Po drugiej stronie analizatory firmy Microsoft (w tym przypadku analizator en.microsoft) są nieco bardziej zaawansowane i używają lemmatyzacji zamiast ściągania. Oznacza to, że wszystkie wygenerowane tokeny powinny być prawidłowymi wyrazami w języku angielskim. Na przykład , terminateterminates, i termination będzie w większości pozostać cały w indeksie i byłoby lepszym wyborem dla scenariuszy, które zależą dużo od symboli wieloznacznych i wyszukiwania rozmytego.

Ocenianie symboli wieloznacznych i zapytań wyrażeń regularnych

Usługa Azure AI Search używa oceniania opartego na częstotliwości (BM25) dla zapytań tekstowych. Jednak w przypadku zapytań wieloznacznych i regularnych, w których zakres terminów może być potencjalnie szeroki, współczynnik częstotliwości jest ignorowany, aby zapobiec stronniczości klasyfikacji w stosunku do dopasowań z rzadkich terminów. Wszystkie dopasowania są traktowane równie w przypadku wyszukiwań wieloznacznych i regularnych.

Znaki specjalne

W niektórych okolicznościach możesz wyszukać znak specjalny, taki jak emoji "❤" lub znak "€". W takich przypadkach upewnij się, że używany analizator nie filtruje tych znaków. Analizator standardowy pomija wiele znaków specjalnych, z wyłączeniem ich z indeksu.

Analizatory tokenizowania znaków specjalnych obejmują analizator białych znaków, który uwzględnia wszelkie sekwencje znaków oddzielone odstępami jako tokeny (więc ciąg będzie traktowany jako token). Ponadto analizator języka, taki jak Microsoft English analyzer ("en.microsoft"), będzie przyjmować ciąg "€" jako token. Możesz przetestować analizator, aby zobaczyć, jakie tokeny generuje dla danego zapytania.

W przypadku używania znaków Unicode upewnij się, że symbole są prawidłowo uniknięte w adresie URL zapytania (na przykład w przypadku używania sekwencji ucieczki %E2%9D%A4+). Niektórzy klienci REST wykonują to tłumaczenie automatycznie.

Pierwszeństwo (grupowanie)

Nawiasy umożliwiają tworzenie podzapytań, w tym operatorów w instrukcji nawiasów. Na przykład motel+(wifi|luxury) wyszukuje dokumenty zawierające motel termin lub wifiluxury (lub oba).

Grupowanie pól jest podobne, ale zakresy grupowania do pojedynczego pola. Na przykład hotelAmenities:(gym+(wifi|pool)) wyszukuje pola hotelAmenities i gym , wifilub gym i pool.

Limity rozmiaru zapytania

Usługa Azure AI Search nakłada limity rozmiaru i kompozycji zapytań, ponieważ niezwiązane zapytania mogą zdestabilizować usługę wyszukiwania. Istnieją ograniczenia dotyczące rozmiaru i kompozycji zapytania (liczba klauzul). Istnieją również limity długości wyszukiwania prefiksów oraz złożoności wyszukiwania wyrażeń regularnych i wyszukiwania symboli wieloznacznych. Jeśli aplikacja generuje zapytania wyszukiwania programowo, zalecamy zaprojektowanie go w taki sposób, aby nie generował zapytań o niezwiązany rozmiar.

Aby uzyskać więcej informacji na temat limitów zapytań, zobacz Limity żądań interfejsu API.

Zobacz też