Aracılığıyla paylaş


Azure AI Search'te içeri aktarma ve dizin oluşturma için ilişkisel SQL verilerini modelleme

Azure AI Search, dizin oluşturma işlem hattına giriş olarak düz bir satır kümesi kabul eder. Kaynak verileriniz SQL Server ilişkisel veritabanındaki birleştirilmiş tablolardan geliyorsa, bu makalede satır kümesinin nasıl derleneceği ve Azure AI Search dizininde üst-alt ilişkisinin nasıl modelleneceği açıklanmaktadır.

Bir çizim olarak, demo verilerine dayalı varsayımsal bir oteller veritabanına atıfta bulunuruz. Veritabanının 50 otel içeren bir Hotels$ tablodan ve Rooms$ toplam 750 oda için farklı türlerden, fiyatlardan ve olanaklardan oluşan bir tablodan oluştuğu varsayılır. Tablolar arasında bire çok ilişki vardır. Yaklaşımımızda bir görünüm, her satıra ilişkilendirilmiş oda ayrıntılarının ekli olduğu, otel başına bir satır olmak üzere 50 satır döndüren sorguyu sağlar.

Oteller veritabanındaki tablolar ve görünüm

Normal dışı veri sorunu

Bire çok ilişkilerle çalışmanın zorluklarından biri, birleştirilmiş tablolarda oluşturulan standart sorguların normalleştirilmiş verileri döndürmesi ve bu da Azure AI Search senaryosunda iyi sonuç vermemesidir. Otel ve odaları birleştiren aşağıdaki örneği göz önünde bulundurun.

SELECT * FROM Hotels$
INNER JOIN Rooms$
ON Rooms$.HotelID = Hotels$.HotelID

Bu sorgudan elde edilen sonuçlar, tüm Otel alanlarını ve ardından tüm Oda alanlarını döndürür ve her oda değeri için ön otel bilgileri yinelenir.

Normalleştirilmiş veriler, oda alanları eklendiğinde yedekli otel verileri

Bu sorgu yüzeyde başarılı olsa da (tüm verileri düz bir satır kümesinde sağlayarak), beklenen arama deneyimi için doğru belge yapısını teslim etmede başarısız olur. Dizin oluşturma sırasında Azure AI Search, alınan her satır için bir arama belgesi oluşturur. Arama belgeleriniz yukarıdaki sonuçlar gibi görünseydi, yinelenenleri algılamış olursunuz - yalnızca Eski Century Hotel için yedi ayrı belge. "Florida'daki oteller" sorgusu, yalnızca Old Century Hotel için yedi sonuç döndürerek diğer ilgili otelleri arama sonuçlarının derinliklerine iter.

Otel başına bir belgenin beklenen deneyimini elde etmek için doğru ayrıntı düzeyinde tam bilgi içeren bir satır kümesi sağlamanız gerekir. Bu makalede nasıl olduğu açıklanmaktadır.

Eklenmiş JSON döndüren bir sorgu tanımlama

Beklenen arama deneyimini sunmak için veri kümeniz Azure AI Search'teki her arama belgesi için bir satırdan oluşmalıdır. Örneğimizde, her otel için bir satır istiyoruz, ancak kullanıcılarımızın gece fiyatı, boyutu ve yatak sayısı gibi önem verdikleri odayla ilgili diğer alanları veya tümü oda ayrıntılarının bir parçası olan plaj görünümünü de arayabilmelerini istiyoruz.

Çözüm, oda ayrıntılarını iç içe JSON olarak yakalamak ve ardından JSON yapısını ikinci adımda gösterildiği gibi görünümdeki bir alana eklemektir.

  1. 50 otel ve 750 odanın ayrıntılarını içeren ve Rooms$HotelID alanında birleştirilen iki birleştirilmiş tablonuz Hotels$ olduğunu varsayalım. Ayrı ayrı, bu tablolar 50 otel ve 750 ilgili oda içerir.

    CREATE TABLE [dbo].[Hotels$](
      [HotelID] [nchar](10) NOT NULL,
      [HotelName] [nvarchar](255) NULL,
      [Description] [nvarchar](max) NULL,
      [Description_fr] [nvarchar](max) NULL,
      [Category] [nvarchar](255) NULL,
      [Tags] [nvarchar](255) NULL,
      [ParkingIncluded] [float] NULL,
      [SmokingAllowed] [float] NULL,
      [LastRenovationDate] [smalldatetime] NULL,
      [Rating] [float] NULL,
      [StreetAddress] [nvarchar](255) NULL,
      [City] [nvarchar](255) NULL,
      [State] [nvarchar](255) NULL,
      [ZipCode] [nvarchar](255) NULL,
      [GeoCoordinates] [nvarchar](255) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[Rooms$](
      [HotelID] [nchar](10) NULL,
      [Description] [nvarchar](255) NULL,
      [Description_fr] [nvarchar](255) NULL,
      [Type] [nvarchar](255) NULL,
      [BaseRate] [float] NULL,
      [BedOptions] [nvarchar](255) NULL,
      [SleepsCount] [float] NULL,
      [SmokingAllowed] [float] NULL,
      [Tags] [nvarchar](255) NULL
    ) ON [PRIMARY]
    GO
    
  2. İç içe sorgunun çıkışını içeren yeni bir Rooms alanının eklenmesiyle, üst tablodaki ()SELECT * from dbo.Hotels$ tüm alanlardan oluşan bir görünüm oluşturun. Çıktıyı JSON olarak derlerken for SELECT * from dbo.Rooms$ JSON AUTO yan tümcesi.

    CREATE VIEW [dbo].[HotelRooms]
    AS
    SELECT *, (SELECT *
             FROM dbo.Rooms$
             WHERE dbo.Rooms$.HotelID = dbo.Hotels$.HotelID FOR JSON AUTO) AS Rooms
    FROM dbo.Hotels$
    GO
    

    Aşağıdaki ekran görüntüsünde, en altta Rooms nvarchar alanı bulunan sonuç görünümü gösterilmektedir. Odalar alanı yalnızca HotelRooms görünümünde bulunur.

    HotelRooms görünümü

  3. Satır kümesini almak için komutunu çalıştırın SELECT * FROM dbo.HotelRooms . Bu sorgu, bir JSON koleksiyonu olarak ilişkili oda bilgileriyle birlikte otel başına bir tane olmak üzere 50 satır döndürür.

    HotelRooms görünümünden satır kümesi

Bu satır kümesi artık Azure AI Search'e içeri aktarmaya hazırdır.

Not

Bu yaklaşım, katıştırılmış JSON'un SQL Server'ın sütun boyutu üst sınırı altında olduğunu varsayar.

Bire çok ilişkisinin "çok" tarafı için karmaşık bir koleksiyon kullanma

Azure AI Arama tarafında, iç içe JSON kullanarak bire çok ilişkisini modelleyen bir dizin şeması oluşturun. Önceki bölümde oluşturduğunuz sonuç kümesi genellikle sonraki bölümde sağlanan dizin şemasına karşılık gelir (bazı alanları kısa olması için kesiyoruz).

Aşağıdaki örnek, Karmaşık veri türlerini modelleme'deki örneğe benzer. Bu makalenin odak noktası olan Rooms yapısı, hotels adlı bir dizinin alanlar koleksiyonunda yer almaktadır. Bu örnekte, bir koleksiyonda izin verilen birden çok, rastgele öğe sayısının aksine sabit bir öğe kümesinden oluşmasından farklı olan Address için karmaşık bir tür de gösterilmektedir.

{
  "name": "hotels",
  "fields": [
    { "name": "HotelId", "type": "Edm.String", "key": true, "filterable": true },
    { "name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false },
    { "name": "Description", "type": "Edm.String", "searchable": true, "analyzer": "en.lucene" },
    { "name": "Description_fr", "type": "Edm.String", "searchable": true, "analyzer": "fr.lucene" },
    { "name": "Category", "type": "Edm.String", "searchable": true, "filterable": true, "facetable": true },
    { "name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": true, "facetable": true },
    { "name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "facetable": true },
    { "name": "Address", "type": "Edm.ComplexType",
      "fields": [
        { "name": "StreetAddress", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "searchable": true },
        { "name": "City", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true },
        { "name": "StateProvince", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true }
      ]
    },
    { "name": "Rooms", "type": "Collection(Edm.ComplexType)",
      "fields": [
        { "name": "Description", "type": "Edm.String", "searchable": true, "analyzer": "en.lucene" },
        { "name": "Description_fr", "type": "Edm.String", "searchable": true, "analyzer": "fr.lucene" },
        { "name": "Type", "type": "Edm.String", "searchable": true },
        { "name": "BaseRate", "type": "Edm.Double", "filterable": true, "facetable": true },
        { "name": "BedOptions", "type": "Edm.String", "searchable": true, "filterable": true, "facetable": false },
        { "name": "SleepsCount", "type": "Edm.Int32", "filterable": true, "facetable": true },
        { "name": "SmokingAllowed", "type": "Edm.Boolean", "filterable": true, "facetable": false},
        { "name": "Tags", "type": "Edm.Collection", "searchable": true }
      ]
    }
  ]
}

Önceki sonuç kümesi ve yukarıdaki dizin şeması göz önünde bulundurulduğunda, başarılı bir dizin oluşturma işlemi için gerekli tüm bileşenlere sahipsiniz. Düzleştirilmiş veri kümesi dizin oluşturma gereksinimlerini karşılar ancak ayrıntı bilgilerini korur. Azure AI Search dizininde arama sonuçları, tek tek odaların bağlamını ve özniteliklerini koruyarak otel tabanlı varlıklara kolayca eklenir.

Karmaşık tür alt alanlarında model davranışı

Adres ve Odalar altındaki alanlar gibi üst öğeye sahip alanlar alt alanlar olarak adlandırılır. Bir alt alan için "modellenebilir" özniteliği atayabilirsiniz, ancak model sayısı her zaman ana belge içindir.

Belgede yalnızca bir "Adres/Şehir" veya "Address/stateProvince" bulunan Address gibi karmaşık türler için model davranışı beklendiği gibi çalışır. Ancak, her ana belge için birden çok alt belgenin bulunduğu Odalar söz konusu olduğunda model sayıları yanıltıcı olabilir.

Model karmaşık türlerinde belirtildiği gibi: "Model sonuçlarında döndürülen belge sayıları, karmaşık bir koleksiyondaki (odalar) alt belgeler için değil, üst belge (otel) için hesaplanır. Örneğin, bir otelin "suite" türünde 20 odası olduğunu varsayalım. Model=Rooms/Type bu model parametresi göz önüne alındığında model sayısı odalar için 20 değil, otel için bir tanedir."

Sonraki adımlar

Kendi veri kümenizi kullanarak verileri içeri aktarma sihirbazını kullanarak dizini oluşturabilir ve yükleyebilirsiniz. Sihirbaz, Katıştırılmış JSON koleksiyonunu (Rooms'ta bulunan koleksiyon gibi) algılar ve karmaşık bir tür koleksiyonu içeren bir dizin şeması çıkartır.

Verileri içeri aktarma sihirbazı tarafından çıkarsanan dizin

Verileri içeri aktarma sihirbazının temel adımlarını öğrenmek için aşağıdaki hızlı başlangıcı deneyin.