Azure AI Search'te "basit" arama sorguları örnekleri

Azure AI Search'te basit sorgu söz dizimi , tam metin araması için varsayılan sorgu ayrıştırıcısını çağırır. Ayrıştırıcı hızlıdır ve tam metin araması, filtrelenmiş ve modelli arama ve ön ek araması gibi yaygın senaryoları işler. Bu makalede, Arama Belgeleri (REST API) isteğinde basit söz dizimi kullanımını göstermek için örnekler kullanılır.

Not

Alternatif sorgu söz dizimi Tam Lucene'dir ve benzer ve joker karakterli arama gibi daha karmaşık sorgu yapılarını destekler. Daha fazla bilgi ve örnek için bkz . Tam Lucene söz dizimini kullanma.

Oteller örnek dizini

Aşağıdaki sorgular, bu hızlı başlangıçtaki yönergeleri izleyerek oluşturabileceğiniz hotels-sample-index'i temel alır.

Örnek sorgular REST API ve POST istekleri kullanılarak ifade edilir. Bunları bir REST istemcisinde yapıştırabilir ve çalıştırabilirsiniz. Alternatif olarak Azure portalında Arama Gezgini'nin JSON görünümünü de kullanabilirsiniz. JSON görünümünde, bu makalede gösterilen sorgu örneklerini yapıştırabilirsiniz.

İstek üst bilgileri aşağıdaki değerlere sahip olmalıdır:

Anahtar Değer
İçerik Türü application/json
api-key <your-search-service-api-key>, sorgu veya yönetici anahtarı

URI parametreleri, aşağıdaki örneğe benzer şekilde dizin adı, belge koleksiyonları, arama komutu ve API sürümüne sahip arama hizmeti uç noktanızı içermelidir:

https://{{service-name}}.search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2023-11-01

İstek gövdesi geçerli JSON olarak oluşturulmalıdır:

{
    "search": "*",
    "queryType": "simple",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • olarak ayarlanan * "search", null veya boş aramaya eşdeğer, belirtilmemiş bir sorgudur. Özellikle kullanışlı değildir, ancak yapabileceğiniz en basit aramadır ve dizindeki tüm alınabilir alanları ve tüm değerleri gösterir.

  • "queryType" "simple" olarak ayarlanmıştır ve varsayılan değerdir ve atlanabilir, ancak bu makaledeki sorgu örneklerinin basit söz diziminde ifade edilmelerini daha da güçlendirmek için eklenmiştir.

  • Yalnızca arama sonuçları bağlamında yararlı olan alanlar da dahil olmak üzere arama sonucu oluşturma için virgülle ayrılmış alan listesine ayarlanmış "select" kullanılır.

  • "count", arama ölçütleriyle eşleşen belge sayısını döndürür. Boş bir arama dizesinde, sayı dizindeki tüm belgelerdir (hotels-sample-index içinde 50).

Tam metin araması, boole işleçleriyle veya işleçleri olmadan herhangi bir sayıda tek başına terim veya tırnak içine alınmış tümcecik olabilir.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "pool spa +airport",
    "searchMode": "any",
    "queryType": "simple",
    "select": "HotelId, HotelName, Category, Description",
    "count": true
}

Önemli terimlerden veya tümceciklerden oluşan bir anahtar sözcük araması en iyi şekilde çalışır. Dize alanları dizin oluşturma ve sorgulama sırasında metin analizinden geçer ve "the", "and", "it" gibi gereksiz sözcükleri bırakır. Bir sorgu dizesinin dizinde nasıl belirteç haline getirildiğine bakmak için, dizeyi bir Metin Analizi çağrısında dizine geçirin.

"searchMode" parametresi duyarlığı ve geri çekmeyi denetler. Daha fazla geri çekme istiyorsanız, sorgu dizesinin herhangi bir bölümü eşleşirse sonuç döndüren varsayılan "any" değerini kullanın. Dizenin tüm bölümlerinin eşleşmesi gereken duyarlığı tercih ederseniz searchMode değerini "tümü" olarak değiştirin. SearchMode'un sonucu nasıl değiştirdiğini görmek için yukarıdaki sorguyu her iki yolu da deneyin.

"Havuz spa +havaalanı" sorgusunun yanıtı, kısalık için kırpılmış aşağıdaki örneğe benzer görünmelidir.

"@odata.count": 6,
"value": [
    {
        "@search.score": 7.3617697,
        "HotelId": "21",
        "HotelName": "Nova Hotel & Spa",
        "Description": "1 Mile from the airport.  Free WiFi, Outdoor Pool, Complimentary Airport Shuttle, 6 miles from the beach & 10 miles from downtown.",
        "Category": "Resort and Spa",
        "Tags": [
            "pool",
            "continental breakfast",
            "free parking"
        ]
    },
    {
        "@search.score": 2.5560288,
        "HotelId": "25",
        "HotelName": "Scottish Inn",
        "Description": "Newly Redesigned Rooms & airport shuttle.  Minutes from the airport, enjoy lakeside amenities, a resort-style pool & stylish new guestrooms with Internet TVs.",
        "Category": "Luxury",
        "Tags": [
            "24-hour front desk service",
            "continental breakfast",
            "free wifi"
        ]
    },
    {
        "@search.score": 2.2988036,
        "HotelId": "35",
        "HotelName": "Suites At Bellevue Square",
        "Description": "Luxury at the mall.  Located across the street from the Light Rail to downtown.  Free shuttle to the mall and airport.",
        "Category": "Resort and Spa",
        "Tags": [
            "continental breakfast",
            "air conditioning",
            "24-hour front desk service"
        ]
    }
]

Yanıttaki arama puanına dikkat edin. Bu, maçın ilgi puanıdır. Varsayılan olarak, arama hizmeti bu puana göre ilk 50 eşleşmeyi döndürür.

Tekdüzen "1,0" puanları, sıralama olmadığında, arama tam metin araması olmadığından veya ölçüt sağlanmadığından oluşur. Örneğin, boş bir aramada (search=*), satırlar rastgele sırayla geri gelir. Gerçek ölçütleri eklediğinizde, arama puanlarının anlamlı değerlere dönüşmesiyle karşılaşırsınız.

Örnek 2: Kimliğine göre arama

Bir sorguda arama sonuçlarını döndürürken, mantıksal bir sonraki adım belgeden daha fazla alan içeren bir ayrıntılar sayfası sağlamaktır. Bu örnekte, belge kimliğini geçirerek Arama Belgesi'ni kullanarak tek bir belgenin nasıl döndürüleceği gösterilmektedir.

GET /indexes/hotels-sample-index/docs/41?api-version=2023-11-01

Tüm belgelerin benzersiz bir tanımlayıcısı vardır. Portalı kullanıyorsanız Dizinler sekmesinden dizini seçin ve ardından hangi alanın anahtar olduğunu belirlemek için alan tanımlarına bakın. REST kullanarak, Dizin Al çağrısı yanıt gövdesindeki dizin tanımını döndürür.

Yukarıdaki sorgunun yanıtı, anahtarı 41 olan belgeden oluşur. Dizin tanımında "alınabilir" olarak işaretlenmiş herhangi bir alan arama sonuçlarında döndürülebilir ve uygulamanızda işlenebilir.

{
    "HotelId": "41",
    "HotelName": "Ocean Air Motel",
    "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Various shops and art entertainment are on the boardwalk, just steps away.",
    "Description_fr": "L'hôtel front de mer surplombant la plage dispose de chambres avec balcon privé et 2 piscines intérieures et extérieures. Divers commerces et animations artistiques sont sur la promenade, à quelques pas.",
    "Category": "Budget",
    "Tags": [
        "pool",
        "air conditioning",
        "bar"
    ],
    "ParkingIncluded": true,
    "LastRenovationDate": "1951-05-10T00:00:00Z",
    "Rating": 3.5,
    "Location": {
        "type": "Point",
        "coordinates": [
            -157.846817,
            21.295841
        ],
        "crs": {
            "type": "name",
            "properties": {
                "name": "EPSG:4326"
            }
        }
    },
    "Address": {
        "StreetAddress": "1450 Ala Moana Blvd 2238 Ala Moana Ctr",
        "City": "Honolulu",
        "StateProvince": "HI",
        "PostalCode": "96814",
        "Country": "USA"
    }
}

Örnek 3: Metne göre filtreleme

Filtre söz dizimi , kendi başına veya ile searchkullanabileceğiniz bir OData ifadesidir. Birlikte kullanılır, filter önce dizinin tamamına uygulanır ve ardından arama filtrenin sonuçları üzerinde gerçekleştirilir. Filtreler arama sorgusunun işlemesi gereken belge kümesini azalttığından, sorgu performansını iyileştirmeye yönelik kullanışlı bir teknik olabilir.

