Částečné vyhledávání termínů a vzory se speciálními znaky (spojovníky, zástupné znaky, regulární výrazy, vzory)

Poznámka:

Azure AI Vyhledávač je k dispozici prostřednictvím portálu Azure, rozhraní REST API a Sady Azure SDK. Podporuje také Foundry IQ, spravovanou znalostní vrstvu, která transformuje podnikový obsah na opakovaně použitelné znalostní báze s podporou oprávnění pro agenty na portálu Microsoft Foundry.

Částečné hledání termínů odkazuje na dotazy, které se skládají z fragmentů termínů, kde místo celého termínu můžete mít jenom začátek, střed nebo konec termínu (někdy označované jako předpona, oprava nebo dotazy na příponu). Částečné hledání termínů může zahrnovat kombinaci fragmentů, často se speciálními znaky, jako jsou spojovníky, pomlčky nebo lomítka, které jsou součástí řetězce dotazu. Mezi běžné případy použití patří části telefonního čísla, adresy URL, kódů nebo složených slov s dělením slov.

Částečné termíny a speciální znaky můžou být problematické, pokud index neobsahuje token představující fragment textu, který chcete vyhledat. Během fáze lexikální analýzy indexování klíčových slov (za předpokladu výchozího standardního analyzátoru) se speciální znaky zahodí, složená slova se rozdělí a prázdné znaky se odstraní. Pokud hledáte fragment textu, který byl změněn během lexikální analýzy, dotaz selže, protože nebyla nalezena žádná shoda. Představte si tento příklad: telefonní číslo jako +1 (425) 703-6214 (tokenizované jako "1", "425", "703", "6214") se v "3-62" dotazu nezobrazí, protože tento obsah ve skutečnosti v indexu neexistuje.

Řešením je vyvolat analyzátor během indexování, který zachovává úplný řetězec, včetně mezer a speciálních znaků v případě potřeby, abyste mohli do řetězce dotazu zahrnout mezery a znaky. Pokud máte celý, netokenizovaný řetězec, umožňuje vyhledávání podle vzorů pro dotazy "začíná" nebo "končí," kde se vzor, který zadáte, vyhodnocuje vůči výrazu, který není transformován lexikální analýzou.

Pokud potřebujete podporovat scénáře hledání, které volají analyzovaný a neanalyzovaný obsah, zvažte vytvoření dvou polí v indexu, jedno pro každý scénář. Jedno pole prochází lexikální analýzou. Druhé pole ukládá nedotčený řetězec pomocí analyzátoru zachování obsahu, který generuje tokeny celého řetězce pro porovnávání vzorů.

Azure AI Vyhledávač vyhledává v indexu celé tokenizované termíny a nenajde shodu u částečného termínu, pokud nezadáte zástupné symboly (* a ?) nebo nenaforomatujete dotaz jako regulární výraz.

Částečné termíny se zadají pomocí těchto technik:

  • Dotazy regulárních výrazů můžou být libovolný regulární výraz, který je platný v rámci Apache Lucene.

  • Operátory se zástupnými znaky s porovnáváním předpon označují obecně uznávaný vzor, který zahrnuje začátek termínu, následovaný příponovými operátory * nebo ?, zahrnující párování, jako je například u "Cap'n Jack's Waterfront Inn" nebo "Highline Capital". Porovnávání předpon se podporuje v jednoduché i úplné syntaxi dotazů Lucene.

  • Zástupný znak s infixovým a příponovým porovnáváním umisťuje operátory *? uvnitř nebo na začátku termínu a vyžaduje syntaxi regulárního výrazu (kde je výraz uzavřen mezi lomítka). Například řetězec dotazu (search=/.*numeric.*/) vrátí výsledky "alfanumerické" a "alfanumerické" jako přípony a shody infixu.

V případě regulárního výrazu, zástupných znaků a přibližných vyhledávání se analyzátory v době dotazu nepoužívají. U těchto formulářů dotazu, které analyzátor detekuje přítomností operátorů a oddělovačů, se řetězec dotazu předá modulu bez lexikální analýzy. U těchto formulářů dotazu se analyzátor zadaný v poli ignoruje.

Poznámka:

Pokud částečný řetězec dotazu obsahuje znaky, jako jsou lomítka v fragmentu adresy URL, budete možná muset přidat řídicí znaky. Ve formátu JSON je lomítko / ošetřeno zpětným lomítkem \. Syntaxí fragmentu adresy URL je tedy search=/.*microsoft.com\/azure\/.*/ "microsoft.com/azure/".

Vzhledem k tomu, že samotný termín dotazu není analyzován, odpovídá doslova indexu, takže dotaz, jako Contoso* by mohl vrátit nulové výsledky, pokud analyzátor indexuje obsah malými písmeny. Další informace najdete v článku Vliv analyzátoru na dotazy se zástupnými znaky.

Řešení problémů s částečným vyhledáváním a vyhledáváním podle vzoru

Pokud potřebujete hledat fragmenty nebo vzory nebo speciální znaky, můžete výchozí analyzátor přepsat vlastním analyzátorem, který funguje v rámci jednodušších pravidel tokenizace a zachovat celý řetězec v indexu.

Přístup vypadá takto:

  1. Definujte druhé pole pro uložení nedotčené verze řetězce (za předpokladu, že chcete analyzovaný i neanalyzovaný text v době dotazu).
  2. Vyhodnoťte a zvolte mezi různými analyzátory, které generují tokeny na správné úrovni granulace
  3. Přiřazení analyzátoru k poli
  4. Sestavení a otestování indexu

1. Vytvoření vyhrazeného pole

Analyzátory určují, jak se termíny tokenizují v indexu. Vzhledem k tomu, že se analyzátory přiřazují pro jednotlivá pole, můžete v indexu vytvořit pole pro optimalizaci pro různé scénáře. Můžete například definovat "featureCode" a "featureCodeRegex" pro podporu běžného fulltextového vyhledávání na prvním a rozšířené porovnávání vzorů na druhém. Analyzátory přiřazené jednotlivým polím určují, jak se obsah jednotlivých polí tokenizuje v indexu.

{
  "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. Nastavení analyzátoru

Při výběru analyzátoru, který vytváří tokeny celého termínu, jsou běžné volby následujících analyzátorů:

Analyzátor Chování
analyzátory jazyka Zachovává spojovníky ve složených slovech nebo řetězcích, samohláskách a slovesných formách. Pokud vzory dotazů obsahují pomlčky, může být použití analyzátoru jazyka dostatečné.
klíčové slovo Obsah celého pole se tokenizuje jako jeden termín.
prázdné místo Odděluje pouze na prázdných místech. Termíny, které obsahují pomlčky nebo jiné znaky, se považují za jeden token.
vlastní analyzátor (doporučeno) Vytvoření vlastního analyzátoru umožňuje zadat tokenizátor i filtr tokenů. Předchozí analyzátory musí být použity tak, jak jsou. Vlastní analyzátor umožňuje vybrat, které tokenizátory a filtry tokenů se mají použít.

Doporučená kombinace je tokenizér klíčových slov s filtrem transformující tokeny na malá písmena. Integrovaný analyzátor klíčových slov sám o sobě nepřevede žádný text napsaný velkými písmeny na malá písmena, což může způsobit selhání dotazů. Vlastní analyzátor poskytuje mechanismus pro přidání filtru tokenů s menším písmenem.

Pomocí klienta REST můžete přidat volání REST analyzátoru testů pro kontrolu tokenizovaného výstupu.

Index musí existovat ve vyhledávací službě, ale může být prázdný. Vzhledem k existujícímu indexu a poli obsahujícímu pomlčky nebo částečné termíny můžete vyzkoušet různé analyzátory konkrétních termínů a zjistit, jaké tokeny se vygenerují.

  1. Nejprve zkontrolujte standardní analyzátor a zjistěte, jak se termíny tokenizují ve výchozím nastavení.

    {
    "text": "SVP10-NOR-00",
    "analyzer": "standard"
    }
    
  2. Vyhodnoťte odpověď a podívejte se, jak se text tokenizuje v indexu. Všimněte si, jak jsou jednotlivé termíny převedeny na malá písmena, spojovníky odstraněny, a dílčí řetězce rozděleny do jednotlivých tokenů. Ve výsledcích vrátí tento dokument pouze dotazy, které odpovídají těmto tokenům. Dotaz, který obsahuje "10-NOR", selže.

    {
        "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. Teď upravte požadavek tak, aby používal analyzátor whitespace nebo keyword:

    {
    "text": "SVP10-NOR-00",
    "analyzer": "keyword"
    }
    
  4. Odpověď se tentokrát skládá z jednoho tokenu ve velikých písmenech, přičemž pomlčky se zachovají jako součást řetězce. Pokud potřebujete vyhledat vzor nebo částečný termín, například "10-NOR", má dotazovací modul teď základ pro vyhledání shody.

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

Důležité

Mějte na paměti, že při vytváření stromu dotazu analyzátory dotazů často převádějí výrazy na malá písmena. Pokud používáte analyzátor, který během indexování nedává textové vstupy s menším písmenem a neočekáváte očekávané výsledky, může to být důvod. Řešením je přidat filtr tokenů s menším písmenem, jak je popsáno v části Použití vlastních analyzátorů níže.

3. Konfigurace analyzátoru

Ať už vyhodnocujete analyzátory, nebo přecházíte k určité konfiguraci, budete muset určit analyzátor ve definici pole a případně nakonfigurovat samotný analyzátor, pokud nepoužíváte vestavěný analyzátor. Při výměně analyzátorů obvykle potřebujete znovu sestavit index (smazat, vytvořit a načíst).

Použití integrovaných analyzátorů

Integrované analyzátory je možné zadat podle názvu pomocí vlastnosti analyzer v definici pole, a to bez nutnosti další konfigurace indexu. Následující příklad ukazuje, jak byste nastavili whitespace analyzátor v poli.

Pro další scénáře a více informací o integrovaných analyzátorech viz Integrované analyzátory.

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

Použití vlastních analyzátorů

Pokud používáte vlastní analyzátor, definujte ho v indexu pomocí uživatelsky definované kombinace tokenizátoru, filtru tokenů s možným nastavením konfigurace. Dále jej použijte v definici pole, stejně jako byste použili vestavěný analyzátor.

Pokud je cílem tokenizace celého termínu, doporučuje se vlastní analyzátor, který se skládá z tokenizátoru klíčových slov a filtru tokenů s menším písmenem.

  • Tokenizátor klíčových slov vytvoří jeden token pro celý obsah pole.
  • Filtr tokenů s malými písmeny transformuje velká písmena na text s malými písmeny. Analyzátory dotazů obvykle převádějí textové vstupy z velkých písmen na malá. Převod na malá písmena sjednocuje vstupy s tokenizovanými termíny.

Následující příklad ukazuje vlastní analyzátor, který poskytuje tokenizátor klíčových slov a filtr tokenů malými písmeny.

{
"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": []
}

Poznámka:

Tokenizátor keyword_v2 a lowercase filtr tokenů jsou známé systému a používají jejich výchozí konfigurace, proto na ně můžete odkazovat podle názvu, aniž byste je museli definovat jako první.

4. Sestavení a testování

Po definování indexu s analyzátory a definicemi polí, které podporují váš scénář, načtěte dokumenty s reprezentativními řetězci, abyste mohli testovat částečné řetězcové dotazy.

K dotazování částečných termínů a speciálních znaků popsaných v tomto článku použijte klienta REST.

Logiku jsme vysvětlili v předchozích částech. Tato část vás provede rozhraními API, která byste měli volat při testování vašeho řešení.

  • Odstranění indexu odebere existující index se stejným názvem, abyste ho mohli znovu vytvořit.

  • Vytvoření indexu vytvoří strukturu indexu ve vyhledávací službě, včetně definic analyzátoru a polí se specifikací analyzátoru.

  • Načíst dokumenty importuje dokumenty se stejnou strukturou jako index a také prohledávatelný obsah. Po tomto kroku je index připravený k dotazování nebo testování.

  • Analyzátor testů byl zaveden v Nastavit analyzátor. Otestujte některé řetězce v indexu pomocí různých analyzátorů, abyste pochopili, jak se termíny tokenizují.

  • Vyhledávací dokumenty vysvětlují, jak vytvořit požadavek dotazu pomocí jednoduché syntaxe nebo úplné syntaxe Lucene pro zástupné kóty a regulární výrazy.

    U částečných dotazů termínů, jako je například dotazování "3-6214", abyste našli shodu na "+1 (425) 703-6214", můžete použít jednoduchou syntaxi: search=3-6214&queryType=simple.

    Pro infixové a sufixové dotazy, jako je dotazování na "číslo" nebo "číselné" pro nalezení shody u "alfanumerických", použijte kompletní syntaxi Lucene a regulární výraz: search=/.*num.*/&queryType=full

Optimalizace dotazů na předponu a příponu

Odpovídající předpony a přípony vyžadují k použití výchozího analyzátoru další funkce pro dotazy. Předpony vyžadují vyhledávání se zástupnými čísly a přípony vyžadují hledání regulárních výrazů. Obě tyto funkce můžou snížit výkon dotazů.

Následující příklad přidá EdgeNGramTokenFilter pro rychlejší shody předpon nebo přípon. Tokeny se generují ve 2 až 25 znakových kombinacích, které obsahují znaky. Tady je příklad postupu ze dvou na sedm tokenů: MS, MSF, MSFT, MSFT/, MSFT/S, MSFT/SQ, MSFT/SQL. EdgeNGramTokenFilter side vyžaduje parametr, který určuje, z které strany se kombinace znaků řetězce generují. Používá se front pro dotazy předpon a back pro dotazy na přípony.

Extra tokenizace vede k většímu indexu. Pokud máte dostatečnou kapacitu pro přizpůsobení většího indexu, může být tento přístup s rychlejší dobou odezvy nejlepším řešením.

{
"fields": [
  {
    "name": "accountNumber_prefix",
    "indexAnalyzer": "ngram_front_analyzer",
    "searchAnalyzer": "keyword",
    "type": "Edm.String",
    "searchable": true,
    "filterable": false,
    "retrievable": true,
    "sortable": false,
    "facetable": false
  },
  {
    "name": "accountNumber_suffix",
    "indexAnalyzer": "ngram_back_analyzer",
    "searchAnalyzer": "keyword",
    "type": "Edm.String",
    "searchable": true,
    "filterable": false,
    "retrievable": true,
    "sortable": false,
    "facetable": false
  }
],

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

K vyhledání čísel účtů, které začínají 123, můžeme použít následující dotaz:

{
  "search": "123",
  "searchFields": "accountNumber_prefix"
}

K vyhledání čísel účtů, která končí 456, můžeme použít následující dotaz:

{
  "search": "456",
  "searchFields": "accountNumber_suffix"
}