Azure AI Search'te arama sonuçlarıyla çalışma

Bu makalede, Azure AI Search'te sorgu yanıtıyla çalışma açıklanmaktadır. Bir yanıtın yapısı, Arama Belgeleri (REST) veya SearchResults Sınıfı (.NET için Azure) bölümünde açıklandığı gibi sorgudaki parametreler tarafından belirlenir.

Sorgudaki parametreler aşağıdakileri belirler:

  • Alan seçimi
  • Sorgunun dizininde bulunan eşleşmelerin sayısı
  • Disk belleği sonuçları
  • Yanıttaki sonuç sayısı (varsayılan olarak 50'ye kadar)
  • Sıralama düzeni
  • Sonuç içindeki terimlerin vurgulanması, gövdedeki tüm veya kısmi terimle eşleşme

Sonuç bileşimi

Sonuçlar tablosaldır, tüm "alınabilir" alanlardan oluşur veya yalnızca parametrelerde $select belirtilen alanlarla sınırlıdır. Satırlar eşleşen belgelerdir.

Arama sonuçlarında hangi alanların olduğunu seçebilirsiniz. Bir arama belgesinde çok fazla sayıda alan olsa da, her belgeyi sonuçlarda temsil etmek için genellikle yalnızca birkaçı gerekir. Sorgu isteğinde, yanıtta hangi "alınabilir" alanların görüneceğini belirtmek için ekleyin $select=<field list> .

Belgeler arasında karşıtlık ve farklılaşma sunan alanları seçerek kullanıcının bir bölümüne tıklama yanıtı davet etmek için yeterli bilgi sağlayın. Bir e-ticaret sitesinde ürün adı, açıklaması, markası, rengi, boyutu, fiyatı ve derecelendirmesi olabilir. Yerleşik hotels-sample dizini için, aşağıdaki örnekteki "select" alanları olabilir:

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30 
    {  
      "search": "sandy beaches",
      "select": "HotelId, HotelName, Description, Rating, Address/City"
      "count": true
    }

Not

Ürün fotoğrafı veya logo gibi sonuçlardaki görüntüler için bunları Azure AI Search'ün dışında depolayın, ancak arama belgesindeki resim URL'sine başvurmak için dizininize bir alan ekleyin. Sonuçlardaki görüntüleri gösteren örnek dizinler realestate-sample-us tanıtımını (Verileri İçeri Aktarma sihirbazında kolayca oluşturabileceğiniz yerleşik bir örnek veri kümesi) ve New York City Jobs tanıtım uygulamasını içerir.

Beklenmeyen sonuçlar için İpuçları

Bazen, sonuçların yapısı değil madde beklenmediktir. Örneğin, bazı sonuçların yinelenen sonuçlar gibi göründüğünü veya üst kısımda görünmesi gereken bir sonucun sonuçlarda daha düşük bir konuma getirildiğini fark edebilirsiniz. Sorgu sonuçları beklenmedik olduğunda, sonuçların iyileşip iyileşmediğini görmek için şu sorgu değişikliklerini deneyebilirsiniz:

  • Ölçütlerden herhangi biri yerine tüm ölçütlerde eşleşme gerektirecek şekilde (varsayılan) searchMode=all olarak değiştirin searchMode=any . Bu durum özellikle boole işleçleri sorguya eklendiğinde geçerlidir.

  • Sorgu sonucunu değiştirip değiştirmediğini görmek için farklı sözcük temelli çözümleyicilerle veya özel çözümleyicilerle denemeler yapın. Varsayılan çözümleyici, hecelenmiş sözcükleri ayırır ve sözcükleri kök formlara küçültür ve bu da genellikle sorgu yanıtının sağlamlığını artırır. Ancak, kısa çizgileri korumanız gerekiyorsa veya dizeler özel karakterler içeriyorsa, dizinin doğru biçimde belirteçler içerdiğinden emin olmak için özel çözümleyiciler yapılandırmanız gerekebilir. Daha fazla bilgi için bkz . Kısmi terim araması ve özel karakterler içeren desenler (kısa çizgi, joker karakter, regex, desenler).

Eşleşmeleri sayma

count parametresi, dizindeki sorguyla eşleşme olarak kabul edilen belge sayısını döndürür. Sayıyı döndürmek için sorgu isteğine ekleyin $count=true . Arama hizmeti tarafından uygulanan maksimum değer yoktur. Sorgunuza ve belgelerinizin içeriğine bağlı olarak, sayı dizindeki her belge kadar yüksek olabilir.

Dizin kararlı olduğunda sayı doğrudur. Sistem belgeleri etkin bir şekilde ekliyor, güncelleştiriyor veya siliyorsa, tam olarak dizine alınmayacak belgeler hariç olmak üzere sayı yaklaşık olacaktır.

Count, arama hizmetindeki rutin bakımlardan veya diğer iş yüklerinden etkilenmez. Ancak, birden çok bölümünüz ve tek bir çoğaltmanız varsa, bölümler yeniden başlatıldıktan sonra belge sayısı (birkaç dakika) içinde kısa süreli dalgalanmalarla karşılaşabilirsiniz.

İpucu

Dizin oluşturma işlemlerini denetlemek için boş bir arama search=* sorgusuna ekleyerek $count=true dizinin beklenen sayıda belge içerip içermediğini onaylayabilirsiniz. Sonuç, dizininizdeki belgelerin tam sayısıdır.

Sorgu söz dizimini test ederken, $count=true değişikliklerinizin daha büyük veya daha az sonuç döndürerek yararlı geri bildirimde bulunup bulunmayacağını hızlıca söyleyebilir.

Disk belleği sonuçları

Varsayılan olarak, arama altyapısı ilk 50 eşleşmeye kadar döndürür. İlk 50, sorgunun tam metin araması veya anlamsal olduğu varsayılarak arama puanına göre belirlenir. Aksi takdirde, ilk 50 tam eşleşme sorguları için rastgele bir sıradır (burada tekdüzen "@searchScore=1.0" rastgele derecelendirmeyi gösterir).

Sonuç kümesinde döndürülen tüm belgelerin disk belleğini denetlemek için, GET sorgu isteğine veya POST sorgu isteğine ve skip parametreleri ekleyin $top$skip.top Aşağıdaki listede mantık açıklanmaktadır.

  • İlk 15 eşleşen belge kümesini ve toplam eşleşme sayısını döndürür: GET /indexes/<INDEX-NAME>/docs?search=<QUERY STRING>&$top=15&$skip=0&$count=true

  • sonraki 15'i almak için ilk 15'i atlayarak ikinci kümeyi döndür: $top=15&$skip=15. Üçüncü 15 kümesi için tekrarlayın: $top=15&$skip=30

Temel alınan dizin değişiyorsa sayfalandırılmış sorguların sonuçlarının kararlı olacağı garanti edilmez. Sayfalama, her sayfanın değerini $skip değiştirir, ancak her sorgu bağımsızdır ve sorgu zamanında dizinde mevcut olan verilerin geçerli görünümünde çalışır (başka bir deyişle, genel amaçlı veritabanında bulunanlar gibi sonuçların önbelleğe alınmaması veya anlık görüntüsü yoktur).

Aşağıda yinelenenleri nasıl alabileceğinize bir örnek verilmiştir. Dört belge içeren bir dizin varsayma:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
{ "id": "4", "rating": 1 }

Şimdi sonuçların derecelendirmeye göre sıralanmış şekilde aynı anda iki tane döndürülmesini istediğinizi varsayalım. Sonuçların ilk sayfasını almak için şu sorguyu yürütebilirsiniz: $top=2&$skip=0&$orderby=rating desc, aşağıdaki sonuçları üretir:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }

Hizmette, sorgu çağrıları arasında dizinine beşinci bir belge eklendiğini varsayalım: { "id": "5", "rating": 4 }. Kısa bir süre sonra ikinci sayfayı $top=2&$skip=2&$orderby=rating descgetirmek için bir sorgu yürütür ve şu sonuçları alırsınız:

{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }

2. belgenin iki kez getirildiğini unutmayın. Bunun nedeni, yeni belge 5'in derecelendirme için daha büyük bir değere sahip olmasıdır, bu nedenle belge 2'den önce sıralanır ve ilk sayfaya iner. Bu davranış beklenmeyen bir davranış olsa da, arama altyapısının davranışı tipiktir.

Çok sayıda sonuç üzerinden sayfalama

$skip ve kullanarak $top arama sorgusu 100.000 sonuç arasında sayfalandırmaya izin verir, ancak sonuçlar 100.000'den büyükse ne olur? Bu kadar büyük bir yanıtı sayfalandırmak için $skipgeçici çözüm olarak bir sıralama düzeni ve aralık filtresi kullanın.

Bu geçici çözümde, bir belge kimliği alanına veya her belge için benzersiz olan başka bir alana sıralama ve filtreleme uygulanır. Benzersiz alanın arama dizininde ve sortable ilişkilendirmesi olmalıdırfilterable.

  1. Sıralanmış sonuçların tam sayfasını döndürmek için bir sorgu gönderin.

    POST /indexes/good-books/docs/search?api-version=2020-06-30
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc"
        }
    
  2. Arama sorgusu tarafından döndürülen son sonucu seçin. Burada yalnızca "id" değerine sahip örnek bir sonuç gösterilmiştir.

    {
        "id": "50"
    }
    
  3. Bir sonraki sonuç sayfasını getirmek için bir aralık sorgusunda bu "id" değerini kullanın. Bu "kimlik" alanı benzersiz değerlere sahip olmalıdır, aksi takdirde sayfalandırma yinelenen sonuçlar içerebilir.

    POST /indexes/good-books/docs/search?api-version=2020-06-30
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc",
          "filter": "id ge 50"
        }
    
  4. Sayfalandırma, sorgu sıfır sonuç döndürdüğünde sona erer.

Not

"Filtrelenebilir" ve "sıralanabilir" öznitelikleri yalnızca bir alan bir dizine ilk eklendiğinde etkinleştirilebilir, var olan bir alanda etkinleştirilemez.

Sonuçları sıralama

Tam metin arama sorgusunda sonuçlar şu şekilde sıralanabilir:

  • arama puanı
  • anlamsal reranker puanı
  • "Sıralanabilir" alanda sıralama düzeni

Puanlama profili ekleyerek belirli alanlarda bulunan eşleşmeleri de artırabilirsiniz.

Arama puanına göre sırala

Tam metin arama sorguları için sonuçlar, arama puanına göre otomatik olarak sıralanır ve bir belgedeki terim sıklığı ve yakınlık temelinde hesaplanır (TF-IDF'den türetilir), arama teriminde daha fazla veya daha güçlü eşleşmeleri olan belgelere daha yüksek puanlar eklenir.

"@search.score" aralığı ilişkisiz veya eski hizmetlerde 1,00'a kadar (ancak dahil değildir) 0'dır.

Her iki algoritma için de 1,00'a eşit bir "@search.score", 1,0 puanının tüm sonuçlarda tekdüzen olduğu, kaydedilmemiş veya kaydedilmemiş bir sonuç kümesini gösterir. Sorgu formu belirsiz arama, joker karakter veya regex sorguları ya da boş bir arama (search=* ) olduğunda, puanlanmamış sonuçlar oluşur. Puanlanmamış sonuçlara göre bir derecelendirme yapısı uygulamanız gerekiyorsa, bu hedefe ulaşmak için bir $orderby ifadeyi göz önünde bulundurun.

Semantik reranker tarafından sipariş

Anlam derecelendirmesi kullanıyorsanız sonuçlarınızın sıralama düzenini "@search.rerankerScore" belirler.

"@search.rerankerScore" aralığı 1 ile 4,00 arasındadır ve daha yüksek bir puan daha güçlü bir anlamsal eşleşmeyi gösterir.

$orderby ile sipariş verme

Tutarlı sıralama bir uygulama gereksinimiyse, alanda bir $orderby ifade tanımlayabilirsiniz. Sonuçları sıralamak için yalnızca "sıralanabilir" olarak dizine alınan alanlar kullanılabilir.

Derecelendirme, tarih ve konum dahil olmak üzere yaygın olarak kullanılan $orderby alanlar. Konuma göre filtreleme, filtre ifadesinin alan adına ek olarak işlevi çağırmasını geo.distance() gerektirir.

Sayısal alanlar (Edm.Double, Edm.Int32, Edm.Int64) sayısal düzende sıralanır (örneğin, 1, 2, 10, 11, 20).

Dize alanları (Edm.String, Edm.ComplexType alt alanları), dile bağlı olarak ASCII sıralama düzeninde veya Unicode sıralama düzeninde sıralanır. Herhangi bir türde koleksiyonları sıralayamazsınız.

  • Dize alanlarındaki sayısal içerik alfabetik olarak sıralanır (1, 10, 11, 2, 20).

  • Büyük harf dizeleri küçük harflerden önce sıralanır (APPLE, Apple, BANANA, Muz, elma, muz). Bu davranışı değiştirmek için sıralamadan önce metni önceden işlemek için bir metin normalleştiricisi atayabilirsiniz. Azure AI Search, alanın çözümlenmemiş bir kopyasına göre sıralandığından, alanda küçük harf belirteci kullanmanın sıralama davranışı üzerinde hiçbir etkisi olmaz.

  • Aksanlarla sonuç veren dizeler en son görünür (Äpfel, Öffnen, Üben)

Puanlama profili kullanarak ilgi düzeyini artırma

Sipariş tutarlılığını yükselten bir diğer yaklaşım da özel puanlama profili kullanmaktır. Puanlama profilleri, belirli alanlarda bulunan eşleşmeleri artırma özelliğiyle arama sonuçlarındaki öğelerin derecelendirmesi üzerinde daha fazla denetim sahibi olmanıza olanak sağlar. Ek puanlama mantığı, her belgenin arama puanları birbirinden daha uzak olduğundan çoğaltmalar arasındaki küçük farkları geçersiz kılmaya yardımcı olabilir. Bu yaklaşım için derecelendirme algoritmasını öneririz.

İsabet vurgulama

İsabet vurgulama, sonuç olarak eşleşen terimlere uygulanan metin biçimlendirmesini (kalın veya sarı vurgular gibi) ifade eder ve bu da eşleşmeyi belirlemeyi kolaylaştırır. Vurgulama, eşleşmenin hemen belirgin olmadığı bir açıklama alanı gibi daha uzun içerik alanları için kullanışlıdır.

Vurgulamanın tek tek terimlere uygulandığına dikkat edin. Tüm alanın içeriği için vurgu özelliği yoktur. Bir tümceciği vurgulamak istiyorsanız, tırnak içine alınmış bir sorgu dizesinde eşleşen terimleri (veya tümceciği) sağlamanız gerekir. Bu teknik, bu bölümde daha ayrıntılı olarak açıklanmıştır.

Sorgu isteğinde isabet vurgulama yönergeleri sağlanır. Benzer ve joker karakter arama gibi altyapıda sorgu genişletmeyi tetikleyen sorgular isabet vurgulama için sınırlı desteğe sahiptir.

İsabet vurgulama gereksinimleri

  • Alanlar veya olmalıdır Edm.StringCollection(Edm.String)
  • Alanlar aranabilir durumda özniteliklendirilmelidir

İstekte vurgulama belirtme

Vurgulanan terimleri döndürmek için sorgu isteğine "highlight" parametresini ekleyin. parametresi, virgülle ayrılmış alan listesine ayarlanır.

Varsayılan olarak, biçimlendirme işareti şeklindedir<em>, ancak ve highlightPostTag parametrelerini kullanarak highlightPreTag etiketi geçersiz kılabilirsiniz. İstemci kodunuz yanıtı işler (örneğin, kalın yazı tipi veya sarı arka plan uygulama).

POST /indexes/good-books/docs/search?api-version=2020-06-30 
    {  
      "search": "divine secrets",  
      "highlight": "title, original_title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>"
    }

Varsayılan olarak, Azure AI Search alan başına en fazla beş vurgu döndürür. Bu sayıyı, sonuna bir tamsayı ekleyerek ayarlayabilirsiniz. Örneğin, "highlight": "description-10" "açıklama" alanındaki eşleşen içerikle ilgili en fazla 10 vurgulanmış terim döndürür.

Vurgulanan sonuçlar

Sorguya vurgulama eklendiğinde, yanıt her sonuç için bir "@search.highlights" içerir, böylece uygulama kodunuz bu yapıyı hedefleyebilir. "Vurgulama" için belirtilen alanların listesi yanıta eklenir.

Anahtar sözcük aramasında her terim bağımsız olarak taranır. "İlahi gizli diziler" sorgusu, herhangi bir terimi içeren herhangi bir belgede eşleşmeler döndürür.

Tümcecik sorgusu üzerinde vurgulama işleminin ekran görüntüsü.

Anahtar sözcük arama vurgulama

Vurgulanan bir alanın içinde biçimlendirme tüm terimlere uygulanır. Örneğin, "Ya-Ya Kardeşliğinin İlahi Sırları" ile yapılan bir eşleşmede, biçimlendirme ardışık olsalar bile her terime ayrı olarak uygulanır.

"@odata.count": 39,
"value": [
    {
        "@search.score": 19.593246,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ],
            "title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ]
        },
        "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
        "title": "Divine Secrets of the Ya-Ya Sisterhood"
    },
    {
        "@search.score": 12.779835,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> Madness"
            ],
            "title": [
                "<em>Divine</em> Madness (Cherub, #5)"
            ]
        },
        "original_title": "Divine Madness",
        "title": "Divine Madness (Cherub, #5)"
    },
    {
        "@search.score": 12.62534,
        "@search.highlights": {
            "original_title": [
                "Grave <em>Secrets</em>"
            ],
            "title": [
                "Grave <em>Secrets</em> (Temperance Brennan, #5)"
            ]
        },
        "original_title": "Grave Secrets",
        "title": "Grave Secrets (Temperance Brennan, #5)"
    }
]

