Kısmi terim araması ve özel karakterler içeren desenler (kısa çizgi, joker karakter, regex, desenler)

Not

Azure Yapay Zeka Arama Azure portalı, REST API'leri ve Azure SDK’ları aracılığıyla kullanılabilir. Ayrıca kuruluş içeriğini Microsoft Foundry portalındaki aracılar için yeniden kullanılabilir, izin kullanan bilgi bankalarına dönüştüren yönetilen bilgi katmanı Foundry IQ'yu temel alır.

Kısmi terim araması terim parçalarından oluşan sorgulara başvurur; burada terimin tamamı yerine yalnızca başlangıcı, ortası veya sonu olabilir (bazen ön ek, ek veya sonek sorguları olarak da adlandırılır). Kısmi terim araması, genellikle arama dizesinin parçası olan ve kısa çizgi, tire veya eğik çizgi gibi özel karakterler içeren parçaların birleşimini içerebilir. Yaygın kullanım örnekleri arasında telefon numarasının, URL'nin, kodların veya kısa çizgili bileşik sözcüklerin bölümleri bulunur.

Dizinde aramak istediğiniz metin parçasını temsil eden bir belirteç yoksa kısmi terimler ve özel karakterler sorunlu olabilir. Anahtar sözcük dizin oluşturmanın sözcük temelli analiz aşamasında (varsayılan standart çözümleyici varsayılarak), özel karakterler atılır, bileşik sözcükler bölünür ve boşluk silinir. Sözcük temelli analiz sırasında değiştirilmiş bir metin parçasını arıyorsanız, eşleşme bulunamadığından sorgu başarısız olur. Bu örneği göz önünde bulundurun: +1 (425) 703-6214 gibi bir telefon numarası ("1", "425", "703", "6214" olarak ayrıştırılır), dizinde bu içerik aslında mevcut olmadığından "3-62" sorgusunda gösterilmeyecektir.

Çözüm, dizin oluşturma sırasında boşluklar ve gerekirse özel karakterler de dahil olmak üzere tam dizeyi koruyan bir çözümleyici çağırmaktır; böylece sorgu dizenize boşluklar ve karakterler ekleyebilirsiniz. Tam ve totokenize edilmemiş bir dizeye sahip olmak, "ile başlar" veya "ile biter" sorguları için desen eşlemeyi etkinleştirir; sağladığınız desen, sözcük temelli analizle dönüştürülmeyen bir terime karşı değerlendirilebilir.

Çözümlenmiş ve çözümlenmemiş içeriği çağıran arama senaryolarını desteklemeniz gerekiyorsa dizininizde her senaryo için bir tane olmak üzere iki alan oluşturmayı göz önünde bulundurun. Bir alan sözcük temelli analizden geçer. İkinci alan, desen eşleştirme için tam dize belirteçleri yayan bir içerik koruma çözümleyicisi kullanarak bir bozulmamış dize depolar.

Azure Yapay Zeka Arama, dizindeki belirteçli terimlerin tamamını tarar ve joker karakter yer tutucu işleçleri (* ve ?) eklemediğiniz veya sorguyu normal ifade olarak biçimlendirmediğiniz sürece kısmi bir terimde eşleşme bulamaz.

Kısmi terimler şu teknikler kullanılarak belirtilir:

  • Normal ifade sorguları Apache Lucene altında geçerli olan herhangi bir normal ifade olabilir.

  • Joker karakterli ön ek eşleştirme işleçleri, bir terimin başlangıcını ve ardından gelen * veya ? sonek işleçlerini içeren, genel olarak search=cap* tanınan bir deseni ifade eder. Örneğin, "Cap'n Jack's Waterfront Inn" veya "Highline Capital" eşleştirmesi. Ön ek eşleştirme hem basit hem de tam Lucene sorgu söz diziminde desteklenir.

  • İnfix ve soneki eşleşmeleri ile joker karakter* ve ? işleçlerini bir terimin içine veya başına yerleştirir, ve normal ifade söz dizimi gerektirir (ifade eğik çizgilerle çevrelenir). Örneğin, sorgu dizesi (search=/.*numeric.*/) sonek ve infix eşleşmeleri olarak "alfasayısal" ve "alfasayısal" üzerindeki sonuçları döndürür.

