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).
1. példa: Mezős keresés
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.
2. példa: Homályos keresés
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.
3. példa: Közelségi keresés
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.
6. példa: Helyettesítő karakterek keresése
Á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: