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 budgetiç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=2023-11-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~analystbir 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\-7676benzer 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 wifiluxuryiç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 luxurywifi OR luxurybunu 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 luxurybelgeleri 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 terimini wifiiçeren belgeleri getirir ve ardından olumsuzlamayı -luxury bu belgelere uygular.
  • 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 , bluesve gluedö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 Washingtoneş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ürgibi 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 hoteliç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 beeebebee, ancak eşleşmez.bet/be*/betbee/be./ Birlikte, .* ile başlayan herhangi bir terimle eşleşmesi için herhangi bir karakter /be.*/ serisini bebettereş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, infix ve sonek eşleştirmeyi destekler.

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 alphanumericalphabetical. Ön ek eşleştirme hem basit hem de tam söz diziminde desteklenir.
Soneki 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.
infix Terim parçaları veya içine alınır *?. Örneğin, search=non*al ve nonsensicaldö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-122298052-1234980?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*alaynı 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* , terminationve terminatesgibi terminateterimler 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, terminationterminates 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, terminatesve 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 gymwifipoolalanında hotelAmenitiesgym 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ı.

Ayrıca bkz.