Normal ifade, joker karakter ve benzer arama için çözümleyiciler sorgu zamanında kullanılmaz. Ayrıştırıcının işleçlerin ve sınırlayıcıların varlığıyla algıladığı bu sorgu formları için sorgu dizesi sözcük temelli analiz olmadan altyapıya geçirilir. Bu sorgu formları için, alanda belirtilen analiz aracı göz ardı edilir.

Not

Kısmi bir sorgu dizesi URL parçasındaki eğik çizgi gibi karakterler içeriyorsa, kaçış karakterleri eklemeniz gerekebilir. JSON'da bir eğik çizgi /, bir ters eğik çizgi \ ile kaçış karakteri olarak eklenir. Bu nedenle, search=/.*microsoft.com\/azure\/.*/ "microsoft.com/azure/" URL parçasının söz dizimidir.

Sorgu teriminin kendisi çözümlenmediğinden, tam anlamıyla dizinle eşleştirilir, bu nedenle çözümleyiciniz dizine alınmış içeriği küçük harfle belirtirse gibi Contoso* bir sorgu sıfır sonuç döndürebilir. Daha fazla bilgi için Çözümleyicinin joker karakter sorguları üzerindeki etkisi bölümüne bakın.

Kısmi ve desen arama sorunlarını çözme

Parçalar, desenler veya özel karakterler üzerinde arama yapmanız gerektiğinde, varsayılan çözümleyiciyi dizindeki tüm dizeyi koruyarak daha basit belirteç oluşturma kuralları altında çalışan bir özel çözümleyici ile geçersiz kılabilirsiniz.

Yaklaşım şöyle görünür:

  1. Dizenin bozulmamış bir sürümünü depolamak için ikinci bir alan tanımlayın (sorgu zamanında çözümlenmiş ve çözümlenmemiş metin istediğinizi varsayarsak)
  2. Belirteçleri doğru ayrıntı düzeyinde yayan çeşitli çözümleyicileri değerlendirin ve seçin
  3. Çözümleyiciyi alana atayın
  4. Dizini derleme ve test etme

1 - Ayrılmış alan oluşturma

Çözümleyiciler, terimlerin bir dizinde nasıl belirteç haline getirileceğini belirler. Çözümleyiciler alan bazında atandığından, farklı senaryolar için iyileştirme yapmak üzere dizininizde alanlar oluşturabilirsiniz. Örneğin, birincide normal tam metin aramasını desteklemek için "featureCode" ve "featureCodeRegex" ve ikincisinde gelişmiş desen eşleştirmesi tanımlayabilirsiniz. Her alana atanan çözümleyiciler, her alanın içeriğinin dizinde nasıl belirteç haline getirileceğini belirler.

{
  "name": "featureCode",
  "type": "Edm.String",
  "retrievable": true,
  "searchable": true,
  "analyzer": null
},
{
  "name": "featureCodeRegex",
  "type": "Edm.String",
  "retrievable": true,
  "searchable": true,
  "analyzer": "my_custom_analyzer"
},

2 - Bir çözümlayıcı ayarla

Tam vadeli belirteçler üreten bir çözümleyici seçerken, aşağıdaki çözümleyiciler yaygın seçeneklerdir:

