Azure AI Search'te metin işleme için çözümleyiciler

Çözümleyici, dizin oluşturma ve sorgu yürütme sırasında dizeleri işlemekle sorumlu olan tam metin arama altyapısının bir bileşenidir. Metin işleme (sözcük temelli analiz olarak da bilinir) dönüştürücüdür ve aşağıdakiler gibi eylemler aracılığıyla bir dizeyi değiştirir:

  • Temel olmayan sözcükleri (stopwords) ve noktalama işaretlerini kaldırma
  • Tümcecikleri ve hecelenmiş sözcükleri bileşen bölümlerine bölme
  • Küçük harfle tüm büyük harfler
  • Depolama verimliliği için sözcükleri ilkel kök formlara dönüştürün ve zaman fark etmeksizin eşleşmelerin bulunabilmesini sağlayın

Analiz, tam metin aramasını gösteren "aranabilir" olarak işaretlenmiş alanlara Edm.String uygulanır.

Bu yapılandırmanın alanları için, belirteçler oluşturulduğunda dizin oluşturma sırasında ve sorgular ayrıştırıldığında ve altyapı eşleşen belirteçleri taradığında sorgu yürütme sırasında analiz gerçekleşir. Hem dizin oluşturma hem de sorgular için aynı çözümleyici kullanıldığında eşleşme oluşma olasılığı daha yüksektir, ancak gereksinimlerinize bağlı olarak her iş yükü için çözümleyiciyi bağımsız olarak ayarlayabilirsiniz.

Filtreler veya benzer arama gibi tam metin araması olmayan sorgu türleri, sorgu tarafındaki analiz aşamasından geçmez. Bunun yerine ayrıştırıcı, eşleştirme için temel olarak sağladığınız deseni kullanarak bu dizeleri doğrudan arama altyapısına gönderir. Genellikle bu sorgu formları, desen eşleştirmenin çalışması için tam dize belirteçleri gerektirir. Dizin oluşturma sırasında terim belirteçlerinin tamamının korunmasını sağlamak için özel çözümleyicilere ihtiyacınız olabilir. Sorgu terimlerinin ne zaman ve neden analiz edildiğinden daha fazla bilgi için bkz . Azure AI Search'te tam metin araması.

Sözcük temelli analiz hakkında daha fazla arka plan için kısa bir açıklama için aşağıdaki video klibi dinleyin.

Varsayılan çözümleyici

Azure AI Search'te, aranabilir olarak işaretlenmiş tüm dize alanlarında bir çözümleyici otomatik olarak çağrılır.

Azure AI Search varsayılan olarak Apache Lucene Standard çözümleyicisini (standart lucene) kullanır ve bu da metni "Unicode Metin Segmentasyonu" kurallarına göre öğelere böler. Standart çözümleyici tüm karakterleri küçük harf biçimine dönüştürür. Dizine alınan belgeler ve arama terimleri, dizin oluşturma ve sorgu işleme sırasında analizden geçer.

Varsayılanı alan temelinde geçersiz kılabilirsiniz. Alternatif çözümleyiciler dil işleme için bir dil çözümleyicisi, özel çözümleyici veya kullanılabilir çözümleyiciler listesinden yerleşik çözümleyici olabilir.

Çözümleyici türleri

Aşağıdaki listede Azure AI Search'te hangi çözümleyicilerin kullanılabilir olduğu açıklanmaktadır.

Kategori Tanım
Standart Lucene çözümleyicisi Varsayılan. Belirtim veya yapılandırma gerekmez. Bu genel amaçlı çözümleyici birçok dil ve senaryo için iyi performans gösterir.
Yerleşik çözümleyiciler Olduğu gibi tüketilir ve ada göre başvurulur. İki tür vardır: dil ve dil-agnostik.

Metin girişleri özel işleme veya en az işleme gerektirdiğinde özel (dil-agnostik) çözümleyiciler kullanılır. Bu kategorideki çözümleyicilere örnek olarak Asciifolding, Anahtar Sözcük, Desen, Basit, Durdur, Boşluk verilebilir.

Dil çözümleyicileri , tek tek diller için zengin dil desteğine ihtiyacınız olduğunda kullanılır. Azure AI Search, 35 Lucene dil çözümleyicisini ve 50 Microsoft doğal dil işleme çözümleyicisini destekler.
Özel çözümleyiciler Bir belirteç oluşturucu (gerekli) ve isteğe bağlı filtrelerden (char veya belirteç) oluşan mevcut öğelerin birleşiminin kullanıcı tanımlı yapılandırmasını ifade eder.

Desen veya Durdurma gibi birkaç yerleşik çözümleyici, sınırlı sayıda yapılandırma seçeneğini destekler. Bu seçenekleri ayarlamak için yerleşik çözümleyiciden ve Yerleşik çözümleyicilerde belgelenen alternatif seçeneklerden birini içeren özel bir çözümleyici oluşturun. Herhangi bir özel yapılandırmada olduğu gibi, yeni yapılandırmanızı Lucene Desen çözümleyicisinden ayırt etmek için myPatternAnalyzer gibi bir ad sağlayın.

Çözümleyicileri belirtme

Çözümleyici ayarlamak isteğe bağlıdır. Genel bir kural olarak, nasıl performans sergilediğini görmek için önce varsayılan standart Lucene çözümleyicisini kullanmayı deneyin. Sorgular beklenen sonuçları döndüremezse, farklı bir çözümleyiciye geçmek genellikle doğru çözümdür.

  1. Özel çözümleyici kullanıyorsanız, bunu "çözümleyici" bölümünün altındaki arama dizinine ekleyin. Daha fazla bilgi için bkz . Dizin Oluşturma ve özel çözümleyici ekleme.

  2. Alan tanımlarken , "çözümleyici" özelliğini aşağıdakilerden birine ayarlayın: anahtar sözcük gibi yerleşik bir çözümleyici, gibi en.microsoftbir dil çözümleyicisi veya özel çözümleyici (aynı dizin şemasında tanımlanır).

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. Dil çözümleyicisi kullanıyorsanız, bunu belirtmek için "çözümleyici" özelliğini kullanmanız gerekir. "searchAnalyzer" ve "indexAnalyzer" özellikleri dil çözümleyicileri için geçerli değildir.

  4. Alternatif olarak, her iş yükü için çözümleyiciyi değiştirmek için "indexAnalyzer" ve "searchAnalyzer" seçeneğini ayarlayın. Bu özellikler null olması gereken "çözümleyici" özelliğinin yerine birlikte çalışır. Bu etkinliklerden biri diğerinin ihtiyaç duyduğu belirli bir dönüştürme gerektiriyorsa dizin oluşturma ve sorgular için farklı çözümleyiciler kullanabilirsiniz.

      "fields": [
     {
       "name": "ProductGroup",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "indexAnalyzer": "keyword",
       "searchAnalyzer": "standard"
     },
    

Çözümleyiciler ne zaman eklenir?

Çözümleyicileri eklemek ve atamak için en iyi zaman, dizinleri bırakmak ve yeniden oluşturmak rutin olduğunda etkin geliştirme sırasındadır.

Terimleri belirteç haline getirmek için çözümleyiciler kullanıldığından, alan oluşturulduğunda bir çözümleyici atamanız gerekir. Aslında, fiziksel olarak oluşturulmuş bir alana çözümleyici veya indexAnalyzer atanmasına izin verilmez (ancak searchAnalyzer özelliğini istediğiniz zaman dizin üzerinde hiçbir etkisi olmadan değiştirebilirsiniz).

Var olan bir alanın çözümleyicisini değiştirmek için dizinin tamamını bırakmanız ve yeniden oluşturmanız gerekir (tek tek alanları yeniden oluşturamazsınız). Üretimdeki dizinler için, yeni çözümleyici atamasıyla yeni bir alan oluşturarak yeniden derlemeyi erteleyebilir ve eskisinin yerine kullanmaya başlayabilirsiniz. Yeni alanı eklemek için Dizini Güncelleştir'i ve doldurmak için mergeOrUpload komutunu kullanın. Daha sonra, planlanan dizin bakımı kapsamında, eski alanları kaldırmak için dizini temizleyebilirsiniz.

Var olan bir dizine yeni bir alan eklemek için, alanı eklemek için Dizini Güncelleştir'i ve doldurmak için mergeOrUpload öğesini çağırın.

Var olan bir dizine özel çözümleyici eklemek için, bu hatayı önlemek istiyorsanız Güncelleştirme Dizini'nde "allowIndexDowntime" bayrağını geçirin:

"Index update not allowed because it would cause downtime. In order to add new analyzers, tokenizers, token filters, or character filters to an existing index, set the 'allowIndexDowntime' query parameter to 'true' in the index update request. Note that this operation will put your index offline for at least a few seconds, causing your indexing and query requests to fail. Performance and write availability of the index can be impaired for several minutes after the index is updated, or longer for very large indexes."

Çözümleyicilerle çalışmak için Öneriler

Bu bölümde çözümleyicilerle çalışma hakkında öneriler sunulmaktadır.

Belirli gereksinimleriniz olmadığı sürece okuma-yazma için bir çözümleyici

Azure AI Search, dizin oluşturma için farklı çözümleyiciler belirtmenize ve "indexAnalyzer" ve "searchAnalyzer" alan özellikleri aracılığıyla arama yapmanıza olanak tanır. Belirtilmezse, hem dizin oluşturma hem de arama için çözümleyici özelliğine sahip çözümleyici kümesi kullanılır. Çözümleyici belirtilmemişse varsayılan Standard Lucene çözümleyicisi kullanılır.

Genel bir kural, belirli gereksinimler aksini belirtmediği sürece hem dizin oluşturma hem de sorgulama için aynı çözümleyiciyi kullanmaktır. Kapsamlı bir şekilde test etmeye özen gösterin. Metin işleme arama ve dizin oluşturma zamanında farklılık gösterdiğinde, arama ve dizin oluşturucu yapılandırmaları hizalanmadığında sorgu terimleriyle dizine alınan terimler arasında uyuşmazlık riskiyle karşılaşırsınız.

Etkin geliştirme sırasında test edin

Standart çözümleyicinin geçersiz kılınarak dizin yeniden oluşturulması gerekir. Mümkünse, bir dizini üretime döndürmeden önce etkin geliştirme sırasında hangi çözümleyicilerin kullanılacağına karar verin.

Belirteçli terimleri inceleme

Bir arama beklenen sonuçları döndüremezse, en olası senaryo sorgudaki terim girişleri ile dizindeki belirteçli terimler arasındaki belirteç tutarsızlıklarıdır. Belirteçler aynı değilse eşleşmeler gerçekleşmez. Belirteç oluşturucu çıkışını incelemek için Analiz API'sini araştırma aracı olarak kullanmanızı öneririz. Yanıt, belirli bir çözümleyici tarafından oluşturulan belirteçlerden oluşur.

REST örnekleri

Aşağıdaki örneklerde birkaç önemli senaryo için çözümleyici tanımları gösterilmektedir.

Özel çözümleyici örneği

Bu örnekte, özel seçenekler içeren bir çözümleyici tanımı gösterilmektedir. Karakter filtreleri, belirteç oluşturucular ve belirteç filtreleri için özel seçenekler, adlandırılmış yapılar olarak ayrı ayrı belirtilir ve çözümleyici tanımında başvurulur. Önceden tanımlanmış öğeler olduğu gibi kullanılır ve ada göre başvurulur.

Bu örnekte adım adım ilerleyin:

  • Çözümleyiciler, aranabilir bir alan için alan sınıfının bir özelliğidir.

  • Özel çözümleyici, dizin tanımının bir parçasıdır. Hafifçe özelleştirilebilir (örneğin, tek bir filtredeki tek bir seçeneği özelleştirme) veya birden çok yerde özelleştirilebilir.

  • Bu durumda, özel çözümleyici "my_analyzer" şeklindedir ve buna karşılık özelleştirilmiş bir standart belirteç oluşturucu "my_standard_tokenizer" ve iki belirteç filtresi kullanır: küçük harfli ve özelleştirilmiş asciifolding filtresi "my_asciifolding".

  • Ayrıca 2 özel karakter filtresi "map_dash" ve "remove_whitespace" tanımlar. birincisi tüm tireleri alt çizgilerle değiştirirken, ikincisi tüm boşlukları kaldırır. Alanların eşleme kurallarında UTF-8 kodlanmış olması gerekir. Karakter filtreleri belirteç oluşturmadan önce uygulanır ve sonuçta elde edilen belirteçleri etkiler (standart belirteç oluşturucu tire ve boşluklarda kesilir, ancak alt çizgide olmaz).

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"my_analyzer"
        }
     ],
     "analyzers":[
        {
           "name":"my_analyzer",
           "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
           "charFilters":[
              "map_dash",
              "remove_whitespace"
           ],
           "tokenizer":"my_standard_tokenizer",
           "tokenFilters":[
              "my_asciifolding",
              "lowercase"
           ]
        }
     ],
     "charFilters":[
        {
           "name":"map_dash",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["-=>_"]
        },
        {
           "name":"remove_whitespace",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["\\u0020=>"]
        }
     ],
     "tokenizers":[
        {
           "name":"my_standard_tokenizer",
           "@odata.type":"#Microsoft.Azure.Search.StandardTokenizerV2",
           "maxTokenLength":20
        }
     ],
     "tokenFilters":[
        {
           "name":"my_asciifolding",
           "@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
           "preserveOriginal":true
        }
     ]
  }

Alan başına çözümleyici atama örneği

Standart çözümleyici varsayılandır. Varsayılan değeri desen çözümleyicisi gibi önceden tanımlanmış farklı bir çözümleyiciyle değiştirmek istediğinizi varsayalım. Özel seçenekleri ayarlamıyorsanız, yalnızca alan tanımında ada göre belirtmeniz gerekir.

"Çözümleyici" öğesi, Standart çözümleyiciyi alan temelinde geçersiz kılar. Genel geçersiz kılma yoktur. Bu örnekte, text1 desen çözümleyicisini kullanır ve text2çözümleyici belirtmeyen varsayılanı kullanır.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text1",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"pattern"
        },
        {
           "name":"text2",
           "type":"Edm.String",
           "searchable":true
        }
     ]
  }

Dizin oluşturma ve arama işlemleri için çözümleyicileri karıştırma

API'ler, dizin oluşturma ve arama için farklı çözümleyiciler belirtmek için dizin özniteliklerini içerir. searchAnalyzer ve indexAnalyzer öznitelikleri, tek çözümleyici özniteliği yerine bir çift olarak belirtilmelidir.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "indexAnalyzer":"whitespace",
           "searchAnalyzer":"simple"
        },
     ],
  }

Dil çözümleyicisi örneği

Farklı dillerde dizeler içeren alanlar bir dil çözümleyicisi kullanabilirken, diğer alanlar varsayılanı korur (veya önceden tanımlanmış veya özel çözümleyicilerden bazılarını kullanır). Dil çözümleyicisi kullanıyorsanız, hem dizin oluşturma hem de arama işlemleri için kullanılmalıdır. Dil çözümleyicisi kullanan alanların dizin oluşturma ve arama için farklı çözümleyicileri olamaz.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "indexAnalyzer":"whitespace",
           "searchAnalyzer":"simple"
        },
        {
           "name":"text_fr",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"fr.lucene"
        }
     ],
  }

C# örnekleri

.NET SDK kod örneklerini kullanıyorsanız çözümleyicileri kullanmak veya yapılandırmak için bu örnekleri ekleyebilirsiniz.

Dil çözümleyicisi atama

Yapılandırma olmadan olduğu gibi kullanılan tüm çözümleyiciler bir alan tanımında belirtilir. Dizinin [çözümleyiciler] bölümünde giriş oluşturma gereksinimi yoktur.

Dil çözümleyicileri olduğu gibi kullanılır. Bunları kullanmak için, LexicalAnalyzerName türünü belirterek Azure AI Search'te desteklenen bir metin çözümleyicisi sağlayarak LexicalAnalyzer'ı çağırın.

Özel çözümleyiciler alan tanımında benzer şekilde belirtilir, ancak bunun çalışması için bir sonraki bölümde açıklandığı gibi dizin tanımında çözümleyiciyi belirtmeniz gerekir.

    public partial class Hotel
    {
       . . . 
        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
        public string Description { get; set; }

        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
        [JsonPropertyName("Description_fr")]
        public string DescriptionFr { get; set; }

        [SearchableField(AnalyzerName = "url-analyze")]
        public string Url { get; set; }
      . . .
    }

Özel çözümleyici tanımlama

Özelleştirme veya yapılandırma gerektiğinde dizine bir çözümleyici yapısı ekleyin. Tanımladıktan sonra, önceki örnekte gösterildiği gibi alan tanımını ekleyebilirsiniz.

CustomAnalyzer nesnesi oluşturun. Özel çözümleyici bilinen bir belirteç oluşturucu, sıfır veya daha fazla belirteç filtresi ve sıfır veya daha fazla karakter filtresi adının kullanıcı tanımlı bir bileşimidir:

Aşağıdaki örnek, uax_url_email belirteci ve Küçük harf belirteci filtresini kullanan "url-analyze" adlı özel bir çözümleyici oluşturur.

private static void CreateIndex(string indexName, SearchIndexClient adminClient)
{
   FieldBuilder fieldBuilder = new FieldBuilder();
   var searchFields = fieldBuilder.Build(typeof(Hotel));

   var analyzer = new CustomAnalyzer("url-analyze", "uax_url_email")
   {
         TokenFilters = { TokenFilterName.Lowercase }
   };

   var definition = new SearchIndex(indexName, searchFields);

   definition.Analyzers.Add(analyzer);

   adminClient.CreateOrUpdateIndex(definition);
}

Sonraki adımlar

Sorgu yürütmenin ayrıntılı açıklaması Azure AI Search'te tam metin arama bölümünde bulunabilir. Makalede, yüzey üzerinde sezgisel olmayan davranışları açıklamak için örnekler kullanılabilecek.

Çözümleyiciler hakkında daha fazla bilgi edinmek için aşağıdaki makalelere bakın: