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ń zakresów, 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=2024-07-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 terminwifi
, a następnie stosuje negację-luxury
do tych dokumentów.
- Na przykład pełne zapytanie
- 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 blue
wartość , blues
i 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ł be
do , bee
i 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 i prefiksów. Użyj składni wyrażenia regularnego do dopasowywania 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 |
---|---|
przedrostek | 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. |
przyrostek | Fragment terminu występuje po * lub ? , z ukośnikiem do przodu, aby rozdzielić konstrukcję. Na przykład search=/.*numeric/ zwraca wartość alphanumeric . |
infiks | 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-1222
98052-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 temat 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
, termination
i terminates
.
Gdyby użyć analizatora en.lucene (angielski Lucene), będzie on stosowany agresywny wynik każdego terminu. Na przykład , terminate
termination
terminates
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 , terminate
terminates
, 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 wifi
luxury
(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
, wifi
lub 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.