Çözümleyici Davranışlar
dil çözümleyicileri Bileşik sözcüklerde veya dizelerde, ünlü mutasyonlarında ve fiil biçimlerinde kısa çizgileri korur. Sorgu desenleri tireler içeriyorsa, dil çözümleyicisi kullanmak yeterli olabilir.
anahtar sözcük Tüm alanın içeriği tek bir terim olarak belirteç haline getirilir.
Boşluk Yalnızca beyaz boşlukları ayırır. Tire veya diğer karakterleri içeren terimler tek bir belirteç olarak kabul edilir.
özel çözümleyici (önerilir) Özel çözümleyici oluşturmak hem belirteç oluşturucuyu hem de belirteç filtresini belirtmenize olanak tanır. Önceki çözümleyiciler olduğu gibi kullanılmalıdır. Özel çözümleyici, hangi belirteç oluşturucuları ve belirteç filtrelerini kullanacağınızı seçmenizi sağlar.

Önerilen birleşim, anahtar sözcük belirteci ile küçük harf belirteç filtresi'dir. Yerleşik anahtar sözcük çözümleyicisi tek başına büyük harfli metinleri küçük harfe dönüştürmez ve bu da sorguların başarısız olmasına neden olabilir. Özel çözümleyici, küçük harf belirteci filtresini eklemek için bir mekanizma sağlar.

REST istemcisi kullanarak, belirteçli çıkışı incelemek için Test Çözümleyicisi REST çağrısını ekleyebilirsiniz.

Dizin arama hizmetinde mevcut olmalıdır, ancak boş olabilir. Mevcut bir dizin ve tire veya kısmi terimler içeren bir alan göz önüne alındığında, hangi belirteçlerin çıkarıldığını görmek için belirli terimler üzerinde çeşitli analizörleri deneyebilirsiniz.

  1. İlk olarak, standart çözümleyiciyi denetleyerek terimlerin varsayılan olarak nasıl belirteç haline getirildiğine bakın.

    {
    "text": "SVP10-NOR-00",
    "analyzer": "standard"
    }
    
  2. Metnin dizin içinde nasıl belirteç haline getirildiğine bakmak için yanıtı değerlendirin. Her terimin küçük harfle yazıldığına, kısa çizgilerin kaldırıldığına ve alt dizelerin ayrı ayrı öğelere bölündüğüne dikkat edin. Yalnızca bu belirteçlerle eşleşen sorgular sonuçlarda bu belgeyi döndürür. "10-NOR" içeren bir sorgu başarısız olur.

    {
        "tokens": [
            {
                "token": "svp10",
                "startOffset": 0,
                "endOffset": 5,
                "position": 0
            },
            {
                "token": "nor",
                "startOffset": 6,
                "endOffset": 9,
                "position": 1
            },
            {
                "token": "00",
                "startOffset": 10,
                "endOffset": 12,
                "position": 2
            }
        ]
    }
    
  3. whitespace veya keyword çözümleyicisini kullanmak için isteği şimdi değiştirin.

    {
    "text": "SVP10-NOR-00",
    "analyzer": "keyword"
    }
    
  4. Bu kez yanıt, dizenin bir parçası olarak korunan tirelerle birlikte büyük harfli tek bir belirteçden oluşur. Bir desende veya "10-NOR" gibi kısmi bir terimde arama yapmanız gerekiyorsa, sorgu motoru artık eşleşme bulmak için altyapıya sahiptir.

    {
    
        "tokens": [
            {
                "token": "SVP10-NOR-00",
                "startOffset": 0,
                "endOffset": 12,
                "position": 0
            }
        ]
    }
    

Önemli

Sorgu ağacını oluştururken sorgu ayrıştırıcılarının arama ifadesindeki terimleri genellikle küçük harfe dönüştürdüğünü unutmayın. Dizin oluşturma sırasında küçük harf metin girişleri içermeyen bir çözümleyici kullanıyorsanız ve beklenen sonuçları almıyorsanız, bunun nedeni bu olabilir. Çözüm, aşağıdaki "Özel çözümleyicileri kullanma" bölümünde açıklandığı gibi küçük harfli bir belirteç filtresi eklemektir.

3 - Bir çözümleyici yapılandırın

Çözümleyicileri değerlendirirken veya belirli bir yapılandırmayla devam ederseniz, alan tanımında çözümleyiciyi belirtmeniz ve yerleşik çözümleyici kullanmıyorsanız çözümleyicinin kendisini yapılandırmanız gerekir. Çözümleyicileri değiştirirken genellikle dizini yeniden oluşturmanız (silme, yeniden oluşturma ve yeniden yükleme) gerekir.

Yerleşik çözümleyicileri kullanma

Yerleşik çözümleyiciler, alan tanımının analyzer özelliğinde isimle belirtilebilir ve dizin için ek bir yapılandırma gerektirmez. Aşağıdaki örnek, bir alanda çözümleyiciyi whitespace nasıl ayarlayabileceğinizi gösterir.

Diğer senaryolar ve diğer yerleşik çözümleyiciler hakkında daha fazla bilgi edinmek için bkz . Yerleşik çözümleyiciler.

    {
      "name": "phoneNumber",
      "type": "Edm.String",
      "key": false,
      "retrievable": true,
      "searchable": true,
      "analyzer": "whitespace"
    }

Özel çözümleyicileri kullanma

Özel çözümleyici kullanıyorsanız, bunu dizinde belirteç oluşturucu, belirteç filtresinin kullanıcı tanımlı bir bileşimiyle ve olası yapılandırma ayarlarıyla tanımlayın. Ardından, buna yerleşik çözümleyici gibi bir alan tanımında başvurun.

Amaç tam vadeli belirteç oluşturma olduğunda, anahtar sözcük belirteci ve küçük harf belirteci filtresinden oluşan özel bir çözümleyici önerilir.

  • Anahtar sözcük belirteci, bir alanın tüm içeriği için tek bir belirteç oluşturur.
  • Küçük harfli belirteç filtresi, büyük harfleri küçük harflere dönüştürür. Sorgu ayrıştırıcıları genellikle büyük harfli metin girişlerini küçük harfe dönüştürür. Küçük harfle boyutlandırma, belirteçli terimlerle girişleri homojen hale getirmektedir.

Aşağıdaki örnekte anahtar sözcük belirteci ve küçük harfli belirteç filtresi sağlayan özel bir çözümleyici gösterilmektedir.

{
"fields": [
  {
    "name": "accountNumber",
    "analyzer":"myCustomAnalyzer",
    "type": "Edm.String",
    "searchable": true,
    "filterable": true,
    "retrievable": true,
    "sortable": false,
    "facetable": false
  }
],

"analyzers": [
  {
    "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
    "name":"myCustomAnalyzer",
    "charFilters":[],
    "tokenizer":"keyword_v2",
    "tokenFilters":["lowercase"]
  }
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": []
}

Not

keyword_v2 Belirteç oluşturucu ve lowercase belirteç filtresi, sistem tarafından bilinir ve varsayılan yapılandırmalarını kullanır. Bu nedenle öncelikle tanımlamanız gerekmeden bunlara ada göre başvurabilirsiniz.

4 - Derleme ve test etme

Senaryonuzu destekleyen çözümleyiciler ve alan tanımlarıyla bir dizin tanımladıktan sonra, kısmi dize sorgularını test edebilmeniz için temsili dizeleri olan belgeleri yükleyin.

Bu makalede açıklanan kısmi terimleri ve özel karakterleri sorgulamak için REST istemcisi kullanın.

Önceki bölümlerde mantık açıklanmıştır. Bu bölüm, çözümünüzü test ederken çağırmanız gereken her API'de adım adım ilerler.

  • Dizin Sil, yeniden oluşturabilmeniz için aynı ada sahip mevcut bir dizini kaldırır.

  • Dizin Oluştur, çözümleyici tanımları ve çözümleyici belirtimi olan alanlar da dahil olmak üzere arama hizmetinizde dizin yapısını oluşturur.

  • Belgeleri Yükle dizininizle aynı yapıya sahip belgeleri ve aranabilir içeriği içeri aktarır. Bu adımdan sonra dizininiz sorgulamaya veya test etmeye hazır olur.

  • Test Çözümleyicisi , Çözümleyici ayarlama bölümünde kullanıma sunulmuştur. Terimlerin nasıl belirteçlendirildiği hakkında bilgi edinmek için çeşitli çözümleyicileri kullanarak dizininizdeki bazı dizeleri test edin.

  • Arama Belgeleri, joker karakter ve normal ifadeler için basit söz dizimi veya tam Lucene söz dizimi kullanarak sorgu isteği oluşturmayı açıklar.

    "+1 (425) 703-6214" üzerinde eşleşme bulmak için "3-6214" sorgusunu sorgulama gibi kısmi terim sorguları için basit söz dizimini kullanabilirsiniz: search=3-6214&queryType=simple.

    "Alfasayısal" ile eşleşme bulmak için "sayı" veya "sayısal" sorguları gibi infix ve sonek sorguları için tam Lucene söz dizimini ve düzenli ifadeyi kullanın: search=/.*num.*/&queryType=full

Ön ek ve sonek sorgularını iyileştirme

Varsayılan çözümleyici kullanılarak ön ek ve soneklerin eşleşmesi, ek sorgu özellikleri gerektirir. Ön ekler joker karakter araması gerektirir ve sonekler düzenli ifade araması gerektirir. Bu özelliklerin her ikisi de sorgu performansını düşürebilir.

Aşağıdaki örnek, ön ek veya soneki daha hızlı eşleştirmek için bir EdgeNGramTokenFilter ekler. Belirteçler, karakter içeren 2-25 karakter bileşiminde oluşturulur. aşağıda iki ila yedi belirteçten bir örnek ilerleme verilmiştir: MS, MSF, MSFT, MSFT/, MSFT/S, MSFT/SQ, MSFT/SQL. EdgeNGramTokenFilter dize karakter birleşimlerinin hangi tarafından oluşturulduğunu belirleyen bir side parametre gerektirir. Ön ek sorguları için front, sonek sorguları için back kullanın.

Ek belirteçleme daha büyük bir dizine sebep olur. Daha büyük dizini barındırmak için yeterli kapasiteniz varsa, daha hızlı yanıt süresiyle bu yaklaşım en iyi çözüm olabilir.

{
"fields": [
  {
    "name": "accountNumber_prefix",
    "indexAnalyzer": "ngram_front_analyzer",
    "searchAnalyzer": "keyword",
    "type": "Edm.String",
    "searchable": true,
    "filterable": false,
    "retrievable": true,
    "sortable": false,
    "facetable": false
  },
  {
    "name": "accountNumber_suffix",
    "indexAnalyzer": "ngram_back_analyzer",
    "searchAnalyzer": "keyword",
    "type": "Edm.String",
    "searchable": true,
    "filterable": false,
    "retrievable": true,
    "sortable": false,
    "facetable": false
  }
],

"analyzers": [
  {
    "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
    "name":"ngram_front_analyzer",
    "charFilters":[],
    "tokenizer":"keyword_v2",
    "tokenFilters":["lowercase", "front_edgeNGram"]
  },
  {
    "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
    "name":"ngram_back_analyzer",
    "charFilters":[],
    "tokenizer":"keyword_v2",
    "tokenFilters":["lowercase", "back_edgeNGram"]
  }
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": [
  {
    "@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
    "name":"front_edgeNGram",
    "minGram": 2,
    "maxGram": 25,
    "side": "front"
  },
  {
    "@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
    "name":"back_edgeNGram",
    "minGram": 2,
    "maxGram": 25,
    "side": "back"
  }
]
}

ile 123başlayan hesap numaralarını aramak için aşağıdaki sorguyu kullanabiliriz:

{
  "search": "123",
  "searchFields": "accountNumber_prefix"
}

ile 456biten hesap numaralarını aramak için aşağıdaki sorguyu kullanabiliriz:

{
  "search": "456",
  "searchFields": "accountNumber_suffix"
}