Filtreler, dizin tanımında olarak filterable işaretlenmiş herhangi bir alanda tanımlanabilir. Hotels-sample-index için, filtrelenebilir alanlar Kategori, Etiketler, ParkGerekli, Derecelendirme ve adres alanlarının çoğudır.

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "art tours",
    "queryType": "simple",
    "filter": "Category eq 'Resort and Spa'",
    "searchFields": "HotelName,Description,Category",
    "select": "HotelId,HotelName,Description,Category",
    "count": true
}

Yukarıdaki sorgunun yanıtının kapsamı yalnızca "Rapor ve Spa" olarak kategorilere ayrılmış ve "sanat" veya "turlar" terimlerini içeren oteller olarak belirlenmiştir. Bu durumda, yalnızca bir eşleşme vardır.

{
    "@search.score": 2.8576312,
    "HotelId": "31",
    "HotelName": "Santa Fe Stay",
    "Description": "Nestled on six beautifully landscaped acres, located 2 blocks from the Plaza. Unwind at the spa and indulge in art tours on site.",
    "Category": "Resort and Spa"
}

Örnek 4: Filtre işlevleri

Filtre ifadeleri "search.ismatch" ve "search.ismatchscoring" işlevlerini içerebilir ve filtre içinde bir arama sorgusu oluşturmanıza olanak sağlar. Bu filtre ifadesi ücretsiz wifi, ücretsiz otopark vb. gibi olanakları seçmek için ücretsiz joker karakter kullanır.

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
  {
    "search": "",
    "filter": "search.ismatch('free*', 'Tags', 'full', 'any')",
    "select": "HotelId, HotelName, Category, Description",
    "count": true
  }

Yukarıdaki sorgu için yanıt, ücretsiz olanaklar sunan 19 otelle eşleşir. Arama puanının sonuçlar boyunca tekdüzen bir "1,0" olduğuna dikkat edin. Bunun nedeni, arama ifadesinin null veya boş olması ve tam metin araması yapılmaması ve tam filtre eşleşmesi ile sonuçlanmasıdır. İlgi puanları yalnızca tam metin aramada döndürülür. filtreleri olmadan searchkullanıyorsanız, arama derecesini denetleyebilmeniz için yeterli sıralanabilir alanınız olduğundan emin olun.

"@odata.count": 19,
"value": [
    {
        "@search.score": 1.0,
        "HotelId": "31",
        "HotelName": "Santa Fe Stay",
        "Tags": [
            "view",
            "restaurant",
            "free parking"
        ]
    },
    {
        "@search.score": 1.0,
        "HotelId": "27",
        "HotelName": "Super Deluxe Inn & Suites",
        "Tags": [
            "bar",
            "free wifi"
        ]
    },
    {
        "@search.score": 1.0,
        "HotelId": "39",
        "HotelName": "Whitefish Lodge & Suites",
        "Tags": [
            "continental breakfast",
            "free parking",
            "free wifi"
        ]
    },
    {
        "@search.score": 1.0,
        "HotelId": "11",
        "HotelName": "Regal Orb Resort & Spa",
        "Tags": [
            "free wifi",
            "restaurant",
            "24-hour front desk service"
        ]
    },

Örnek 5: Aralık filtreleri

Aralık filtreleme, herhangi bir veri türü için filtre ifadeleri aracılığıyla desteklenir. Aşağıdaki örneklerde sayısal ve dize aralıkları gösterilmektedir. Veri türleri, aralık filtrelerinde önemlidir ve sayısal veriler sayısal alanlarda ve dize alanlarında dize verileri olduğunda en iyi şekilde çalışır. Sayısal dizeler karşılaştırılabilir olmadığından, dize alanlarındaki sayısal veriler aralıklar için uygun değildir.

Aşağıdaki sorgu sayısal bir aralıktır. Hotels-sample-index içinde filtrelenebilir tek sayısal alan Derecelendirme'dir.

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "Rating ge 2 and Rating lt 4",
    "select": "HotelId, HotelName, Rating",
    "orderby": "Rating desc",
    "count": true
}

Bu sorgunun yanıtı, kısa olması için kırpılmış aşağıdaki örneğe benzer görünmelidir.

