Azure Bilişsel Arama'de Lucene sorgu söz dizimi

Sorgu oluştururken, özel sorgu formları için Lucene Sorgu Ayrıştırıcı söz dizimlerini kullanabilirsiniz: joker karakter, belirsiz arama, yakınlık araması, normal ifadeler. Lucene Sorgu Ayrıştırıcısı söz dizimlerinin büyük bir Azure Bilişsel Arama, ifadeler aracılığıyla oluşturulmuş aralık aramaları dışında, içinde $filter olduğu gibi uygulanır.

Tam Lucene söz dizimi kullanmak için queryType'i "full" olarak ayarlanacak ve joker karakter, belirsiz arama için desenli bir sorgu ifadesi ya da tam söz dizimi tarafından desteklenen diğer sorgu formlarından birini geçeceksiniz. REST'te sorgu ifadeleri, Arama Belgeleri search (REST API) isteğinin parametresinde sağlanır.

Örnek (tam söz dizimi)

Aşağıdaki örnek, tam söz dizimi kullanılarak oluşturulmuş bir arama isteğidir. Bu örnek, alan içinde arama ve terim artırmayı gösterir. Kategori alanında "bütçe" teriminin bulunduğu oteller için bir görünümdedir. "Son zamanlarda ortaya çıktı" ifadesini içeren tüm belgeler, boost değeri (3) teriminin sonucu olarak daha yüksek dereceye sahip olur.

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

Herhangi bir sorgu türüne özgü değildir, searchMode ancak bu örnekte parametresi alakalıdır. İşleçler sorguda olduğunda, genel olarak tüm searchMode=all ölçütlerin eş olduğundan emin olmak için ayarlamış oluruz.

Ek örnekler için bkz. Lucene sorgu söz dizimi örnekleri. SearchMode dahil olmak üzere sorgu isteği ve parametreleri hakkında ayrıntılı bilgi için bkz. Arama Belgeleri (REST API).

Söz dizimi temelleri

Aşağıdaki söz dizimi temelleri Lucene söz dizimi kullanan tüm sorgular için geçerlidir.

Bağlamda işleç değerlendirmesi

Yerleştirme, bir sembolün bir işleç olarak mı yoksa bir dizedeki başka bir karakter olarak mı yorumlanmasına karar verir.

Örneğin Lucene tam söz dizimsinde hem belirsiz arama hem de yakınlık araması için tilde (~) kullanılır. Tırnak içine yerleştirilmiş bir tümceciğin ardından yerleştirildikten sonra ~ yakınlık araması çağırır. Bir terimin sonuna yerleştiril olduğunda ~ belirsiz arama çağırır.

"business~analyst" gibi bir terimde karakter işleç olarak değerlendirilmez. Bu durumda, sorgunun bir terim veya tümcecik sorgusu olduğu varsayılırsa, sözcük çözümlemesi ile tam metin araması ~ ifadesini çıkartır ve "business~analyst" terimini ikide kırar: iş VEYA analist.

Yukarıdaki örnekte tilde (~) ve her işleç için aynı ilke geçerlidir.

Kaçış özel karakterleri

Arama metninin bir parçası olarak arama işleçlerinin herhangi birini kullanmak için tek ters eğik çizgi () ile önek olarak karakteri kaçış karakterine kaçış karakteri \ ekler. Örneğin, üzerinde joker karakter araması için https:// , burada :// sorgu dizesinin bir parçasıdır, belirtmeniz search=https\:\/\/* gerekir. Benzer şekilde, bir kaçarak telefon numarası deseni şuna benzer \+1 \(800\) 642\-7676 olabilir: .

Kaçış gerektiren özel karakterler şunlardır:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \ /

Not

