Megosztás a következőn keresztül:


Példák a "teljes" Lucene-keresés szintaxisára (speciális lekérdezések az Azure AI Searchben)

Az Azure AI Search lekérdezéseinek létrehozásakor az alapértelmezett egyszerű lekérdezéselemzőt lecserélheti a hatékonyabb Lucene lekérdezéselemzőre , hogy speciális és speciális lekérdezési kifejezéseket fogalmazzon meg.

A Lucene-elemző támogatja az összetett lekérdezési formátumokat, például a mezőalapú lekérdezéseket, a homályos keresést, az infixet és az utótagot helyettesítő karakterek keresését, a közelségi keresést, a kifejezéskiemelést és a reguláris kifejezéskeresést. Az extra teljesítmény több feldolgozási követelményeket is tartalmaz, ezért valamivel hosszabb végrehajtási időre kell számítania. Ebben a cikkben a lekérdezési műveleteket bemutató példákat mutat be teljes szintaxis alapján.

Feljegyzés

A teljes Lucene-lekérdezésszintaxison keresztül engedélyezett speciális lekérdezési szerkezetek közül sok nem végez szövegelemzést, ami meglepő lehet, ha a lemmatizálásra vagy a lemmatizálásra számít. A lexikális elemzés csak teljes kifejezéseken (kifejezés- vagy kifejezéskeresésen) történik. A hiányos kifejezéseket tartalmazó lekérdezéstípusok (előtag lekérdezés, helyettesítő lekérdezés, regex lekérdezés, homályos lekérdezés) közvetlenül a lekérdezésfához lesznek hozzáadva, megkerülve az elemzési szakaszt. A részleges lekérdezési feltételekkel végrehajtott egyetlen átalakítás az alsóbb réteg.

Hotelek mintaindexe

A következő lekérdezések a hotels-sample-indexen alapulnak, amelyeket az ebben a rövid útmutatóban található utasítások követésével hozhat létre.

A példa-lekérdezések a REST API és a POST kérések használatával vannak tagoltan. Beillesztheti és futtathatja őket egy REST-ügyfélben. Vagy használja a Search Explorer JSON-nézetét az Azure Portalon. JSON nézetben beillesztheti a cikkben bemutatott lekérdezési példákat.

A kérelemfejléceknek a következő értékekkel kell rendelkezniük:

Kulcs Érték
Content-Type application/json
api-key <your-search-service-api-key>, lekérdezés vagy rendszergazdai kulcs

Az URI-paramétereknek tartalmazniuk kell a keresési szolgáltatás végpontját az index nevével, a dokumentumgyűjteményekkel, a keresési paranccsal és az API-verzióval, az alábbi példához hasonlóan:

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

A kérelem törzsének érvényes JSON-ként kell létrejönnie:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • A "keresés" egy * meghatározatlan lekérdezés, amely null értékű vagy üres keresésnek felel meg. Ez nem különösen hasznos, de ez a legegyszerűbben elvégezhető keresés, és az index összes beolvasható mezőjét megjeleníti az összes értékkel együtt.

  • A "queryType" a "full" értékre állítva meghívja a teljes Lucene lekérdezéselemzőt, és ez szükséges ehhez a szintaxishoz.

  • A "select" vesszővel tagolt mezőlistára van állítva a keresési eredmények összetételéhez, beleértve a keresési eredmények kontextusában hasznos mezőket is.

  • A "count" a keresési feltételeknek megfelelő dokumentumok számát adja vissza. Üres keresési sztring esetén a szám az index összes dokumentuma (50 a hotels-sample-indexben).

A mezőalapú keresési hatókör egyedi, beágyazott keresési kifejezések egy adott mezőre. Ez a példa olyan szállodaneveket keres, amelyben a "hotel" kifejezés szerepel, de nem a "motel" kifejezéssel. Az AND használatával több mezőt is megadhat.

Ha ezt a lekérdezési szintaxist használja, kihagyhatja a searchFields paramétert, ha a lekérdezni kívánt mezők magukban a keresési kifejezésben találhatók. Ha mezőalapú kereséssel is szerepel searchFields , az fieldName:searchExpression mindig elsőbbséget élvez a mezőalapú kereséssel szemben searchFields.

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
}

A lekérdezésre adott válasznak a következő példához hasonlóan kell kinéznie, szűrve a "Resort and Spa" kifejezésre, és olyan szállodákat ad vissza, amelyekben szerepel a "hotel" a névben, és kizárja azokat az eredményeket, amelyekben szerepel a "motel" a névben.

"@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"
    }
]

A keresési kifejezés lehet egy kifejezés, egy kifejezés, vagy egy összetettebb kifejezés zárójelben, opcionálisan logikai operátorokkal. Néhány példa a következőkre:

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

Ügyeljen arra, hogy idézőjelek közé tegyen egy kifejezést, ha mindkét sztringet egyetlen entitásként szeretné kiértékelni, mivel ebben az esetben a Cím/Állapotprovince mezőben két különböző helyet keres. Az ügyféltől függően előfordulhat, hogy el kell menekülnie (\) az idézőjelek elől.

A megadott fieldName:searchExpression mezőnek kereshető mezőnek kell lennie. A meződefiníciók attribútumának részleteiért tekintse meg az Index létrehozása (REST API) című témakört.

A homályos keresés hasonló kifejezéseket tartalmaz, beleértve a hibásan írt szavakat is. Ha nem megfelelő keresést szeretne végezni, fűzze hozzá a tilde ~ szimbólumot egyetlen szó végén egy választható paraméterrel, egy 0 és 2 közötti értékkel, amely megadja a szerkesztési távolságot. Például kéket, blue~blue~1 kéket és ragasztót ad vissza.

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
}

A lekérdezésre adott válasz "concierge" lesz a megfelelő dokumentumokban, a rövidség kedvéért levágva:

"@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"
        ]
    },

A kifejezések közvetlenül nem támogatottak, de megadhat egy homályos egyezést egy többrészes kifejezés minden egyes kifejezésére, például search=Tags:landy~ AND sevic~. Ez a lekérdezési kifejezés 15 találatot talál a "mosodai szolgáltatásban".

Feljegyzés

A rendszer nem elemzi a homályos lekérdezéseket. A hiányos kifejezéseket tartalmazó lekérdezéstípusok (előtag lekérdezés, helyettesítő lekérdezés, regex lekérdezés, homályos lekérdezés) közvetlenül a lekérdezésfához lesznek hozzáadva, megkerülve az elemzési szakaszt. A részleges lekérdezési feltételekkel végrehajtott egyetlen átalakítás az alacsonyabb casing.

A közelségi keresés megkeresi a dokumentumban egymáshoz közeli kifejezéseket. Szúrjon be egy tilde "~" szimbólumot egy kifejezés végére, amelyet a közelségi határt létrehozó szavak száma követ.

Ez a lekérdezés egy dokumentumban egymástól 5 szó alatt megkeresi a "hotel" és a "repülőtér" kifejezést. Az idézőjelek () a következő kifejezés megőrzése érdekében kerülnek ki\":

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
}

A lekérdezésre adott válasznak az alábbi példához hasonlóan kell kinéznie:

"@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."
    }
]

4. példa: Kifejezésnövelés

A kifejezésnövelés azt jelenti, hogy egy dokumentumot magasabbra rangsorolt, ha a kiemelt kifejezést tartalmazza, a nem a kifejezést tartalmazó dokumentumokhoz képest. Egy kifejezés kiemeléséhez használja a caret , ^szimbólumot a keresett kifejezés végén egy kiemelési tényezővel (számmal). A boost factor default értéke 1, és bár pozitívnak kell lennie, 1-nél kisebb lehet (például 0,2). A kifejezésnövelés abban különbözik a pontozási profiloktól, hogy a pontozási profilok adott kifejezések helyett bizonyos mezőket emelnek ki.

Ebben a "korábbi" lekérdezésben keressen rá a "strandhozzáférés" kifejezésre, és figyelje meg, hogy hét dokumentum felel meg egy vagy mindkét kifejezésnek.

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
}

Valójában csak egy dokumentum egyezik a "hozzáféréssel", és mivel ez az egyetlen egyezés, az elhelyezés magas (második pozíció), annak ellenére, hogy a dokumentumból hiányzik a "strand" kifejezés.

"@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."
    },

Az "after" lekérdezésben ismételje meg a keresést, ezúttal a "strand" kifejezéssel a "hozzáférés" kifejezéssel növelve az eredményeket. A lekérdezés egy emberi olvasásra alkalmas verziója.search=Description:beach^2 access Az ügyféltől függően előfordulhat, hogy ki kell fejeznie ^2 a következőképpen: %5E2.

A "strand" kifejezés kiemelése után az Old Carrabelle Hotel meccse a hatodik helyre kerül.

5. példa: Regex

A reguláris kifejezéskeresések a RegExp osztályban dokumentált perjelek (/) közötti tartalom alapján keresnek egyezést.

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

A lekérdezésre adott válasznak az alábbi példához hasonlóan kell kinéznie:

    "@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"
        },

Feljegyzés

A Regex-lekérdezések nem lesznek elemezve. A részleges lekérdezési feltételekkel végrehajtott egyetlen átalakítás az alacsonyabb casing.

Általánosan felismert szintaxist használhat több (*) vagy egy (?) karakteres helyettesítő karakter kereséséhez. Vegye figyelembe, hogy a Lucene lekérdezéselemző egyetlen kifejezéssel, nem pedig kifejezéssel támogatja ezeknek a szimbólumoknak a használatát.

Ebben a lekérdezésben keressen olyan szállodaneveket, amelyek tartalmazzák az "sc" előtagot. Nem használhat szimbólumot vagy ? szimbólumot * a keresés első karaktereként.

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

A lekérdezésre adott válasznak az alábbi példához hasonlóan kell kinéznie:

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

Feljegyzés

A helyettesítő lekérdezések nem lesznek elemezve. A részleges lekérdezési feltételekkel végrehajtott egyetlen átalakítás az alacsonyabb casing.

Következő lépések

Próbálja meg kódban megadni a lekérdezéseket. Az alábbi hivatkozás bemutatja, hogyan állíthat be keresési lekérdezéseket az Azure SDK-k használatával.

További szintaxishivatkozások, lekérdezési architektúra és példák az alábbi hivatkozásokon találhatók: