Azure AI Search'te Lucene sorgu söz dizimi
Azure AI Search'te sorgu oluştururken, özel sorgu formları için tam Lucene Sorgu Ayrıştırıcısı söz dizimini seçebilirsiniz: joker karakter, benzer arama, yakınlık araması, normal ifadeler. Lucene Sorgu Ayrıştırıcı söz diziminin çoğu, ifadeler aracılığıyla $filter
yapılan aralık aramaları dışında Azure AI Search'te olduğu gibi uygulanır.
Tam Lucene söz dizimini kullanmak için queryType full
değerini olarak ayarlayın ve joker karakter, belirsiz arama veya tam söz dizimi tarafından desteklenen diğer sorgu formlarından biri için desenli bir sorgu ifadesi geçirin. REST'de sorgu ifadeleri, Arama Belgeleri (REST API) isteğinin parametresinde search
sağlanır.
Örnek (tam söz dizimi)
Aşağıdaki örnek, tam söz dizimi kullanılarak yapılan bir arama isteğidir. Bu özel örnekte, alan içi arama ve terim artırma gösterilmektedir. Kategori alanının terimini budget
içerdiği otelleri arar. tümceciği "recently renovated"
içeren tüm belgeler, artırma değeri (3) teriminin sonucu olarak daha yüksek sıralanır.
POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
"queryType": "full",
"search": "category:budget AND \"recently renovated\"^3",
"searchMode": "all"
}
Herhangi bir sorgu türüne özgü olmasa da, searchMode
parametresi bu örnekte geçerlidir. Sorguda işleçler olduğunda, genellikle tüm ölçütlerin eşleştiğinden emin olmak için ayarlamanız searchMode=all
gerekir.
Daha fazla örnek için bkz . Lucene sorgu söz dizimi örnekleri. searchMode dahil olmak üzere sorgu isteği ve parametreleri hakkında ayrıntılar için bkz . Belge Arama (REST API).
Söz dizimi temelleri
Aşağıdaki söz dizimi temelleri Lucene söz dizimini kullanan tüm sorgular için geçerlidir.
Bağlamda işleç değerlendirmesi
Yerleştirme, bir simgenin bir işleç olarak mı yoksa bir dizedeki başka bir karakter olarak mı yorumleneceğini belirler.
Örneğin, Lucene tam söz diziminde tilde (~
), hem benzer arama hem de yakınlık araması için kullanılır. Tırnak içine alınmış bir tümceciğin arkasına yerleştirildiğinde, ~
yakınlık araması çağırır. Bir terimin sonuna yerleştirildiğinde, ~
belirsiz aramayı çağırır.
gibi business~analyst
bir terim içinde karakter işleç olarak değerlendirilmez. Bu durumda, sorgunun bir terim veya tümcecik sorgusu olduğunu varsayarsak, sözcük temelli çözümleme ile tam metin araması öğesini çıkarır ~
ve terimi business~analyst
iki olarak keser: business
OR analyst
.
Yukarıdaki örnek tilde ()~
şeklindedir, ancak her işleç için aynı ilke geçerlidir.
Özel karakterlerden kaçış
Arama işleçlerinden herhangi birini arama metninin bir parçası olarak kullanmak için karakterin önüne tek bir ters eğik çizgi (\
) ekleyerek kaçış yapın. Örneğin, üzerinde https://
://
sorgu dizesinin bir parçası olan joker karakter araması için öğesini belirtmeniz gerekirsearch=https\:\/\/*
. Benzer şekilde, kaçış telefon numarası deseni şuna \+1 \(800\) 642\-7676
benzer olabilir.
Kaçış gerektiren özel karakterler şunlardır:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \ /
Not
Kaçış belirteçleri bir arada tutsa da, dizin oluşturma sırasında sözcük çözümlemesi bunları ayırabilir. Örneğin, standart Lucene çözümleyicisi kısa çizgi, boşluk ve diğer karakterlerdeki sözcükleri böler. Sorgu dizesinde özel karakterlere ihtiyacınız varsa, bunları dizinde koruyan bir çözümleyiciye ihtiyacınız olabilir. Bazı seçenekler arasında hecelenmiş sözcükleri koruyan Microsoft doğal dil çözümleyicileri veya daha karmaşık desenler için özel bir çözümleyici bulunur. Daha fazla bilgi için bkz . Kısmi terimler, desenler ve özel karakterler.
URL'lerde güvenli olmayan ve ayrılmış karakterleri kodlama
Tüm güvenli olmayan ve ayrılmış karakterlerin url'de kodlandığından emin olun. Örneğin, #
URL'de parça/yer işareti tanımlayıcısı olduğundan güvenli olmayan bir karakterdir. Karakter, URL'de kullanılıyorsa olarak kodlanmalıdır %23
. &
ve =
Azure AI Search'te parametreleri sınırlandıran ve değerleri belirten ayrılmış karakterlere örnektir. Daha fazla ayrıntı için bkz. RFC1738: Tekdüzen Kaynak Bulucuları (URL).
Güvenli olmayan karakterler şeklindedir " ` < > # % { } | \ ^ ~ [ ]
. Ayrılmış karakterler şunlardır: ; / ? : @ = + &
.
Boole işleçleri
Bir eşleşmenin duyarlığını geliştirmek için sorgu dizesine Boole işleçleri ekleyebilirsiniz. Tam söz dizimi, karakter işleçlerine ek olarak metin işleçlerini destekler. Her zaman tüm büyük harflerde metin boole işleçlerini (AND, OR, NOT) belirtin.
Metin işleci | Karakter | Örnek | Kullanım |
---|---|---|---|
AND | + |
wifi AND luxury |
Eşleşmenin içermesi gereken terimleri belirtir. Örnekte sorgu altyapısı hem hem de wifi luxury içeren belgeleri arar. Artı karakteri (+ ), gerekli hale getirmek için doğrudan bir terimin önünde de kullanılabilir. Örneğin, +wifi +luxury her iki terimin de tek bir belgenin alanında bir yerde görünmesi gerektiğini bildirir. |
VEYA | (yok) 1 | wifi OR luxury |
Terimlerden biri bulunduğunda bir eşleşme bulur. Örnekte, sorgu altyapısı ya da luxury her ikisini içeren wifi belgelerde eşleşme döndürür. OR varsayılan bağlaç işleci olduğundan, eşdeğeri olacak şekilde wifi luxury wifi OR luxury bunu dışarıda bırakabilirsiniz. |
NOT | ! , - |
wifi –luxury |
Terimi dışlayan belgelerde bir eşleşme döndürür. Örneğin, wifi –luxury terimi olan wifi ancak olmayan luxury belgeleri arar. |
1 Karakter |
OR işlemleri için desteklenmez.
NOT Boole işleci
Önemli
NOT işleci (NOT
, !
veya -
) tam söz diziminde basit söz diziminde olduğundan farklı davranır.
- Basit söz diziminde, olumsuzlama içeren sorgularda her zaman otomatik olarak bir joker karakter eklenir. Örneğin, sorgu
-luxury
otomatik olarak olarak olarak-luxury *
genişletilir. - Tam söz diziminde, olumsuzlama içeren sorgular joker karakterle birleştirilemez. Örneğin, sorgulara
-luxury *
izin verilmez. - Tam söz diziminde, tek bir olumsuzlama içeren sorgulara izin verilmez. Örneğin, sorguya
-luxury
izin verilmez. - Tam söz diziminde olumsuzlamalar, arama modundan bağımsız olarak sorguda her zaman AND'ler gibi davranır.
- Örneğin, tam söz dizimindeki tam söz dizimi sorgusu
wifi -luxury
yalnızca teriminiwifi
içeren belgeleri getirir ve ardından olumsuzlamayı-luxury
bu belgelere uygular.
- Örneğin, tam söz dizimindeki tam söz dizimi sorgusu
- Dizindeki tüm belgeler üzerinde arama yapmak için olumsuzlamalar kullanmak istiyorsanız, arama moduyla
any
basit söz dizimi önerilir. - Dizindeki belgelerin bir alt kümesinde arama yapmak için olumsuzlamalar kullanmak istiyorsanız, tam söz dizimi veya tüm arama moduyla basit söz dizimi önerilir.
Sorgu Türü | Arama Modu | Örnek Sorgu | Davranış |
---|---|---|---|
Basit | herhangi bir | wifi -luxury |
Dizindeki tüm belgeleri döndürür. "Wifi" terimi veya "lüks" terimi eksik olan belgeler diğer belgelere göre daha yüksek sıralanır. Sorgu olarak wifi OR -luxury OR * genişletilir. |
Basit | tümü | wifi -luxury |
Yalnızca dizinde "wifi" terimini içeren ve "lüks" terimini içermeyen belgeleri döndürür. Sorgu olarak wifi AND -luxury AND * genişletilir. |
Tam | herhangi bir | wifi -luxury |
Yalnızca dizinde "wifi" terimini içeren belgeleri döndürür ve ardından "lüks" terimini içeren belgeler sonuçlardan kaldırılır. |
Tam | tümü | wifi -luxury |
Yalnızca dizinde "wifi" terimini içeren belgeleri döndürür ve ardından "lüks" terimini içeren belgeler sonuçlardan kaldırılır. |
Alanlı arama
Arama ifadesinin fieldName:searchExpression
tek bir sözcük veya tümcecik olabileceği veya isteğe bağlı olarak Boole işleçleriyle parantez içinde daha karmaşık bir ifade olabileceği, söz dizimi ile alanlı bir arama işlemi tanımlayabilirsiniz. Bazı örnekler şunlardır:
genre:jazz NOT history
artists:("Miles Davis" "John Coltrane")
Her iki dizenin de tek bir varlık olarak değerlendirilmesini istiyorsanız, bu durumda alanda iki ayrı sanatçının aranmasını istiyorsanız, tırnak içine birden çok dize yerleştirdiğinizden artists
emin olun.
içinde fieldName:searchExpression
belirtilen alan bir searchable
alan olmalıdır. Alan tanımlarında dizin özniteliklerinin nasıl kullanıldığı hakkında ayrıntılı bilgi için bkz . Dizin Oluşturma.
Not
Alanlı arama ifadelerini kullanırken, her alanlı arama ifadesinin searchFields
açıkça belirtilen bir alan adı olduğundan parametresini kullanmanız gerekmez. Ancak, bazı bölümlerin searchFields
kapsamı belirli bir alanla belirlenmiş bir sorgu çalıştırmak istiyorsanız ve gerisi birkaç alana uygulanabilirse parametresini kullanmaya devam edebilirsiniz. Örneğin, sorgu search=genre:jazz NOT history&searchFields=description
yalnızca genre
alanla eşleşirkenjazz
, alanla description
eşleşecekNOT history
. içinde fieldName:searchExpression
sağlanan alan adı her zaman parametresinden searchFields
önceliklidir; bu nedenle bu örnekte parametresine searchFields
eklememiz genre
gerekmez.
Bulanık arama
Benzer arama, benzer bir yapıya sahip olan terimlerdeki eşleşmeleri bulur ve bir terimi iki veya daha az mesafe ölçütünü karşılayan en fazla 50 terime kadar genişletir. Daha fazla bilgi için bkz . Benzer arama.
Benzer bir arama yapmak için, tek bir sözcüğün sonundaki tilde ~
simgesini, düzenleme uzaklığı belirten 0 ile 2 (varsayılan) arasında bir sayı olan isteğe bağlı bir parametreyle kullanın. Örneğin, blue~
veya blue~1
, blues
ve glue
döndürürblue
.
Benzer arama yalnızca terimlere uygulanabilir, tırnak içine alınmış tümceciklere uygulanamaz, ancak tildeyi her terime çok parçalı bir ad veya tümcecik içinde tek tek ekleyebilirsiniz. Örneğin, Unviersty~ of~ Wshington~
ile University of Washington
eşleşer.
Yakınlık araması
Yakınlık aramaları, belgede birbirine yakın terimleri bulmak için kullanılır. Tümceciğin sonuna bir tilde ~
simgesi ve ardından yakınlık sınırını oluşturan sözcük sayısını ekleyin. Örneğin, "hotel airport"~5
bir belgedeki terimleri hotel
ve airport
birbirinin beş sözcüğü içinde bulur.
Terim artırma
Terim artırma, öne çıkarılmış terimi içeren bir belgeyi, terimi içermeyen belgelere göre daha yüksek derecelendirmeyi ifade eder. Bu, puanlama profillerinin belirli terimler yerine belirli alanları artırması açısından puanlama profillerinden farklıdır.
Aşağıdaki örnek farkları göstermeye yardımcı olur. Musicstoreindex örneğindeki tür gibi belirli bir alanda eşleşmeleri artıran bir puanlama profili olduğunu varsayalım. Terim artırma, bazı arama terimlerini diğerlerinden daha yüksek bir şekilde artırmak için kullanılabilir. Örneğin, rock^2 electronic
tür alanındaki arama terimlerini içeren belgeleri dizindeki diğer aranabilir alanlara göre daha yüksek bir değere yükseltir. Ayrıca, taş arama terimini içeren belgeler, artırma değeri (2) teriminin sonucu olarak elektronik arama teriminden daha yüksek derecelenir.
Bir terimi artırmak için, ^
aradığınız terimin sonundaki bir destek faktörü (sayı) içeren şapka işaretini ( simgesi) kullanın. Tümcecikleri de artırabilirsiniz. Artırma faktörü ne kadar yüksekse, terim diğer arama terimlerine göre o kadar ilgili olur. Varsayılan olarak yükseltme faktörü 1'dir. Artış faktörü pozitif olmalıdır ancak 1'den küçük olabilir (örneğin, 0,20).
Normal ifade araması
Normal ifade araması, RegExp sınıfında belgelendiği gibi Apache Lucene altında geçerli olan desenleri temel alan bir eşleşme bulur. Azure AI Search'te normal bir ifade eğik çizgi /
arasına alınır.
Örneğin, veya hotel
içeren motel
belgeleri bulmak için belirtin/[mh]otel/
. Normal ifade aramaları tek sözcüklerle eşleştirilir.
Bazı araçlar ve diller, Azure AI Search tarafından uygulanan kaçış kurallarının ötesinde fazladan kaçış karakteri gereksinimleri uygular. JSON için eğik çizgi içeren dizeler ters eğik çizgiyle kaçıştır: microsoft.com/azure/
normal ifadenin ayarlandığı yer search=/.* <string-placeholder>.*/
olur search=/.*microsoft.com\/azure\/.*/
ve microsoft.com\/azure\/
kaçış eğik çizgili dizedir.
Regex sorgularındaki iki yaygın simge ve *
şeklindedir.
. A .
herhangi bir karakterle, bir *
ise önceki karakterle sıfır veya daha fazla kez eşleşir. Örneğin, terimleri ve iken ile eşleşir beee
be
bee
, ancak eşleşmez.bet
/be*/
bet
bee
/be./
Birlikte, .*
ile başlayan herhangi bir terimle eşleşmesi için herhangi bir karakter /be.*/
serisini be
better
eşleştirmenize izin verin.
Normal ifadenizde söz dizimi hataları alırsanız, özel karakterler için kaçış kurallarını gözden geçirin. Sorunun aracina özgü olup olmadığını doğrulamak için farklı bir istemci de deneyebilirsiniz.
Joker karakter araması
Birden çok () veya tek?
(*
) karakterli joker karakter araması için genel olarak tanınan söz dizimi kullanabilirsiniz. Tam Lucene söz dizimi ön ek ve infix eşleştirmeyi destekler. Sonek eşleştirmesi için normal ifade söz dizimini kullanın.
Lucene sorgu ayrıştırıcısının bu simgelerin bir tümcecikle değil tek bir terimle kullanılmasını desteklediğini unutmayın.
Düzeltme türü | Açıklama ve örnekler |
---|---|
önek | Terim parçası veya ? 'den önce * gelir. Örneğin, bir sorgu ifadesi search=alpha* veya döndürür alphanumeric alphabetical . Ön ek eşleştirme hem basit hem de tam söz diziminde desteklenir. |
sonek | Terim parçası, yapısını sınırlandırmak için eğik çizgiyle veya ? sonrasında gelir* . Örneğin, search=/.*numeric/ döndürür alphanumeric . |
orta ek | Terim parçaları veya içine alınır * ? . Örneğin, search=non*al ve nonsensical döndürürnon-numerical . |
İşleçleri tek bir ifadede birleştirebilirsiniz. Örneğin, ve ile eşleşir; burada ?
tek bir (gerekli) karakterle eşleşir ve *
izleyen rastgele uzunluktaki karakterlerle eşleşir.98072-1222
98052-1234
980?2*
Sonek eşleştirme için normal ifade eğik çizgi /
sınırlayıcıları gerekir. Genel olarak, veya *
?
simgesini terimin ilk karakteri olarak kullanamazsınız./
Regex sorgularının dışında kullanıldığında farklı davrandığını *
da unutmayın. regex eğik çizgi /
sınırlayıcısının dışında, *
joker karakterdir ve regex'teki gibi .*
herhangi bir karakter serisiyle eşleşir. Örneğin, search=/non.*al/
ile search=non*al
aynı sonuç kümesini üretir.
Not
Kural olarak, desen eşleştirme yavaş olduğundan, terimdeki karakter dizileri için belirteçler oluşturan kenar n-gram belirteci gibi alternatif yöntemleri keşfetmek isteyebilirsiniz. N-gram belirteci ile dizin daha büyük olur, ancak desen yapısına ve dizine aldığınız dizelerin uzunluğuna bağlı olarak sorgular daha hızlı yürütülebilir. Daha fazla bilgi için bkz. Kısmi terim araması ve özel karakterler içeren desenler.
Çözümleyicinin joker karakter sorguları üzerindeki etkisi
Sorgu ayrıştırma sırasında ön ek, sonek, joker karakter veya normal ifade olarak formüle edilen sorgular, sözcük temelli çözümleme atlayarak sorgu ağacına olduğu gibi geçirilir. Eşleşmeler yalnızca dizin sorgunuzun belirttiği biçimde dizeleri içeriyorsa bulunur. Çoğu durumda, dizin oluşturma sırasında kısmi terim ve desen eşleştirmenin başarılı olması için dize bütünlüğünü koruyan bir çözümleyiciye ihtiyacınız vardır. Daha fazla bilgi için bkz . Azure AI Search sorgularında kısmi terim araması.
Arama sorgusunun terminal*
, termination
ve terminates
gibi terminate
terimler içeren sonuçları döndürmesini isteyebileceğiniz bir durum düşünün.
En.lucene (english Lucene) çözümleyicisini kullanırsanız, her terimin agresif kökenlendirmesi uygulanır. Örneğin, terminate
, termination
terminates
tüm belirteçleri dizininizdeki belirtecin termi
belirtecine indirilir. Diğer taraftan, joker karakter veya benzer arama kullanan sorgulardaki terimler hiç analiz edilmediğinden sorguyla terminat*
eşleşen hiçbir sonuç olmaz.
Diğer taraftan, Microsoft çözümleyicileri (bu örnekte en.microsoft çözümleyicisi) biraz daha gelişmiştir ve kök oluşturmak yerine lemmatizasyon kullanır. Bu, oluşturulan tüm belirteçlerin geçerli İngilizce sözcükler olması gerektiği anlamına gelir. Örneğin, terminate
, terminates
ve termination
çoğunlukla dizinde tam olarak kalır ve joker karakterlere ve benzer aramalara çok bağlı senaryolar için tercih edilebilir bir seçim olacaktır.
Joker karakter ve regex sorgularını puanlama
Azure AI Search, metin sorguları için sıklık tabanlı puanlama (BM25) kullanır. Ancak, terimlerin kapsamının geniş olabileceği joker karakter ve regex sorguları için sıklık faktörü, sıralamanın nadir terimlerden gelen eşleşmelere sapmasını önlemek için yoksayılır. Joker karakter ve regex aramaları için tüm eşleşmeler eşit olarak değerlendirilir.
Özel karakterler
Bazı durumlarda, '' emojisi veya '❤€' işareti gibi özel bir karakter aramak isteyebilirsiniz. Böyle durumlarda, kullandığınız çözümleyicinin bu karakterleri filtrelemediğinden emin olun. Standart çözümleyici birçok özel karakteri atlar ve bunları dizininizden dışlar.
Özel karakterleri belirteci oluşturan çözümleyiciler, boşluklarla ayrılmış karakter dizilerini belirteç olarak dikkate alan boşluk çözümleyicisini ❤
içerir (bu nedenle dize bir belirteç olarak kabul edilir). Ayrıca, Microsoft İngilizce çözümleyicisi ("en.microsoft") gibi bir dil çözümleyicisi "€" dizesini belirteç olarak alır. Belirli bir sorgu için hangi belirteçleri ürettiğini görmek için bir çözümleyiciyi test edebilirsiniz.
Unicode karakterleri kullanırken, sorgu URL'sinde simgelerin düzgün bir şekilde kaçıldığından emin olun (örneğin, için ❤
kaçış dizisi %E2%9D%A4+
kullanılır). Bazı REST istemcileri bu çeviriyi otomatik olarak yapar.
Öncelik (gruplandırma)
Parantez deyimi içindeki işleçler de dahil olmak üzere alt sorgular oluşturmak için ayraç kullanabilirsiniz. Örneğin, motel+(wifi|luxury)
terimini ve motel
veya (ya luxury
da wifi
her ikisini) içeren belgeleri arar.
Alan gruplandırma benzerdir, ancak gruplandırma kapsamını tek bir alanla doldurur. Örneğin, hotelAmenities:(gym+(wifi|pool))
ve veya ve gym
wifi
pool
alanında hotelAmenities
gym
aramalar.
Sorgu boyutu sınırları
Azure AI Search, ilişkisiz sorgular arama hizmetinizin istikrarını bozabileceğinden sorgu boyutuna ve oluşturmaya sınırlar uygular. Sorgu boyutu ve oluşturma (yan tümce sayısı) ile ilgili sınırlar vardır. Ayrıca, ön ek aramasının uzunluğu ve regex araması ile joker karakter aramasının karmaşıklığı için sınırlar vardır. Uygulamanız program aracılığıyla arama sorguları oluşturuyorsa, bunu ilişkisiz boyutta sorgular oluşturmayabilecek şekilde tasarlamanızı öneririz.
Sorgu sınırları hakkında daha fazla bilgi için bkz . API isteği sınırları.