Részleges kifejezéskeresés és minták speciális karakterekkel (kötőjelek, helyettesítő karakterek, regex, minták)

A részleges kifejezéskeresés kifejezéstöredékekből álló lekérdezésekre utal, ahol egy teljes kifejezés helyett csak a kifejezés elején, közepén vagy végén (más néven előtag-, infix- vagy utótaglekérdezésekben) szerepelhet. A részleges kifejezéskeresés tartalmazhat töredékek kombinációját, gyakran speciális karakterekkel, például kötőjelekkel, kötőjelekkel vagy perjelekkel, amelyek a lekérdezési sztring részét képezik. A gyakori használati esetek közé tartoznak a telefonszámok, URL-címek, kódok vagy kötőjeles összetett szavak részei.

A részleges kifejezések és speciális karakterek akkor lehetnek problémásak, ha az index nem rendelkezik olyan jogkivonattal, amely a keresni kívánt szövegrészletet jelöli. Az indexelés lexikális elemzési fázisában (az alapértelmezett standard elemzőt feltételezve) a speciális karakterek elvetése, az összetett szavak felosztása és a szóközök törlése történik. Ha a lexikális elemzés során módosított szövegrészletet keres, a lekérdezés meghiúsul, mert nem található egyezés. Vegyük ezt a példát: a (tokenized as "1", "425", "703") "6214"nevű +1 (425) 703-6214 telefonszám nem jelenik meg egy "3-62" lekérdezésben, mert ez a tartalom valójában nem létezik az indexben.

A megoldás egy olyan elemző meghívása az indexelés során, amely megőrzi a teljes sztringet, szükség esetén szóközöket és speciális karaktereket is, hogy a szóközöket és karaktereket belefoglalhassa a lekérdezési sztringbe. A teljes, nem hitelesített sztring lehetővé teszi a "kezdő" vagy a "végződés" lekérdezések mintaegyeztetését, ahol a megadott minta kiértékelhető egy olyan kifejezéssel, amelyet nem alakít át lexikális elemzés.

Ha támogatnia kell az elemzett és nem elemzett tartalmakat hívó keresési forgatókönyveket, érdemes lehet létrehoznia két mezőt az indexben, egyet az egyes forgatókönyvekhez. Egy mező lexikális elemzésen megy keresztül. A második mező egy érintetlen sztringet tárol egy tartalommegőrző elemző használatával, amely teljes sztring jogkivonatokat bocsát ki a mintaegyezéshez.

Az Azure AI Search teljes jogkivonatos kifejezéseket keres az indexben, és nem talál egyezést részleges kifejezésen, kivéve, ha helyettesítő helyőrző operátorokat (* és ?) tartalmaz, vagy normál kifejezésként formázza a lekérdezést.

A részleges kifejezések a következő technikákkal vannak megadva:

  • A reguláris kifejezés-lekérdezések bármely olyan reguláris kifejezés lehetnek, amely az Apache Lucene alatt érvényes.

  • Az előtagegyezéssel rendelkező helyettesítő karakterek olyan általánosan felismert mintára utalnak, amely magában foglalja egy kifejezés kezdetét, amelyet utótag-operátorok követnek *? , például search=cap* a "Cap'n Jack's Waterfront Inn" vagy a "Gacc Capital". Az előtagok egyeztetése egyszerű és teljes Lucene lekérdezési szintaxisban is támogatott.

  • Az infixet és utótagot egyező helyettesítő karakterek a ?* kifejezésen belül vagy a kifejezés elején helyezik el, és normál kifejezésszintaxisra van szükség (ahol a kifejezés perjelekkel van elzárva). A lekérdezési sztring (search=/.*numeric.*/) például az "alfanumerikus" és az "alfanumerikus" eredményt adja vissza utótagként és infixként.

A reguláris kifejezés, a helyettesítő karakterek és a homályos keresés esetén az elemzők nem használhatók a lekérdezési időpontban. Ezen lekérdezési űrlapok esetében, amelyeket az elemző operátorok és elválasztók jelenlétével észlel, a rendszer lexikális elemzés nélkül továbbítja a lekérdezési sztringet a motornak. Ezen lekérdezési űrlapok esetében a mezőn megadott elemző figyelmen kívül lesz hagyva.

Feljegyzés

Ha egy részleges lekérdezési sztring karaktereket( például perjeleket) tartalmaz egy URL-töredékben, előfordulhat, hogy fel kell vennie a feloldó karaktereket. A JSON-ban az előre perjel / egy hátrafelé fordított perjellel \szökik meg. search=/.*microsoft.com\/azure\/.*/ Ezért a "microsoft.com/azure/" URL-töredék szintaxisa.

Részleges/mintakeresési problémák megoldása

Ha töredékeket, mintákat vagy speciális karaktereket kell keresnie, felülbírálhatja az alapértelmezett elemzőt egy olyan egyéni elemzővel, amely egyszerűbb tokenizálási szabályok szerint működik, és megtartja a teljes sztringet az indexben.

A megközelítés a következőképpen néz ki:

  1. Adjon meg egy második mezőt a sztring ép verziójának tárolásához (feltéve, hogy elemezni és nem elemezni szeretné a szöveget a lekérdezési időpontban)
  2. Értékelje ki és válassza ki azokat a különböző elemzőket, amelyek a megfelelő részletességi szinten bocsátanak ki jogkivonatokat
  3. Az elemző hozzárendelése a mezőhöz
  4. Az index létrehozása és tesztelése

1 – Dedikált mező létrehozása

Az elemzők határozzák meg, hogyan vannak tokenizálva a kifejezések egy indexben. Mivel az elemzők mezőnként vannak hozzárendelve, létrehozhat mezőket az indexben a különböző forgatókönyvekhez való optimalizáláshoz. Definiálhatja például a "featureCode" és a "featureCodeRegex" kifejezést, hogy támogassa a normál teljes szöveges keresést az elsőn, a másodikon pedig speciális mintaegyezést. Az egyes mezőkhöz rendelt elemzők határozzák meg, hogy az egyes mezők tartalma hogyan van tokenizálva az indexben.

{
  "name": "featureCode",
  "type": "Edm.String",
  "retrievable": true,
  "searchable": true,
  "analyzer": null
},
{
  "name": "featureCodeRegex",
  "type": "Edm.String",
  "retrievable": true,
  "searchable": true,
  "analyzer": "my_custom_analyzer"
},

2 – Elemző beállítása

Ha olyan elemzőt választ, amely egész távú jogkivonatokat hoz létre, az alábbi elemzők gyakori lehetőségek:

Elemző Viselkedésmódok
nyelvelemzők Megőrzi a kötőjeleket összetett szavakban vagy sztringekben, magánhangzó-mutációkban és igealakokban. Ha a lekérdezési minták kötőjeleket tartalmaznak, a nyelvelemző használata elegendő lehet.
Kulcsszó A teljes mező tartalma egyetlen kifejezésként van tokenizálva.
Szóköz Csak a fehér helyeken különválaszt. A kötőjeleket vagy más karaktereket tartalmazó kifejezések egyetlen jogkivonatként lesznek kezelve.
egyéni elemző (ajánlott) Az egyéni elemzők létrehozásával megadhatja a tokenizert és a jogkivonatszűrőt is. Az előző elemzőket használatban kell használni. Az egyéni elemzők segítségével kiválaszthatja, hogy mely jogkivonat-elemzőket és jogkivonatszűrőket használja.

Az ajánlott kombináció a kisbetűs jogkivonat-szűrővel rendelkező kulcsszó-jogkivonat-szűrő. A beépített kulcsszóelemző önmagában nem kisbetűs szöveg, ami a lekérdezések sikertelenségéhez vezethet. Az egyéni elemzők az kisbetűs jogkivonatszűrő hozzáadásának mechanizmusát biztosítják.

REST-ügyfél használatával hozzáadhatja a Test Analyzer REST-hívást a jogkivonatos kimenet vizsgálatához.

Az indexnek léteznie kell a keresési szolgáltatásban, de üres lehet. Egy meglévő index és egy kötőjeleket vagy részleges kifejezéseket tartalmazó mező alapján különböző elemzőket próbálhat ki adott kifejezéseken keresztül, hogy lássa, milyen jogkivonatokat bocsát ki.

  1. Először ellenőrizze a Standard elemzőt, hogy alapértelmezés szerint hogyan vannak tokenizálva a kifejezések.

    {
    "text": "SVP10-NOR-00",
    "analyzer": "standard"
    }
    
  2. A válasz kiértékelése annak megtekintéséhez, hogy a szöveg hogyan van tokenizálva az indexen belül. Figyelje meg, hogyan történik az egyes kifejezések kisbetűssé alakítása, a kötőjelek eltávolítása és az egyes jogkivonatokra bontott részszúrások. Csak az ezeken a jogkivonatokon egyező lekérdezések fogják visszaadni ezt a dokumentumot az eredményekben. A "10-NOR" szöveget tartalmazó lekérdezés sikertelen lesz.

    {
        "tokens": [
            {
                "token": "svp10",
                "startOffset": 0,
                "endOffset": 5,
                "position": 0
            },
            {
                "token": "nor",
                "startOffset": 6,
                "endOffset": 9,
                "position": 1
            },
            {
                "token": "00",
                "startOffset": 10,
                "endOffset": 12,
                "position": 2
            }
        ]
    }
    
  3. Most módosítsa a kérést az elemző vagy keyword az whitespace elemző használatára:

    {
    "text": "SVP10-NOR-00",
    "analyzer": "keyword"
    }
    
  4. A válasz ezúttal egyetlen, nagybetűs jogkivonatból áll, a sztring részeként megőrzött kötőjelekkel. Ha egy mintán vagy egy részleges kifejezésen (például "10-NOR" kifejezésen) kell keresnie, a lekérdezési motornak most már megvan az alapja egyezés megtalálásához.

    {
    
        "tokens": [
            {
                "token": "SVP10-NOR-00",
                "startOffset": 0,
                "endOffset": 12,
                "position": 0
            }
        ]
    }
    

Fontos

Vegye figyelembe, hogy a lekérdezéselemzők gyakran kisbetűs kifejezéseket a keresési kifejezésekben a lekérdezési fa létrehozásakor. Ha olyan elemzőt használ, amely nem ad kisbetűs szövegbevitelt az indexelés során, és nem kapja meg a várt eredményeket, ez lehet az oka. A megoldás egy kisbetűs jogkivonat-szűrő hozzáadása az alábbi "Egyéni elemzők használata" című szakaszban leírtak szerint.

3 – Elemző konfigurálása

Akár kiértékeli az elemzőket, akár előrehalad egy adott konfigurációval, meg kell adnia az elemzőt a meződefinícióban, és esetleg magát az elemzőt is konfigurálnia kell, ha nem használ beépített elemzőt. Az elemzők felcserélésekor általában újra kell építeni az indexet (elvetni, újra létrehozni és újra betölteni).

Beépített elemzők használata

A beépített elemzők név alapján adhatók meg egy analyzer meződefiníció tulajdonságán, és nincs szükség további konfigurálásra az indexben. Az alábbi példa bemutatja, hogyan állíthatja be az elemzőt whitespace egy mezőre.

Más forgatókönyvek esetén és az egyéb beépített elemzőkről további információt a beépített elemzők című témakörben talál.

    {
      "name": "phoneNumber",
      "type": "Edm.String",
      "key": false,
      "retrievable": true,
      "searchable": true,
      "analyzer": "whitespace"
    }

Egyéni elemzők használata

Ha egyéni elemzőt használ, definiálja azt az indexben a tokenizer felhasználó által definiált kombinációjával, a tokenszűrővel és a lehetséges konfigurációs beállításokkal. Ezután hivatkozzon rá egy meződefinícióra, ugyanúgy, mint egy beépített elemzőre.

Ha a cél a teljes távú jogkivonat-felismerés, ajánlott egy kulcsszó-jogkivonat-jelölőből és kisbetűs jogkivonat-szűrőből álló egyéni elemző.

  • A kulcsszó jogkivonat-létrehozója egyetlen tokent hoz létre egy mező teljes tartalmához.
  • A kisbetűs jogkivonat-szűrő kisbetűkké alakítja át a nagybetűket. A lekérdezéselemzők általában kisbetűssé alakítják a nagybetűs szövegbeviteleket. Az alsó burkolat homogenizálja a bemeneteket a tokenizált kifejezésekkel.

Az alábbi példa egy egyéni elemzőt mutat be, amely a kulcsszó jogkivonat-kezelőt és egy kisbetűs jogkivonat-szűrőt biztosít.

