Čá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 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ý ř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ů.
Informace o částečném hledání termínů
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 porovnáváním předpon se označují obecně rozpoznaným vzorem, který zahrnuje začátek termínu, následovaný operátory
*
přípon nebo?
operátory přípon, jakosearch=cap*
je například párování 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 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:
- Definujte druhé pole pro uložení nedotčené verze řetězce (za předpokladu, že chcete analyzovat a neanalyzovaný text v době dotazu).
- Vyhodnocení a volba mezi různými analyzátory, které generují tokeny na správné úrovni členitosti
- Přiřazení analyzátoru k poli
- 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 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í.
Nejprve zkontrolujte standardní analyzátor a zjistěte, jak se termíny tokenizují ve výchozím nastavení.
{ "text": "SVP10-NOR-00", "analyzer": "standard" }
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 } ] }
Teď upravte požadavek tak, aby používal analyzátor
whitespace
keyword
:{ "text": "SVP10-NOR-00", "analyzer": "keyword" }
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
Optimalizace dotazů na předponu a příponu
Odpovídající předpony a přípony pomocí výchozího analyzátoru vyžadují další funkce dotazu. 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á předponu nebo příponu EdgeNGramTokenFilter
rychleji. 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, ze které strany kombinace znaků řetězce se 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"
}
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ů.