synonymer i Elasticsearch

kort efter du starter din rejse til søgning, faktisk er dette helt uafhængigt af en bestemt søgemaskine, vil du stå over for en situation, hvor du skal håndtere ord, der har samme betydning.

hvis du for eksempel lader dine brugere søge efter sted, kan nogle henvise til Storbritannien som Storbritannien eller USA som USA, men denne situation er ikke begrænset til placering, ting som en ph.d. kaldes ofte også doktorgrad eller doktorgrad.

som et første skridt bør du afgøre, om du er i en situation med et ord synonymer eller multi ord, Dette er absolut intet irrelevant for Lucene baserede søgesystemer. Historisk Lucene har håndteret multi ord synonymer meget dårlig, dybest set du var nødt til at bygge dem en indeksering tid, med den efterfølgende liste over problemer. Hvis du er nysgerrig, følg denne serie for fremtidige indlæg.

hvis du har et sultent teknisk sind, er dette de mange relevante problemer og links til dig:

til dette indlæg vil vi fokusere på, hvordan vi løser dette i Elasticsearch på forespørgselstidspunktet, i opfølgningspost skal vi håndtere indekseringstidssynonymer og deres fordele og ulemper.

Synonymer håndteres i Elasticsearch og Solr som en del af forespørgsels – /indekseringstransformationskæden. Hvis du ikke er bekendt med hulkortlægninger og analysedele i Elasticsearch, anbefaler jeg dig, at inden du går videre, indhenter du disse dele, da vi vil være tungt fokus i denne del på dem.

i tilfælde af enkeltord eller tokenbaserede synonymer bruger vi i Elasticsearch synonymtokenfilteret. Første skridt ville være at udvide din nuværende analysekæde med et synonym_token_filter, din kortlægningsdefinition skal se noget ud:

Elasticsearch-anmodning om at opsætte et nyt indeks med et synonymfilter i analysekæden.

vi kan se fra dette billede, at vi definerede et nyt filter, der hedder jobs_synonym_filter, af typen synonym og inkluderer to synonym definitioner. Når du har defineret filteret, skal du medtage det i en analysator, det er det, du kan se i den anden opsætning af det forrige billede.

fra nu af kan vi bruge den tidligere definerede analysator til at behandle tekst, husk som med enhver anden input -, indeks-eller forespørgselstid, Elasticsearch bruger den valgte kæde til at bryde den i tokens, filtrere og berige den inden kontrol af det inverterede indeks.

Elasticsearch giv os en standard måde at kontrollere, hvordan analysatorerne opfører sig, så vi er ikke tvunget til at bruge tjek dem under indeksering eller forespørgsel. Hvis du vil kontrollere, hvordan en analysator opfører sig, kan du bruge _analyseendepunktet.

for eksempel hvis vi sigter mod at kontrollere adfærden hos den tidligere definerede analysator, kan vi tænke på et par plausible ord, ph. d. og Cop, i en sætning, de vil oversætte som:

  • Ph. d. John Doe-læge John Doe
  • Cop John Doe-Politi John Doe

i det næste billede ser vi et eksempel på, hvordan dette løb inde i Elasticsearch, vi kan se, hvordan de forskellige tokens genereres, herunder typen. Typen vil være synonym, når en af tokens er genereret fra synonymets tabel.

kontrol af den nye brugerdefinerede analysator og hvordan den håndterer de forskellige tokens

men i dette eksempel kan vi begynde at se et af problemerne med enkelt token synonymer, ph.d. kort til en læge, men læge betyder ikke altid kun ph. d., kan også betyde læge eller læge.

vi tænker måske på at håndtere disse synonymer med den samme struktur, men dette vil ikke være muligt, fordi analysekæden genererer et token for hvert ord, hvilket gør opgaven med det forrige synonymfilter ikke vellykket. Tjek det næste billede,

hvordan læge er proces med det tidligere definerede synonymfilter

du kan se, hvordan ordet læge ikke behandles korrekt med de definerede synonymer. Der er en løsning til dette, multi ord synonym filter.

synonymer med flere ord

korrekt håndtering af denne sag under Lucene-baserede søgemaskiner-familien er ret svært, du undrer dig måske over hvorfor?, dette skyldes, at Lucene generelle strategi er at bryde tekst i enkelte tokens.

der er et par strategier til at løse denne situation, for eksempel:

  • reduktion af synonymer med flere ord til en kanonisk form.
  • Kombiner relaterede tokens sammen, og bygg synonymerne derfra.
  • brug af det nyoprettede synonymgraffilter.

vi dækker ikke i denne post de to første, tjek kommende indlæg for flere detaljer om dem. I denne post vil vi fokusere på synonymgraffilteret, et mere smart tokenfilter i Lucene, der ikke kun kan håndtere tokens, men det overordnede forhold mellem ord.

for at bruge synonymgraffilteret skal du erklære det på samme måde som med filteret introduceret i det foregående afsnit, det skal se ud til noget som det næste billede:

Byg et nyt filter baseret på synonymgraffilteret (synonymer defineret direkte i anmodningen)

i dette eksempel definerede vi tre synonymer direkte i oprettelsen af analysekæden, men det er bedre at opsætte listen over synonymer ved hjælp af en konfigurationsfil. Synonymer kan indtastes ved hjælp af Solr/Lucene eller ordnet-formatet.

hvis du aldrig har hørt om ordnet, værd at tjekke!. Ordnet er en stor leksikalsk database med engelsk, substantiver, verb, adjektiv, adverb er grupperet i et sæt synonymer og mange flere. Denne form for leksikalske databaser er meget nyttige, når du forsøger at udvikle en rigere forståelse af tekst. Der er lignende begreber for andre sprog som tysk med GermaNet.

i de næste par billeder kunne du se, hvordan disse nye synonymer fungerer,

kontrol af læge med det nye synonymfilter

kontrol af Systemingeniørmed det nye synonymfilter

se, hvordan Elasticsearch var smart nok til at finde ud af, hvordan man fungerer på et enkelt ord synonym som læge, men også hvordan man håndterer systemingeniør.

men som spanske folk siger, “nej det er ikke noget, der er tilbage” eller på engelsk, ikke alt bliver let. Der er et par anbefalinger, vi skal udforske også i yderligere poster, men i en nøddeskal, hvis du bruger synonymer i Elasticsearch foretrækker en frase_forespørgsel over en forespørgselsstreng, kan du se på de næste billeder, hvordan de fungerer.

forespørgsel debugging med en match sætning

fejlfinding af forespørgsler med en forespørgselsstreng

du kan se, hvordan det sidste billede, det, der bruger forespørgselsstrengen, ikke genererer korrekte forespørgselsudtryk for at finde de rigtige dokumenter.

Recap

i denne post har vi præsenteret de eksisterende måder at håndtere synonymer i Elasticsearch. Begyndende med det enkelte ord/token synonymer introducerede dette indlæg hvorfor og hvordan synonymerne fungerer i en Lucene-baseret søgemaskine med specielt fokus på Elasticsearch.

fremtidige poster opsummerer fordele og ulemper ved hver løsning, men der er allerede et vigtigt tip, hvis du bruger synonymer med flere ord, skal du fokusere på at bruge sætningsforespørgsler.

artiklen slutter med en hurtig præsentation af synonymer med flere ord og hvordan de kan opsættes.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.