{
"fields": [
  {
  "name": "accountNumber",
  "analyzer":"myCustomAnalyzer",
  "type": "Edm.String",
  "searchable": true,
  "filterable": true,
  "retrievable": true,
  "sortable": false,
  "facetable": false
  }
],

"analyzers": [
  {
  "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
  "name":"myCustomAnalyzer",
  "charFilters":[],
  "tokenizer":"keyword_v2",
  "tokenFilters":["lowercase"]
  }
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": []
}

Feljegyzés

A keyword_v2 jogkivonat-kezelő és lowercase a jogkivonat-szűrő ismert a rendszer számára, és az alapértelmezett konfigurációkat használja, ezért név szerint hivatkozhat rájuk anélkül, hogy először meg kellene határoznia őket.

4 – Buildelés és tesztelés

Miután definiált egy indexet a forgatókönyvet támogató elemzőkkel és meződefiníciókkal, töltse be a reprezentatív sztringekkel rendelkező dokumentumokat, hogy tesztelhesse a részleges sztringes lekérdezéseket.

REST-ügyfél használatával lekérdezheti a cikkben ismertetett részleges kifejezéseket és speciális karaktereket.

Az előző szakaszok elmagyarázták a logikát. Ez a szakasz végigvezeti a megoldás tesztelése során meghívandó API-kon.

  • Az Index törlése eltávolít egy azonos nevű meglévő indexet, hogy újra létre tudja hozni.

  • Az Index létrehozása létrehozza a keresési szolgáltatás indexstruktúráját, beleértve az elemződefiníciókat és az elemző specifikációval rendelkező mezőket.

  • A Dokumentumok betöltése olyan dokumentumokat importál, amelyek struktúrája megegyezik az indexével, valamint kereshető tartalommal. A lépés után az index készen áll a lekérdezésre vagy tesztelésre.

  • A Test Analyzer a Set an analyzer (Elemző beállítása) című témakörben jelent meg. Tesztelje az index egyes sztringeit különböző elemzők használatával a kifejezések jogkivonatos használatának megértéséhez.

  • A keresési dokumentumok bemutatja, hogyan hozhat létre lekérdezési kérést egyszerű szintaxissal vagy teljes Lucene szintaxissal helyettesítő karakterek és reguláris kifejezések esetében.

    Részleges kifejezéses lekérdezésekhez, például a "3-6214" lekérdezéshez, hogy találjon egyezést a következőn: "+1 (425) 703-6214", használhatja az egyszerű szintaxist: search=3-6214&queryType=simple.

    Az infix- és utótag-lekérdezésekhez, például a "szám" vagy a "numerikus" lekérdezéshez használja a teljes Lucene szintaxist és egy reguláris kifejezést: search=/.*num.*/&queryType=full

Lekérdezési teljesítmény finomhangolása

Ha a keyword_v2 tokenizert és a kisbetűs jogkivonatszűrőt tartalmazó ajánlott konfigurációt implementálja, akkor a lekérdezési teljesítmény csökkenhet, mivel az index meglévő tokenjeihez képest további jogkivonatszűrő-feldolgozás történik.

Az alábbi példa egy EdgeNGramTokenFiltert ad hozzá, hogy az előtag gyorsabb legyen. A jogkivonatok 2–25 karakterkombinációban jönnek létre, amelyek karaktereket tartalmaznak. Íme egy példa a két-hét jogkivonat közötti progresszióra: MS, MSF, MSFT, MSFT/, MSFT/S, MSFT/SQ, MSFT/SQL.

A további tokenizálás nagyobb indexet eredményez. Ha elegendő kapacitással rendelkezik a nagyobb index elhelyezéséhez, ez a gyorsabb válaszidővel rendelkező megközelítés lehet a legjobb megoldás.

{
"fields": [
  {
  "name": "accountNumber",
  "analyzer":"myCustomAnalyzer",
  "type": "Edm.String",
  "searchable": true,
  "filterable": true,
  "retrievable": true,
  "sortable": false,
  "facetable": false
  }
],

"analyzers": [
  {
  "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
  "name":"myCustomAnalyzer",
  "charFilters":[],
  "tokenizer":"keyword_v2",
  "tokenFilters":["lowercase", "my_edgeNGram"]
  }
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": [
  {
  "@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
  "name":"my_edgeNGram",
  "minGram": 2,
  "maxGram": 25,
  "side": "front"
  }
]
}

Következő lépések

Ez a cikk azt ismerteti, hogy az elemzők hogyan járulnak hozzá a lekérdezési problémákhoz és hogyan oldják meg a lekérdezési problémákat. Következő lépésként tekintse meg közelebbről az indexelést és a lekérdezésfeldolgozást befolyásoló elemzőket.