"@odata.count": 27,
"value": [
    {
        "@search.score": 1.0,
        "HotelId": "22",
        "HotelName": "Stone Lion Inn",
        "Rating": 3.9
    },
    {
        "@search.score": 1.0,
        "HotelId": "25",
        "HotelName": "Scottish Inn",
        "Rating": 3.8
    },
    {
        "@search.score": 1.0,
        "HotelId": "2",
        "HotelName": "Twin Dome Motel",
        "Rating": 3.6
    }
...

Sonraki sorgu, bir dize alanı (Address/StateProvince) üzerinde bir aralık filtresidir:

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "Address/StateProvince ge 'A*' and Address/StateProvince lt 'D*'",
    "select": "HotelId, HotelName, Address/StateProvince",
    "count": true
}

Bu sorgunun yanıtı aşağıdaki örneğe benzer görünmelidir ve kısalık için kırpılmıştır. Bu örnekte, alan dizin tanımında "sıralanabilir" olarak ilişkilendirilmediğinden StateProvince'a göre sıralamak mümkün değildir.

"@odata.count": 9,
"value": [
    {
        "@search.score": 1.0,
        "HotelId": "9",
        "HotelName": "Smile Hotel",
        "Address": {
            "StateProvince": "CA "
        }
    },
    {
        "@search.score": 1.0,
        "HotelId": "39",
        "HotelName": "Whitefish Lodge & Suites",
        "Address": {
            "StateProvince": "CO"
        }
    },
    {
        "@search.score": 1.0,
        "HotelId": "7",
        "HotelName": "Countryside Resort",
        "Address": {
            "StateProvince": "CA "
        }
    },
...

Hotels-sample dizini, enlem ve boylam koordinatlarına sahip bir Konum alanı içerir. Bu örnekte, bir başlangıç noktasının çevresi içindeki belgelere filtre ekleyen geo.distance işlevi , sağladığınız rastgele bir uzaklığa (kilometre cinsinden) kadar kullanılır. Sorgunun yüzey alanını küçültmek veya büyütmek için sorgudaki son değeri (10) ayarlayabilirsiniz.

POST /indexes/v/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "geo.distance(Location, geography'POINT(-122.335114 47.612839)') le 10",
    "select": "HotelId, HotelName, Address/City, Address/StateProvince",
    "count": true
}

Bu sorgunun yanıtı, sağlanan koordinatların 10 kilometre uzaklığındaki tüm otelleri döndürür:

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 1.0,
            "HotelId": "45",
            "HotelName": "Arcadia Resort & Restaurant",
            "Address": {
                "City": "Seattle",
                "StateProvince": "WA"
            }
        },
        {
            "@search.score": 1.0,
            "HotelId": "24",
            "HotelName": "Gacc Capital",
            "Address": {
                "City": "Seattle",
                "StateProvince": "WA"
            }
        },
        {
            "@search.score": 1.0,
            "HotelId": "16",
            "HotelName": "Double Sanctuary Resort",
            "Address": {
                "City": "Seattle",
                "StateProvince": "WA"
            }
        }
    ]
}

Örnek 7: SearchMode ile Booleanlar

Basit söz dizimi VE, OR ve DEĞİl sorgu mantığını desteklemek için karakter (+, -, |) biçiminde boole işleçlerini destekler. Boole araması, birkaç önemli özel durumla beklediğiniz gibi davranır.

Önceki örneklerde parametre, searchMode duyarlık ve geri çekmeyi etkileme mekanizması olarak tanıtıldı ve geri çekmeyi "searchMode": "any" destekleme (ölçütlerden herhangi birini karşılayan bir belge eşleşme olarak kabul edilir) ve duyarlık yerine "searchMode=all" özelliği sağlanıyordu (tüm ölçütler belgede eşleşmelidir).

Boole araması bağlamında, bir sorguyu birden çok işleçle yığıyorsanız ve daha dar sonuçlar yerine daha geniş alıyorsanız varsayılan değer "searchMode": "any" kafa karıştırıcı olabilir. Bu özellikle NOT için geçerlidir; burada sonuçlar belirli bir terim veya tümceciği "içermeyen" tüm belgeleri içerir.

Aşağıdaki örnek, bir gösterim sağlar. SearchMode (herhangi biri) ile aşağıdaki sorgu çalıştırıldığında 42 belge döndürülür: "restoran" terimini içerenler ve "klima" ifadesi olmayan tüm belgeler.

Boole işleci (-) ile "klima" ifadesi arasında boşluk olmadığına dikkat edin.

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "restaurant -\"air conditioning\"",
    "searchMode": "any",
    "searchFields": "Tags",
    "select": "HotelId, HotelName, Tags",
    "count": true
}

"searchMode": "all" Ölçütler üzerinde kümülatif bir etkiyi zorunlu kılıp "restoran" terimini içeren belgelerden oluşan daha küçük bir sonuç kümesi (7 eşleşme) döndürür ve "klima" ifadesini içerenler hariç.

Bu sorgunun yanıtı artık kısa olması için kırpılmış aşağıdaki örneğe benzer olacaktır.

"@odata.count": 7,
"value": [
    {
        "@search.score": 2.5460577,
        "HotelId": "11",
        "HotelName": "Regal Orb Resort & Spa",
        "Tags": [
            "free wifi",
            "restaurant",
            "24-hour front desk service"
        ]
    },
    {
        "@search.score": 2.166792,
        "HotelId": "10",
        "HotelName": "Countryside Hotel",
        "Tags": [
            "24-hour front desk service",
            "coffee in lobby",
            "restaurant"
        ]
    },
...

Örnek 8: Sayfalama sonuçları

Önceki örneklerde, sonuç olarak hangi alanların bulunduğunu belirleme, sıralama düzenleri ve tüm eşleşmelerin sayısını dahil etme dahil olmak üzere select arama sonuçları bileşimini etkileyen parametreler hakkında bilgi edinmişsinizdir. Bu örnek, belirli bir sayfada görünen sonuç sayısını toplu olarak kullanmanıza olanak sağlayan sayfalama parametreleri biçiminde arama sonucu oluşturma işleminin devamıdır.

Varsayılan olarak, arama hizmeti ilk 50 eşleşmeyi döndürür. Her sayfadaki eşleşme sayısını denetlemek için öğesini kullanarak top toplu işlemin boyutunu tanımlayın ve ardından sonraki toplu işleri almak için kullanın skip .

Aşağıdaki örnekte Derecelendirme alanında bir filtre ve sıralama düzeni (Derecelendirme hem filtrelenebilir hem de sıralanabilir) kullanılır çünkü sıralanmış sonuçlarda sayfalamanın etkilerini görmek daha kolaydır. Normal bir tam arama sorgusunda, üst eşleşmeler tarafından derecelendirilir ve sayfalandırılır @search.score.

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "Rating gt 4",
    "select": "HotelName, Rating",
    "orderby": "Rating desc",
    "top": "5",
    "count": true
}

Sorgu eşleşen 21 belge bulur, ancak belirttiğiniz topiçin yanıt yalnızca ilk beş eşleşmeyi döndürür; derecelendirmeler 4,9'dan başlar ve 4,7'de "B Gölü Hanımı & B" ile biter.

Sonraki 5'i almak için ilk toplu işlemi atlayın:

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "*",
    "filter": "Rating gt 4",
    "select": "HotelName, Rating",
    "orderby": "Rating desc",
    "top": "5",
    "skip": "5",
    "count": true
}

İkinci toplu işlemin yanıtı ilk beş eşleşmeyi atlar ve "Pull'r Inn Motel" ile başlayarak sonraki beş eşleşmeyi döndürür. Daha fazla toplu işleme devam etmek için 5'te tutar top ve her yeni istekte 5 artırırsınız skip (skip=5, skip=10, skip=15 vb.).

"value": [
    {
        "@search.score": 1.0,
        "HotelName": "Pull'r Inn Motel",
        "Rating": 4.7
    },
    {
        "@search.score": 1.0,
        "HotelName": "Sublime Cliff Hotel",
        "Rating": 4.6
    },
    {
        "@search.score": 1.0,
        "HotelName": "Antiquity Hotel",
        "Rating": 4.5
    },
    {
        "@search.score": 1.0,
        "HotelName": "Nordick's Motel",
        "Rating": 4.5
    },
    {
        "@search.score": 1.0,
        "HotelName": "Winter Panorama Resort",
        "Rating": 4.5
    }
]

Sonraki adımlar

Artık temel sorgu söz dizimi konusunda biraz alıştırma yaptığınıza göre kodda sorgu belirtmeyi deneyin. Aşağıdaki bağlantı, Azure SDK'larını kullanarak arama sorguları ayarlamayı kapsar.

Aşağıdaki bağlantılarda daha fazla söz dizimi başvurusu, sorgu mimarisi ve örnek bulunabilir: