Sdílet prostřednictvím


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

Čá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, který představuje fragment textu, který chcete vyhledat. Během fáze lexikální analýzy indexování (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ý řetězec, neskenizovaný řetězec umožňuje porovnávání vzorů pro dotazy "začíná" nebo "končí" a vyhodnocuje se vzor, který zadáte, proti termínu, 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 Search vyhledá v indexu celé tokenizované termíny a nenajde shodu s částečným termínem, pokud nezadáte zástupné symboly zástupných znaků (* a ?) nebo dotaz naformátujete 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 odpovídající předponou označují obecně rozpoznaný vzor, který zahrnuje začátek termínu, následovaný operátory * přípony nebo ? operátory přípon, jako search=cap* je například párování u Cap'n Jack's Waterfront Inn nebo Gacc Capital. Porovnávání předpon se podporuje v jednoduché i úplné syntaxi dotazů Lucene.

  • Zástupný znak s příponou infix a příponou umístí operátory *? uvnitř nebo na začátek termínu a vyžaduje syntaxi regulárního výrazu (kde je výraz uzavřený s lomítky). 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 / uchvácené zpětné lomítko \. Jako takový search=/.*microsoft.com\/azure\/.*/ je syntaxe fragmentu adresy URL "microsoft.com/azure/".

Řešení problémů s částečným vyhledáváním nebo vzorem

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 analyzovat a neanalyzovaný text v době dotazu).
  2. Vyhodnocení a volba mezi různými analyzátory, které generují tokeny na správné úrovni členitosti
  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.
Mezery Odděluje pouze prázdné znaky. 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átor klíčových slov s filtrem tokenů s menším písmenem. Integrovaný analyzátor klíčových slov sám o sobě neobsahuje malá a malá písmena textu, 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 rozdělené do jednotlivých tokenů, odebrané spojovníky a dílčí řetězce. 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 whitespacekeyword :

    {
    "text": "SVP10-NOR-00",
    "analyzer": "keyword"
    }
    
  4. Odpověď se tentokrát skládá z jednoho tokenu s velkými písmeny, 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é

Při vytváření stromu dotazu mějte na paměti, že analyzátory dotazů často obsahují malá a malá písmena ve vyhledávacím výrazu. Pokud používáte analyzátor, který během indexování nezadá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

Bez ohledu na to, jestli vyhodnocujete analyzátory nebo přecházíte s konkrétní konfigurací, budete muset určit analyzátor definice pole a případně nakonfigurovat samotný analyzátor, pokud nepoužíváte integrovaný analyzátor. Při prohození analyzátorů obvykle potřebujete znovu sestavit index (vypustit, znovu vytvořit a znovu načíst).

Použití integrovaných analyzátorů

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

Další informace o dalších předdefinovaných analyzátorech najdete v tématu 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 na ni odkazujte na definici pole, stejně jako byste vytvořili integrovaný 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 malými písmeny libovolné textové vstupy s velkými písmeny. Dolní písmena homogenizuje 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 jednotlivými rozhraními API, které byste měli při testování řešení volat.

  • 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 představen v sadě analyzátoru. 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 infixovací a příponové dotazy, jako je dotazování na "číslo" nebo "číselné k vyhledání shody u alfanumerických", použijte úplnou syntaxi Lucene a regulární výraz: search=/.*num.*/&queryType=full

Ladění výkonu dotazů

Pokud implementujete doporučenou konfiguraci, která zahrnuje tokenizátor keyword_v2 a filtr tokenů s nízkými písmeny, můžete si všimnout snížení výkonu dotazů kvůli dalšímu zpracování filtru tokenů nad existujícími tokeny v indexu.

Následující příklad přidá EdgeNGramTokenFilter , aby byla předpona rychlejší. 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.

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

Další kroky

Tento článek vysvětluje, jak analyzátory přispívají k problémům s dotazy a řeší problémy s dotazy. V dalším kroku se podrobněji podíváme na analyzátory, které ovlivňují indexování a zpracování dotazů.