Kaçış belirteçleri bir arada tutar ancak dizin oluşturma sırasında sözcük analizi bunları çıkartır. Örneğin, standart Lucene çözümleyicisi kısa çizgi, boşluk ve diğer karakterlerdeki sözcükleri bozacak. Sorgu dizesinde özel karakterlere ihtiyacınız varsa, bunları dizinde koruyan bir çözümleyiciye ihtiyacınız olabilir. Bazı seçenekler arasında kısa çizgili sözcükleri koruyanMicrosoft doğal dil çözümleyicileri veya daha karmaşık desenler için özel bir çözümleyici yer almaktadır. 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 bir URL'de kodlanmış olduğundan emin olun. Örneğin, '#' güvenli olmayan bir karakterdir çünkü URL'de bir parça/sabit noktası tanımlayıcısıdır. Bir %23 URL'de kullanılıyorsa, karakteri olarak kodlanması gerekir. '&' ve '=' parametreleri sınırlaya kadar ayrılmış karakterlere örnek olarak Azure Bilişsel Arama. Daha fazla ayrıntı için lütfen bkz. RFC1738: Tekdüz Kaynak Bulucuları (URL).

Güvenli olmayan karakterler: " ` < > # % { } | \ ^ ~ [ ] . Ayrılmış karakterler: ; / ? : @ = + & .

Boole işleçleri

Bir eşleşmenin duyarlığı artırmak için bir sorgu dizesine Boole işleçleri katıştırabilirsiniz. Tam söz dizimi, karakter işleçleri ile birlikte metin işleçlerini de destekler. Metin boole işleçlerini (AND, OR, NOT) her zaman tüm büyük harflerde belirtin.

Metin işleci Karakter Örnek Kullanım
AND &, + wifi + luxury Eşleşmenin içermesi gereken terimleri belirtir. Örnekte, sorgu altyapısı hem hem de içeren belgeleri wifi luxury aramaz. Artı karakteri ( + ) gerekli terimler için kullanılır. Örneğin, +wifi +luxury her iki koşulların da tek bir belgenin alanında bir yerde görünmesi gerektiğini gösterir.
VEYA | wifi | luxury Terimler bulunca bir eşleşme bulur. Örnekte, sorgu altyapısı ya da her ikisini içeren belgelerde wifi luxury eşleşmeyi geri dönecektir. OR varsayılan bağlı işleç olduğundan, eşdeğeri olacak şekilde bunu wifi luxury da dışarıda wifi | luxury bırakın.
NOT !, - wifi –luxury Terimi dışlanan belgelerde eşleşmeleri döndürür. Örneğin wifi –luxury terimine sahip olan ancak değil olan wifi belgeleri luxury aratır.

Sorgu isteğinde parametresi, NOT işlecine sahip bir terimin sorguda diğer terimlerle ANDed veya ORed olup olmadığını (diğer terimlerde veya işleci olmadığını searchMode + varsayarak) kontrol | eder. Geçerli değerler veya any all içerir.

searchMode=any daha fazla sonuç dahil olarak sorguların geri çağrılma oranı artar ve varsayılan olarak - "OR NOT" olarak yorumlanır. Örneğin, wifi -luxury terimini içeren veya terimini wifi içermeen belgelerle luxury eşler.

searchMode=all daha az sonuç dahil olarak sorguların duyarlığı artar ve varsayılan olarak "AND NOT" olarak yorumlanır. Örneğin, wifi -luxury terimi içeren ve wifi "lüks" terimini içermeen belgelerle eşler. Bu, işleci için muhtemelen daha sezgisel bir - davranıştır. Bu nedenle, aramalarda geri çağırma yerine duyarlık iyileştirmesi yapmak ve Kullanıcılarınız aramalarda sık sık işleci kullanıyorsa yerine searchMode=all searchMode=any kullanmayı - düşünebilirsiniz.

Bir ayara searchMode karar verirken, çeşitli uygulamalarda sorgular için kullanıcı etkileşimi desenlerini göz önünde bulundurabilirsiniz. Bilgi arayan kullanıcıların, daha yerleşik gezinti yapılarına sahip e-ticaret sitelerinin aksine, bir sorguya işleç içerme olasılığı daha fazladır.

Arama ifadesinin tek bir sözcük veya tümcecik ya da isteğe bağlı olarak Boole işleçleriyle parantez içinde daha karmaşık bir ifade olduğu söz dizimi ile alanlı bir arama fieldName:searchExpression işlemi tanımlayabilirsiniz. Bazı örnekler şunlardır:

  • genre:not history

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

Her iki dizenin de tek bir varlık olarak değerlendirilmesini (bu durumda alanda iki ayrı ressamı aramak) birden çok dizeyi tırnak işaretleri içine almanız artists gerekir.

içinde belirtilen alan fieldName:searchExpression bir alan searchable olması gerekir. Dizin özniteliklerinin alan tanımlarında nasıl kullanıldıkları hakkında ayrıntılı bilgi için bkz. Dizin Oluşturma.

Not

Alanlı arama ifadelerini kullanırken, her alanlı arama ifadesinin açıkça belirtilen bir alan adı olduğundan searchFields parametresini kullanmana gerek olmaz. Ancak, bazı bölümlerin belirli bir alana göre kapsamına alan bir sorgu çalıştırmak ve geri kalanı çeşitli alanlara uygulanabilirse yine searchFields de parametresini kullanabilirsiniz. Örneğin, sorgu search=genre:jazz NOT history&searchFields=description yalnızca jazz genre alanıyla, alanla da NOT history eşlense de aynı description olur. içinde sağlanan alan adı her zaman parametresine göre önceliklidir, bu nedenle bu örnekte fieldName:searchExpression searchFields parametresine dahil genre etmek zorunda searchFields değildir.

Benzer arama benzer yapıya sahip olan eşleşmeleri bulur ve bir terimi iki veya daha az uzaklık ölçütlerini karşılayacak en fazla 50 terime genişleterek benzer bir yapıya sahip olur. Daha fazla bilgi için bkz. Belirsiz arama.

Belirsiz arama yapmak için tek bir sözcüğün sonundaki tilde "~" sembolünü isteğe bağlı parametresiyle kullanın ve düzenleme mesafenizi belirten 0 ile 2 (varsayılan) arasında bir sayı kullanın. Örneğin, "blue~" veya "blue~1" "blue", "blues" ve "glue" dönüşlerini sağlar.

Belirsiz arama yalnızca terimlere uygulanabilir, tümceciklere uygulanabilir, ancak her terime tek tek çok parçalı bir ad veya tümcecik içinde sonuna sonuna 500 eklersiniz. Örneğin, "Unviersty~ of~ "Wshliş~" "University of Washington" ile eşılabilir.

Yakınlık aramaları, bir belgede birbirine yakın terimleri bulmak için kullanılır. Bir 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ı girin. Örneğin, "hotel airport"~5 belgede "otel" ve "havaalanı" terimlerini 5 sözcük içinde bulur.

Terim artırma

Terim artırma, bir belgeyi, terimin içermesi gereken belgelere göre artırıldı terimini içeriyorsa daha yüksek bir derecelendirmeyi ifade eder. Bu, puanlama profillerinde belirli terimler yerine belirli alanları artırmaya yönelik puanlama profillerinden farklıdır.

Aşağıdaki örnek, farkları göstermek için yardımcı olur. Musicstoreindex örneğinde tür gibi belirli bir alanda eşleşmeleri artıran bir puanlama profili olduğunu varsayalım. Terim artırma, belirli arama terimlerini diğerlerine göre daha yüksek bir şekilde artırmak için kullanılabilir. Örneğin, tür alanında arama terimlerini içeren belgeleri dizinde diğer aranabilir rock^2 electronic alanlardan daha yüksek olacak şekilde artırır. Ayrıca taş arama terimini içeren belgeler, artırma değeri (2) teriminin sonucu olarak diğer elektronik arama teriminden daha yüksek dereceye sahip olur.

Bir terimi artırmak için, aramakta olduğunuz terimin sonunda öne çıkar faktörü (sayı) ile birlikte "^" işareti kullanın. Tümcecikleri de güçlendirin. Artırma faktörü ne kadar yüksek olursa terim diğer arama terimlerine göre o kadar alakalı olur. Varsayılan olarak, boost faktörü 1'tir. Boost faktörü pozitif olmalıdır ancak 1'den küçük (örneğin, 0,20) olabilir.

Normal ifade araması, RegExpsınıfında belgelenmiş şekilde Apache Lucene altında geçerli olan desenlere dayalı bir eşleşme bulur. Bu Azure Bilişsel Arama, eğik çizgi arasına normal bir ifade / alınır.

Örneğin, "hotel" veya "hotel" içeren belgeleri bulmak için /[mh]otel/ belirtin. Normal ifade aramaları tek bir sözcükle eştir.

Bazı araçlar ve diller ek kaçış karakteri gereksinimleri oluşturur. JSON için, eğik çizgi içeren dizeler ters eğik çizgiyle atlar: "microsoft.com/azure/", normal ifadenin ayar bulunduğu yer olur ve bir eğik çizgi ile bir search=/.*microsoft.com\/azure\/.*/ search=/.* <string-placeholder>.*/ microsoft.com\/azure\/ dizedir.

Birden çok ( ) veya tek ( ) karakter * joker karakteri aramaları için genel olarak tanınan söz ? dizimi kullanabilirsiniz. Tam Lucene söz dizimi ön ek, düzeltme ve sonek eşleştirmeyi destekler.

Lucene sorgu ayrıştırıcısı, tümcecik değil, tek bir terimle bu sembollerin kullanımını destekler.

Düzeltme türü Açıklama ve örnekler
Önek Terim parçası veya öncesinde * ? gelir. Örneğin, sorgu ifadesi search=alpha* "alfasayısal" veya "alfabetik" döndürür. Ön ek eşleştirme hem basit hem de tam söz dizimleri için de destek sağlar.
Soneki Parça terimi, veya * sonrasında gelir ? ve yapıyı sınırlandıran eğik çizgi ile birlikte gelir. Örneğin, search=/.*numeric./ "alfasayısal" döndürür.
infix Terim parçaları veya * içine. ? Örneğin, search=/.non*al./ "nonnumerical" ve "nonsensical" döndürür.

İşleçleri tek bir ifadede birleştirin. Örneğin, 980?2* "98072-1222" ve "98052-1234" üzerinde eşler; burada tek bir (gerekli) karakterde eşler ve ardından rastgele uzunluktaki karakterlerle ? * eşler.

Sonek ve sonek eşleştirme, normal ifade eğik çizgi / sınırlayıcılarını gerektirir. Genel olarak, kod yazarken * veya ? sembolü, bir terimin ilk karakteri veya bir terim içinde / olmadan. Postman veya Azure portal gibi bazı araçlarda kaçış yerleşiktir ve genellikle sınırlayıcı olmadan bir sorgu yürütebilirsiniz.

Not

Kural olarak, desen eşleştirme yavaştır, bu nedenle bir terimdeki karakter dizileri için belirteçler oluşturan kenar n-gram belirteçleştirme gibi alternatif yöntemleri keşfetmek istiyor olabilir. n-gram belirteci ile dizin daha büyük olur, ancak desen yapısına ve dizine almakta olduğunuz dizelerin uzunluğuna bağlı olarak sorgular daha hızlı yürütülür.

Bir çözümleyicinin joker karakter sorguları üzerindeki etkisi

Sorgu ayrıştırma sırasında ön ek, sonek, joker karakter veya normal ifadeler olarak formüle olan sorgular sorgu ağacına olduğu gibi geçirerek sözcük analizi atlanır. Eşleşmeler yalnızca dizin sorgunuz tarafından belirtilen 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ümleyici gerekir. Daha fazla bilgi için bkz. Sorgularda kısmi Azure Bilişsel Arama arama.

'terminate*' arama sorgusunun 'terminate', 'terminate' ve 'terminates' gibi terimler içeren sonuçlar dönmesini istediğiniz bir durum düşünün.

en.lucene (English Lucene) çözümleyicisi kullansanız, her terimin agresif bir şekilde kökleri uygulanır. Örneğin , 'terminate', 'terminate', 'terminates', 'terminates' dizininizin 'termi' belirtecini belirtecize indirecek. Diğer taraftan, joker karakter veya belirsiz arama kullanan sorgularda geçen terimler hiç analizlanmaz. Bu nedenle ,"terminat*" sorgusuyla eşanacak sonuç yoktur.

Diğer taraftan, Microsoft çözümleyicileri (bu durumda, en.microsoft çözümleyicisi) biraz daha gelişmiştir ve kökleştirme yerine lemmatization 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 'terminate' çoğunlukla dizinde bütün olarak kalır ve joker karakterlere ve belirsiz aramalara çok bağımlı senaryolar için tercih edilir bir seçenek olacaktır.

Joker karakter ve regex sorgularını puanlama

Azure Bilişsel Arama sorguları için sıklık tabanlı puanlama (TF-IDF) kullanır. Ancak terimlerin kapsamının geniş olabilecek joker karakter ve regex sorgularında, derecelendirmenin nadir terimlerden eşleşmelere sapmasını önlemek için frequency faktörü yoksayılır. Tüm eşleşmeler joker karakter ve regex aramaları için eşit olarak kabul edilir.

Özel karakterler

Bazı durumlarda , '❤' emojisi veya 'altında' işareti gibi özel bir karakter aramak istiyor olabilir. Böyle durumlarda, kullanmakta olduğu çözümleyicinin bu karakterleri filtrelemey olduğundan emin olun. Standart çözümleyici, dizinden hariç olmak üzere birçok özel karakteri atlar.

Özel karakterleri belirteç haline gelecek çözümleyiciler, boşluklarla ayrılmış karakter dizilerini belirteç olarak dikkate alan "boşluk" çözümleyicisini içerir (bu nedenle "❤" dizesi bir belirteç olarak kabul edilir). Ayrıca, Microsoft İngilizce çözümleyicisi ("en.microsoft") gibi bir dil çözümleyicisi belirteç olarak "()" dizesini alır. Bir çözümleyiciyi test etmek için, verili bir sorgu için hangi belirteçleri üret yaptığını öğrenebilirsiniz.

Unicode karakterleri kullanırken, sembollerin sorgu URL'sinde düzgün bir şekilde kaçış karakteri olduğundan emin olun (örneğin, "❤" kaçış dizisini %E2%9D%A4+ kullanır). Postman bu çeviriyi otomatik olarak yapar.

Öncelik (gruplama)

Parantez deyimi içindeki işleçler de dahil olmak üzere altqueries oluşturmak için parantez kullanabilirsiniz. Örneğin, "wifi" terimini ve "wifi" ya da "lüks" (ya da her ikisini de) içeren motel+(wifi|luxury) belgeleri aratır.

Alan gruplama benzerdir, ancak gruplamanın kapsamını tek bir alan olarak gruplar. Örneğin, hotelAmenities:(gym+(wifi|pool)) "hotelAmenities" alanında "deniz" ve "wifi" ya da "spor" ve "havuz" için arama yapabilir.

Sorgu boyutu sınırları

Bir kullanıcıya gönderilen sorguların boyutuna bir sınır Azure Bilişsel Arama. Özellikle, en fazla 1024 yan tümcesine (AND, OR ile ayrılmış ifadeler vb.) sahip olabilirsiniz. Ayrıca, bir sorguda her bir terimin boyutu üzerinde yaklaşık 32 KB sınırı vardır. Uygulamanız arama sorgularını program aracılığıyla üretirse, bunu sınırsız boyutta sorgular oluşturmaz şekilde tasarlamanızı öneririz.

Ayrıca bkz.