allBlogsList

How to Programmatically Add Synonyms to Coveo

Quick and Dirty Coveo API

Recently a client using Sitecore came to me with an interesting request. They have a process that inserts documents into Sitecore at regular intervals with defined metadata. The client would like to be able to add synonyms for that metadata into their Coveo query pipeline. The catch is, they want all of this to happen automatically, but it looks like Coveo doesn't provide any documentation on how to do this programmatically. After a little work, I realized that I could just inspect the traffic using developer tools in the browser and reverse engineer those calls.

Adding a synonym:

// Add a list of synonyms for the provided term 
public bool AddSynonyms(string term, List<string> synonyms, string description) 
{ 
    // Synonyms need to be wrapped in quotes 
    var synonymString = 
       string.Join(',', synonyms.Select(x => $"'{x}'").ToList()); 

    // This notation works for one way synonyms. 
    // For Synonym, Replace, and Match terms exactlycheck the documentation 
    var synonym = new Synonym 
    { 
       description = description, 
       feature = "thesaurus", 
       parent = null, 
       definition = $"expand \"{term}\" to {synonymString}", 
       position = 0 
    }; 

    Client.DefaultRequestHeaders.Authorization = 
       new AuthenticationHeaderValue("Bearer", _accessToken); 
    var stringContent = 
       new StringContent(JsonConvert.SerializeObject(synonym), 
    Encoding.UTF8, "application/json"); 
    var requestUrl = 
       $"{_baseUrl}/{_pipelineId}/statements?organizationId={_organizationId}"; 

    using var response = Client.PostAsync(requestUrl, stringContent); 
    using var content = response.Result; 
    return content.IsSuccessStatusCode; 
} 

Get a synonym by Id: 

public Synonym GetSynonym(Guid id) 
{ 
    Client.DefaultRequestHeaders.Authorization = 
       new AuthenticationHeaderValue("Bearer", _accessToken); 
    var requestUrl = 
    $"{_baseUrl}/{_pipelineId}/statements/{id.ToString()}?organizationId={_organizationId}"; 

    using var response = Client.GetAsync(requestUrl).Result; 
    using var content = response.Content; 

    if (response.IsSuccessStatusCode) 
    { 
       var synonym = JsonConvert.DeserializeObject<Synonym>( 
              content.ReadAsStringAsync().Result); 
       synonym.Term = synonym.definition.Split(" to ")[0] 
              .Replace("expand ", "").Replace("\"", ""); 
       synonym.Synonyms = synonym.definition.Split(" to ")[1] 
              .Split(",").ToList(); 

       return synonym; 
    } 

    return null; 
} 

For the full code example, check out my Gist here: 

https://gist.github.com/peterpociask/a79de0887acfecc94a3a95733ecf735a