synonymer i Elasticsearch (HowTo)

strax efter att du börjar din resa till sökning, är det faktiskt helt oberoende av en viss sökmotor, du kommer att möta en situation där du måste hantera ord som har samma betydelse.

om du till exempel låter dina användare söka efter plats kan vissa hänvisa till Storbritannien som Storbritannien eller USA som USA, men denna situation är inte begränsad till plats, saker som doktorsexamen kallas ofta också doktorsexamen eller doktorsexamen.

som ett första steg bör du avgöra om du befinner dig i en situation med ett ord synonymer eller flera ord, Detta är definitivt inget irrelevant för Lucene baserade söksystem. Historiskt Lucene har hanterat flera ord synonymer mycket dåligt, i princip du var tvungen att bygga dem en indexeringstid, med den efterföljande listan över problem. Om du är nyfiken, följ den här serien för framtida inlägg.

om du har ett hungrig Tekniskt sinne är det här flera relevanta frågor och länkar för dig:

för det här inlägget kommer vi att fokusera på hur man löser detta i Elasticsearch vid frågestund, i uppföljningspost kommer vi att hantera indexeringstidssynonymer och deras fördelar och nackdelar.

Synonymer hanteras i Elasticsearch, och Solr, som en del av frågan/indexering transformationskedjan. Om du inte är bekant med hålmappningarna och analysdelarna i Elasticsearch, rekommenderar jag dig att innan du går framåt kommer du att fånga upp dessa delar, eftersom vi kommer att vara tungt fokus i den här delen på dem.

för enstaka ord, eller tokenbaserade synonymer, kommer vi att använda i Elasticsearch synonymt token filter. Första steget skulle vara att utöka din nuvarande analyskedja med ett synonym_token_filter, din kartläggningsdefinition ska se ut som:

Elasticsearch begär att ställa in ett nytt index med ett synonymfilter i analyskedjan.

vi kan se från den här bilden att vi definierade ett nytt filter, med namnet jobs_synonym_filter, av typen synonym och inkluderar två synonymdefinitioner. När du har definierat filtret bör du inkludera det i en analysator, det här är vad du kan se i den andra inställningen av föregående bild.

från och med nu kan vi använda den tidigare definierade analysatorn för att bearbeta text, kom ihåg som med någon annan inmatning, index eller frågestund, Elasticsearch kommer att använda den valda kedjan för att bryta den i tokens, filtrera och berika den innan du kontrollerar det inverterade indexet.

Elasticsearch ger oss ett vanligt sätt att kontrollera hur analysatorerna beter sig, så vi är inte tvungna att använda kontrollera dem medan indexering eller Fråga. Om du vill verifiera hur en analysator beter sig kan du använda slutpunkten _analyze.

om vi till exempel strävar efter att kontrollera beteendet hos den tidigare definierade analysatorn, kanske vi tänker på några troliga ord, PhD och Cop, i en mening som de kommer att översätta som:

  • PhD John Doe Bisexuell Doctor John Doe
  • Cop John Doe Bisexuell Police John Doe

i nästa bild ser vi ett exempel på hur detta körs inuti Elasticsearch, vi kan se hur de olika tokens genereras, inklusive typen. Typen kommer att vara synonym när en av tokens har genererats från synonymtabellen.

kontrollera den nya anpassade analysatorn och hur den hanterar de olika tokens

men i det här exemplet kan vi börja se ett av problemen med enstaka token synonymer, Doktorskartor till en läkare, men doktorn betyder inte alltid bara doktor, kan också betyda läkare eller läkare.

vi kanske tänker på att hantera dessa synonymer med samma struktur, men detta kommer inte att vara möjligt eftersom analyskedjan kommer att generera en token för varje ord, vilket gör uppgiften för det tidigare synonymfiltret inte framgångsrikt. Kontrollera nästa bild,

hur läkare är process med det tidigare definierade synonymfiltret

du kan se hur ordet läkare inte är korrekt process med de definierade synonymerna. Det finns en lösning för detta, multi word synonym filter.

multi word synonymer

korrekt hantering av detta fall under Lucene baserade sökmotorer familjen är ganska svårt, kanske du undrar varför?, detta beror på att Lucene allmänna strategi är att bryta text i enstaka tokens.

det finns några strategier för att lösa denna situation, till exempel:

  • minska flera ord synonymer till en kanonisk form.
  • kombinera relaterade tokens tillsammans och bygga synonymerna därifrån.
  • använda det nyskapade synonymgraffiltret.

vi kommer inte att täcka i denna post de två första, Kontrollera kommande inlägg för mer information om dem. I det här inlägget kommer vi att fokusera på synonym graph filter, en mer smart token filter i Lucene kunna hantera inte bara tokens, men det övergripande förhållandet mellan ord.

för att använda synonymgraffiltret bör du förklara det på samma sätt som med filtret som introducerades i föregående avsnitt, det ska se ut som något som nästa bild:

Bygg ett nytt filter baserat på synonymgraffiltret (synonymer definierade direkt i begäran)

i det här exemplet definierade vi tre synonymer direkt i skapandet av analyskedjan, men är bättre att ställa in listan över synonymer med hjälp av en konfigurationsfil. Synonymer kan anges med Solr / Lucene eller WordNet-formatet.

om du aldrig hört talas om WordNet, värt att kontrollera!. WordNet är en stor lexikal databas med engelska, substantiv, verb, adjektiv, adverb är grupperade i en uppsättning synonymer och många fler. Denna typ av lexikala databaser är mycket användbara när du försöker utveckla en rikare förståelse av text. Det finns liknande begrepp för andra språk som tyska med GermaNet.

i nästa par bilder kan du se hur dessa nya synonymer fungerar,

kontrollera läkare med det nya synonymfiltret

kontrollera systemingenjör med det nya synonymfiltret

se hur Elasticsearch var smart nog att räkna ut hur man använder en enda ordsynonym som läkare, men också hur man hanterar systemingenjör.

men som spanska folket säger,” no es oro todo lo que reluce ” eller på engelska, kommer inte allt att bli lätt. Det finns några rekommendationer vi kommer att explorer även i ytterligare poster, men i ett nötskal, om du använder synonymer i Elasticsearch föredrar en phrase_query över en query_string, du kan se i nästa bilder hur de fungerar.

Query felsökning med en match fras

Query debugging med en frågesträng

du kan se hur den sista bilden, den som använder query_string, inte genererar korrekta frågetermer för att hitta rätt dokument.

Recap

i det här inlägget har vi presenterat de befintliga sätten att hantera synonymer i Elasticsearch. Från och med de enda ord/token synonymer, detta inlägg introducerade varför och hur synonymer fungerar i en Lucene baserad sökmotor med särskilt fokus på Elasticsearch.

framtida poster kommer att sammanfatta för-och nackdelar med varje lösning, men det finns redan ett viktigt tips, om du använder multiword-synonymer, fokusera på att använda frasfrågor.

artikeln avslutas med en snabb presentation av multiword synonymer och hur de kan ställas in.

Lämna ett svar

Din e-postadress kommer inte publiceras.