Azure Bilişsel Arama metin işleme için çözümleyiciler

Çözümleyici , dizin oluşturma ve sorgu yürütme sırasında dizeleri işlemeden sorumlu tam metin arama altyapısının bir bileşenidir. Metin işleme (sözlü analiz olarak da bilinir), dönüştürme, bir dizeyi bunlar gibi eylemler aracılığıyla değiştirme.

  • Gerekli olmayan kelimeleri (stopwords) ve noktalama işaretlerini kaldır
  • Tümcecikleri bölme ve sözcükleri bileşen bölümlerine ayırma
  • Büyük/küçük harf sözcükleri küçük harfe
  • Bir depolama verimliliği için kelimeleri basit kök formlara küçültün ve bu nedenle eşleşmelerin zaman hali ne olursa olsun bulunabilir

Analiz Edm.String , tam metin aramasını gösteren "aranabilir" olarak işaretlenen alanlar için geçerlidir.

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

Filtre veya benzer arama gibi tam metin araması olmayan sorgu türleri, sorgu tarafındaki çözümleme aşamasına gitmez. Bunun yerine, ayrıştırıcı bu dizeleri eşleşme için temel olarak sağladığınız kalıbı kullanarak doğrudan arama altyapısına gönderir. Genellikle, bu sorgu formları, model eşleme çalışması yapmak için tam dize belirteçleri gerektirir. Dizin oluşturma sırasında tüm terim belirteçlerini sağlamak için özel çözümleyicilergerekebilir. Sorgu koşullarının ne zaman ve neden çözümlenme hakkında daha fazla bilgi için bkz. Azure bilişsel arama 'de tam metin arama.

Sözcük temelli analize yönelik daha fazla arka plan için, kısa bir açıklama için aşağıdaki video klibini dinleyin.

Varsayılan çözümleyici

Azure Bilişsel Arama 'de, bir çözümleyici, aranabilir olarak işaretlenen tüm dize alanlarında otomatik olarak çağrılır.

Varsayılan olarak, Azure Bilişsel Arama Apache Lucene standart Çözümleyicisi 'ni (Standart Lucene)kullanır ve bu, metni "Unicode metin segmentleme" kurallarından sonra öğelere ayırır. Ayrıca, standart çözümleyici tüm karakterleri küçük harf biçimine dönüştürür. Dizini oluşturulmuş belgeler ve arama terimleri, dizin oluşturma ve sorgu işleme sırasında Analize gider.

Alan temelinde varsayılan ayarı geçersiz kılabilirsiniz. Alternatif çözümleyiciler, dil işleme için dil Çözümleyicisi , özel bir çözümleyiciveya kullanılabilir çözümleyiciler listesindenyerleşik bir çözümleyici olabilir.

Çözümleyiciler türleri

Aşağıdaki listede Azure Bilişsel Arama 'de hangi çözümleyiciler kullanılabildiği açıklanmaktadır.

Kategori Açıklama
Standart Lucene Çözümleyicisi Varsayılan. Belirtim veya yapılandırma gerekli değildir. Bu genel amaçlı çözümleyici birçok dil ve senaryo için iyi bir performans uygular.
Yerleşik çözümleyiciler Olduğu gibi tüketilen ve adına göre başvuruluyor. İki tür vardır: Language ve Language-agstik.

Özelleştirilmiş (dilden bağımsız) çözümleyiciler , metin girdileri özel işlem veya minimum işleme gerektirdiğinde kullanılır. Bu kategorideki çözümleyiciler örnekleri, Asciifolding, anahtar sözcük, model, Simple, stop, Whitespace içerir.

Dil Çözümleyicileri , tek tek diller için zengin dil desteği gerektiğinde kullanılır. Azure Bilişsel Arama, 35 Lucene dil Çözümleyicileri ve 50 Microsoft doğal dil işleme Çözümleyicileri destekler.
Özel çözümleyiciler , Bir Simgeleştirici (zorunlu) ve isteğe bağlı filtrelerden (char veya token) oluşan, mevcut öğelerin bir birleşiminin Kullanıcı tanımlı yapılandırmasını ifade eder.

Desenler veya durdurma gibi bazı yerleşik çözümleyiciler, sınırlı sayıda yapılandırma seçeneğini destekler. Bu seçenekleri ayarlamak için yerleşik çözümleyicilerin ve yerleşik çözümleyiciler' de belgelenen alternatif seçeneklerden birini içeren özel bir çözümleyici oluşturun. Tüm özel yapılandırmada olduğu gibi, yeni yapılandırmanızı Lucene model çözümleyicisinden ayırt etmek için Mypatternanalyzer gibi bir adla birlikte belirtin.

Çözümleyiciler belirtme

Çözümleyici ayarlama isteğe bağlıdır. Genel bir kural olarak, nasıl çalıştığını görmek için önce varsayılan standart Lucene Analyzer 'ı kullanmayı deneyin. Sorgular beklenen sonuçları döndürmiyorsa, farklı bir çözümleyiciye geçiş genellikle doğru çözümdür.

  1. Dizindebir alan tanımı oluştururken, "çözümleyici" özelliğini aşağıdakilerden birine ayarlayın: anahtar sözcük, gibi bir dil Çözümleyicisi en.microsoft veya özel bir çözümleyici (aynı dizin şemasında tanımlanır) gibi yerleşik bir çözümleyici.

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    

    Dil Çözümleyicisikullanıyorsanız, bunu belirtmek için "Analyzer" özelliğini kullanmanız gerekir. "SearchAnalyzer" ve "ındexanalyzer" özellikleri dil Çözümleyicileri için geçerlidir.

  2. Alternatif olarak, her iş yükü için çözümleyici 'yi değiştirmek üzere "ındexanalyzer" ve "searchAnalyzer" ayarlayın. Bu özellikler birlikte ayarlanır ve null olması gereken "Analyzer" özelliğini değiştirir. Bu etkinliklerden biri başka bir dönüşüme ihtiyaç duymadığında, 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"
     },
    
  3. Yalnızca özel çözümleyiciler için, dizinin [çözümleyiciler] bölümünde bir giriş oluşturun ve ardından özel çözümleyicinizi önceki iki adımdan herhangi biri başına alan tanımına atayın. Daha fazla bilgi için bkz. Dizin oluşturma ve ayrıca özel çözümleyiciler ekleme.

Çözümleyiciler ne zaman eklenir

Çözümleyiciler eklemek ve atamak için en iyi süre, etkin geliştirme sırasında dizinleri bırakma ve yeniden oluşturma işlemi sırasında yapılır.

Çözümleyiciler terimleri simgeleştirmek için kullanıldığından, alan oluşturulduğunda bir çözümleyici atamanız gerekir. Aslında, zaten fiziksel olarak oluşturulmuş bir alana çözümleyici veya ındexanalyzer atamaya izin verilmez (ancak, searchAnalyzer özelliğini herhangi bir zamanda dizine hiçbir etki olmadan değiştirebilirsiniz).

Mevcut bir alanın çözümleyicisini değiştirmek için, tüm dizini bırakıp 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 erteleyebilirsiniz ve eskisini yerine kullanmaya başlayabilirsiniz. Yeni alanı birleştirmek için güncelleştirme dizinini kullanın ve doldurmak Için mergeorupload kullanın. Daha sonra, planlı dizin hizmeti 'nin bir parçası olarak, eski alanları kaldırmak için dizini temizleyebilirsiniz.

Varolan bir dizine yeni bir alan eklemek için, alanı eklemek üzere güncelleştirme dizinini çağırın ve onu doldurmak Için mergeorupload .

Varolan bir dizine özel bir çözümleyici eklemek için, bu hatadan kaçınmak istiyorsanız güncelleştirme dizininde "Allowındexkesinti" bayrağını geçirin:

"Dizin güncelleştirmesine izin verilmiyor, çünkü kapalı kalma süresine yol açacaktı. Varolan bir dizine yeni çözümleyiciler, belirteçler, belirteç filtreleri veya karakter filtreleri eklemek için, Dizin güncelleştirme isteğinde ' Allowwındexını ' sorgu parametresini ' true ' olarak ayarlayın. Bu işlemin dizininizi en az birkaç saniyede çevrimdışına koyacağına, dizin oluşturma ve sorgu isteklerinizin başarısız olmasına neden olduğunu unutmayın. Dizinin performansı ve yazma kullanılabilirliği, Dizin güncelleştirildikten sonra çok fazla dakika boyunca veya çok büyük dizinler için daha uzun olabilir. "

çözümleyiciler ile çalışmak için Öneriler

Bu bölümde, çözümleyiciler ile nasıl çalışılacağı hakkında öneriler sunulmaktadır.

Belirli gereksinimleriniz yoksa okuma-yazma için bir çözümleyici

Azure Bilişsel Arama, ek ındexanalyzer ve searchAnalyzer alan özellikleri aracılığıyla Dizin oluşturma ve arama için farklı çözümleyiciler belirtmenize olanak tanır. Belirtilmemişse, çözümleyici özelliği ile ayarlanan çözümleyici, hem dizin oluşturma hem de arama için kullanılır. Çözümleyici belirtilmemişse, varsayılan standart Lucene Çözümleyicisi kullanılır.

Genel bir kural, aynı çözümleyici 'yi hem dizin oluşturma hem de sorgulama için, belirli gereksinimler aksini belirtmedikçe kullanır. Kapsamlı olarak test ettiğinizden emin olun. Metin işleme, arama ve dizin oluşturma sırasında farklılık gösterdiğinde, arama ve dizin oluşturma Çözümleyicisi yapılandırmalarının hizalanmamış olması durumunda sorgu terimleri ve dizine alınmış terimler arasında uyumsuzluk riskini çalıştırırsınız.

Etkin geliştirme sırasında test etme

Standart çözümleyici 'nin geçersiz kılınması, dizin yeniden oluşturmayı gerektirir. Mümkünse, üretime bir dizin vermeden önce, etkin geliştirme sırasında hangi çözümleyicilerin kullanılacağını belirleyin.

Simgeleştirilmiş terimleri İncele

Arama beklenen sonuçları döndürmediğinde, en olası senaryo sorgudaki terim girişleri ile dizinde simgeleştirilmiş terimler arasındaki belirteç tutarsızlıklardan oluşur. Belirteçler aynı değilse, Eşleşmeler bir hata ile başarısız olur. Belirteç ayırıcı çıkışını denetlemek için, API 'yi araştırma aracı olarak Çözümle ' yi kullanmanızı öneririz. Yanıt, belirli bir çözümleyici tarafından oluşturulan belirteçlerden oluşur.

REST örnekleri

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

Özel çözümleyici örneği

Bu örnek, özel seçeneklerle bir çözümleyici tanımını gösterir. Karakter filtreleri, simgeler ve belirteç filtreleri için özel seçenekler adlandırılmış yapılar olarak ayrı olarak belirtilir ve ardından çözümleyici tanımında başvurulur. Önceden tanımlanmış öğeler, olduğu gibi kullanılır ve yalnızca adı ile başvurulur.

Bu örnekte izlenecek:

  • Çö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. Bu, hafif bir şekilde özelleştirilmiş olabilir (örneğin, tek bir filtrenin tek bir seçeneğini özelleştirme) veya birden çok yerde özelleştirilebilir.

  • Bu durumda, özel çözümleyici "my_analyzer" olur ve bu da "my_standard_tokenizer" özelleştirilmiş standart belirteç ayırıcı ve iki belirteç filtresi kullanır: küçük ve özelleştirilmiş asciifolding filtresi "my_asciifolding".

  • Ayrıca 2 özel karakter filtresi "map_dash" ve "remove_whitespace" tanımlar. İlki tüm tireleri alt çizgilerle değiştirirken, ikincisi ise tüm boşlukları kaldırır. Boşlukların eşleme kurallarında UTF-8 ile kodlanmış olması gerekir. Karakter filtreleri belirteçlere eklemeden önce uygulanır ve sonuçta elde edilen belirteçleri etkiler (standart belirteçleyici tire ve boşluklarda bozar 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çenekler ayar değilseniz, alan tanımında bunu yalnızca adıyla belirtmeniz gerekir.

"Çözümleyici" öğesi, Standart çözümleyiciyi alan bazında geçersiz kılar. Genel geçersiz kılma yoktur. Bu örnekte, text1 bir çözümleyici text2 belirtmeden desen çözümleyicisi ve kullanır 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 ek dizin öznitelikleri içerir. searchAnalyzer ve indexAnalyzer öznitelikleri, tek çözümleyici özniteliğinin yerini alan 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 değeri korur (veya önceden tanımlanmış veya özel çözümleyicilerden birini 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, dizin oluşturma ve arama için farklı çözümleyicilere sahip 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 ekebilirsiniz.

Dil çözümleyicisi atama

Olduğu gibi kullanılan ve yapılandırması olmayan çözümleyiciler alan tanımında belirtilir. Dizinin [çözümleyiciler] bölümünde giriş oluşturmaya gerek yoktur.

Dil çözümleyicileri olduğu gibi kullanılır. Bunları kullanmak için, sözcük analizinde desteklenen bir metin çözümleyicisi sağlayan LexicalAnalyzerName türünü belirterek LexicalAnalyzerAzure Bilişsel Arama.

Özel çözümleyiciler alan tanımında benzer şekilde belirtilir, ancak bunun çalışması için 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ığınız zaman, önceki örnekte olduğu gibi alan tanımını ekebilirsiniz.

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

Aşağıdaki örnek, uax_url_email tokenizer ve Küçük harf belirteç 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);
}

Daha fazla örnek için bkz. CustomAnalyzerTests.cs.

Sonraki adımlar

Sorgu yürütmenin ayrıntılı açıklaması, içinde tam metin araması içinde bulunabilir Azure Bilişsel Arama. Makalede, yüzeyde sezgisel olmayan davranışlar açıklamak için örnekler lanmıştır.

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