Tümcecik araması vurgulama

Tüm terim biçimlendirmesi, birden çok terimin çift tırnak içine alındığı bir tümcecik aramasında bile geçerlidir. Aşağıdaki örnek aynı sorgudur, ancak "ilahi gizli diziler" tırnak içine alınmış bir tümcecik olarak gönderilir (bazı REST istemcileri, iç tırnak işaretlerinden ters eğik çizgiyle \"kaçmanızı gerektirir):

POST /indexes/good-books/docs/search?api-version=2020-06-30 
    {  
      "search": "\"divine secrets\"",,
      "select": "title,original_title",
      "highlight": "title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>",
      "count": true
    }

Ölçütler artık her iki terime de sahip olduğundan, arama dizininde yalnızca bir eşleşme bulunur. Yukarıdaki sorguya verilen yanıt şöyle görünür:

{
    "@odata.count": 1,
    "value": [
        {
            "@search.score": 19.593246,
            "@search.highlights": {
                "title": [
                    "<b>Divine</b> <b>Secrets</b> of the Ya-Ya Sisterhood"
                ]
            },
            "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
            "title": "Divine Secrets of the Ya-Ya Sisterhood"
        }
    ]
}

Eski hizmetlerde tümcecik vurgulama

15 Temmuz 2020'ye kadar oluşturulan Arama hizmeti, tümcecik sorguları için farklı bir vurgulama deneyimi uygular.

Aşağıdaki örnekler için tırnak içine alınmış "super bowl" tümceciği içeren bir sorgu dizesi varsayın. Temmuz 2020'ye kadar tümcecikteki terimler vurgulanır:

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is <em>super</em> awesome with a <em>bowl</em> of chips"
   ]

Temmuz 2020'de oluşturulan arama hizmetleri için yalnızca tümcecik sorgusuyla eşleşen tümcecikler "@search.highlights" içinde döndürülür:

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is super awesome with a bowl of chips"
   ]

Sonraki adımlar

İstemciniz için hızla bir arama sayfası oluşturmak için şu seçenekleri göz önünde bulundurun:

  • Uygulama Oluşturucu, portalda arama çubuğu, yönlü gezinti ve görüntü içeren sonuç alanı içeren bir HTML sayfası oluşturur.

  • ASP.NET Core (MVC) uygulamasına arama ekleme, işlevsel bir istemci oluşturan bir öğretici ve kod örneğidir.

  • Web uygulamalarına arama ekleme, kullanıcı deneyimi için React JavaScript kitaplıklarını kullanan bir öğretici ve kod örneğidir. Uygulama, Azure Static Web Apps kullanılarak dağıtılır.