"Tam" Lucene arama söz dizimi örnekleri (Azure AI Search'te gelişmiş sorgular)

Azure AI Search için sorgu oluştururken, özelleştirilmiş ve gelişmiş sorgu ifadelerini formüle etmek için varsayılan basit sorgu ayrıştırıcısını daha güçlü Lucene sorgu ayrıştırıcısıyla değiştirebilirsiniz.

Lucene ayrıştırıcısı alan kapsamlı sorgular, belirsiz arama, infix and suffix joker karakter araması, yakınlık araması, terim artırma ve normal ifade araması gibi karmaşık sorgu biçimlerini destekler. Ek güç, daha fazla işlem gereksinimiyle birlikte gelir, bu nedenle biraz daha uzun bir yürütme süresi beklemeniz gerekir. Bu makalede, tam söz dizimine göre sorgu işlemlerini gösteren örneklerde adım adım ilerleyebilirsiniz.

Not

Tam Lucene sorgu söz dizimi aracılığıyla etkinleştirilen özelleştirilmiş sorgu yapılarının çoğu metin analizi yapılmaz; bu da kök veya lemmatizasyon bekliyorsanız şaşırtıcı olabilir. Sözcük temelli analiz yalnızca tam terimler (terim sorgusu veya tümcecik sorgusu) üzerinde gerçekleştirilir. Tamamlanmamış terimlere sahip sorgu türleri (ön ek sorgusu, joker sorgu, regex sorgusu, belirsiz sorgu) doğrudan sorgu ağacına eklenir ve analiz aşaması atlanır. Kısmi sorgu terimlerinde gerçekleştirilen tek dönüştürme küçük harfe dönüştürmedir.

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": "full",
    "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" "full" olarak ayarlanır, tam Lucene sorgu ayrıştırıcısını çağırır ve bu söz dizimi için gereklidir.

  • 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).

Alanlı arama kapsamı tek tek, belirli bir alana eklenmiş arama ifadeleri. Bu örnek, içinde "otel" terimi bulunan otel adlarını arar ancak "motel" terimini aramaz. VE kullanarak birden çok alan belirtebilirsiniz.

Bu sorgu söz dizimini kullandığınızda, sorgulamak istediğiniz alanlar arama ifadesinin içinde olduğunda parametresini atlayabilirsiniz searchFields . Alanlı aramaya eklerseniz searchFields , fieldName:searchExpression her zaman yerine searchFieldsöncelikli olur.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:(hotel NOT motel) AND Category:'Resort and Spa'",
    "queryType": "full",
    "select": "HotelName, Category",
    "count": true
}

Bu sorgunun yanıtı, "Resort and Spa" üzerinde filtrelenmiş, adında "otel" bulunan otelleri döndüren ve adında "motel" bulunan sonuçları dışlayan aşağıdaki örneğe benzer görünmelidir.

"@odata.count": 4,
"value": [
    {
        "@search.score": 4.481559,
        "HotelName": "Nova Hotel & Spa",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.4524608,
        "HotelName": "King's Palace Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.3970203,
        "HotelName": "Triple Landscape Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.2953436,
        "HotelName": "Peaceful Market Hotel & Spa",
        "Category": "Resort and Spa"
    }
]

Arama ifadesi, isteğe bağlı olarak Boole işleçleriyle tek bir terim veya tümcecik ya da parantez içinde daha karmaşık bir ifade olabilir. Bazı örnekler şunlardır:

  • HotelName:(hotel NOT motel)
  • Address/StateProvince:("WA" OR "CA")
  • Tags:("free wifi" NOT "free parking") AND "coffee in lobby"

Bu durumda Address/StateProvince alanında iki ayrı konumu ararken olduğu gibi, her iki dizenin de tek bir varlık olarak değerlendirilmesini istiyorsanız, tırnak içine bir tümcecik eklediğinizden emin olun. İstemciye bağlı olarak, tırnak işaretlerini (\) kaçış olarak kullanmanız gerekebilir.

içinde fieldName:searchExpression belirtilen alan aranabilir bir alan olmalıdır. Alan tanımlarının nasıl özniteliklendirildiğinin ayrıntıları için bkz . Dizin Oluşturma (REST API ).

Benzer arama, yanlış yazılmış sözcükler de dahil olmak üzere benzer terimlerle eşleşir. Benzer bir arama yapmak için, tek bir sözcüğün sonuna tilde ~ simgesini, düzenleme uzaklığı belirten isteğe bağlı bir parametre olan 0 ile 2 arasında bir değerle ekleyin. Örneğin, blue~ veya blue~1 mavi, mavi ve tutkal döndürür.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Tags:conserge~",
    "queryType": "full",
    "select": "HotelName, Category, Tags",
    "searchFields": "HotelName, Category, Tags",
    "count": true
}

Bu sorgunun yanıtı, eşleşen belgelerde kısalık için kırpılmış "concierge" olarak çözümlenir:

"@odata.count": 12,
"value": [
    {
        "@search.score": 1.1832147,
        "HotelName": "Secret Point Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "air conditioning",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1819803,
        "HotelName": "Twin Dome Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "free wifi",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1773309,
        "HotelName": "Smile Hotel",
        "Category": "Suite",
        "Tags": [
            "view",
            "concierge",
            "laundry service"
        ]
    },

Tümcecikler doğrudan desteklenmez, ancak gibi search=Tags:landy~ AND sevic~çok parçalı bir tümceciğin her teriminde benzer bir eşleşme belirtebilirsiniz. Bu sorgu ifadesi "çamaşırhane hizmeti" üzerinde 15 eşleşme bulur.

Not

Benzer sorgular çözümlenmez. Tamamlanmamış terimlere sahip sorgu türleri (ön ek sorgusu, joker sorgu, regex sorgusu, belirsiz sorgu) doğrudan sorgu ağacına eklenir ve analiz aşaması atlanır. Kısmi sorgu terimlerinde gerçekleştirilen tek dönüştürme, küçük harfle ifade edilir.

Yakınlık araması, belgede birbirine yakın terimleri bulur. Tümceciğin sonuna bir tilde "~" simgesi ve ardından yakınlık sınırını oluşturan sözcük sayısını ekleyin.

Bu sorgu, bir belgede birbirinin 5 sözcüğü içinde "otel" ve "havaalanı" terimlerini arar. Tümceciği korumak için tırnak işaretinden (\") çıkılır:

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Description: \"hotel airport\"~5",
    "queryType": "full",
    "select": "HotelName, Description",
    "searchFields": "HotelName, Description",
    "count": true
}

Bu sorgunun yanıtı aşağıdaki örneğe benzer görünmelidir:

"@odata.count": 2,
"value": [
    {
        "@search.score": 0.6331726,
        "HotelName": "Trails End Motel",
        "Description": "Only 8 miles from Downtown.  On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport."
    },
    {
        "@search.score": 0.43032226,
        "HotelName": "Catfish Creek Fishing Cabins",
        "Description": "Brand new mattresses and pillows.  Free airport shuttle. Great hotel for your business needs. Comp WIFI, atrium lounge & restaurant, 1 mile from light rail."
    }
]

Örnek 4: Terim artırma

Terim artırma, öne çıkarılmış terimi içeren bir belgeyi, terimi içermeyen belgelere göre daha yüksek derecelendirmeyi ifade eder. Bir terimi artırmak için, ^aradığınız terimin sonundaki bir destek faktörü (sayı) içeren şapka işaretini ( simgesi) kullanın. Yükseltme faktörü varsayılanı 1'dir ve pozitif olması gerekse de 1'den az olabilir (örneğin, 0,2). Terim artırma, puanlama profillerinin belirli terimler yerine belirli alanları artırması açısından puanlama profillerinden farklıdır.

Bu "önce" sorgusunda "plaj erişimi" araması yapın ve bir veya iki terimle eşleşen yedi belge olduğuna dikkat edin.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "beach access",
    "queryType": "full",
    "select": "HotelName, Description, Tags",
    "searchFields": "HotelName, Description, Tags",
    "count": true
}

Aslında, "erişim" ile eşleşen tek bir belge vardır ve tek eşleşme olduğundan, belgede "plaj" terimi eksik olsa bile yerleştirme yüksektir (ikinci konum).

"@odata.count": 7,
"value": [
    {
        "@search.score": 2.2723424,
        "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."
    },
    {
        "@search.score": 1.5507699,
        "HotelName": "Old Carrabelle Hotel",
        "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center."
    },
    {
        "@search.score": 1.5358944,
        "HotelName": "Whitefish Lodge & Suites",
        "Description": "Located on in the heart of the forest. Enjoy Warm Weather, Beach Club Services, Natural Hot Springs, Airport Shuttle."
    },
    {
        "@search.score": 1.3433652,
        "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."
    },

"Sonra" sorgusunda aramayı tekrarlayın ve bu kez "erişim" terimi boyunca "plaj" terimiyle sonuçları artırın. Sorgunun okunabilir bir sürümüdür search=Description:beach^2 access. İstemcinize bağlı olarak olarak %5E2ifade ^2 etmeniz gerekebilir.

"Plaj" terimini güçlendirdikten sonra Old Carrabelle Hotel'de yapılan maç altıncı sıraya iniyor.

Örnek 5: Regex

Normal ifade araması, RegExp sınıfında belgelendiği gibi eğik çizgi "/" arasındaki içeriği temel alan bir eşleşme bulur.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:/(Mo|Ho)tel/",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

Bu sorgunun yanıtı aşağıdaki örneğe benzer görünmelidir:

    "@odata.count": 22,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Days Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Triple Landscape Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Smile Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Pelham Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Sublime Cliff Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Twin Dome Motel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Nova Hotel & Spa"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },

Not

Regex sorguları çözümlenmez. Kısmi sorgu terimlerinde gerçekleştirilen tek dönüştürme, küçük harfle ifade edilir.

Birden çok () veya tek? (*) karakterli joker karakter araması için genel olarak tanınan söz dizimi kullanabilirsiniz. Lucene sorgu ayrıştırıcısının bu simgelerin bir tümcecikle değil tek bir terimle kullanılmasını desteklediğini unutmayın.

Bu sorguda , 'sc' ön ekini içeren otel adlarını arayın. Aramanın ilk karakteri olarak veya ? simgesini kullanamazsınız*.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:sc*",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

Bu sorgunun yanıtı aşağıdaki örneğe benzer görünmelidir:

    "@odata.count": 2,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scottish Inn"
        }
    ]

Not

Joker karakter sorguları çözümlenmez. Kısmi sorgu terimlerinde gerçekleştirilen tek dönüştürme, küçük harfle ifade edilir.

Sonraki adımlar

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: