Définir des synonymes

Il est courant qu'une organisation utilise une terminologie unique ou plusieurs façons de faire référence à un concept ou à une chose. Vous devez définir des synonymes pour établir l'équivalence des termes afin d'aider les utilisateurs à trouver des éléments lorsqu'ils effectuent une recherche.

Les synonymes sont définis en indexant des éléments selon le schéma courant _dictionaryEntry.

Les éléments de type _dictionaryEntry peuvent avoir les propriétés suivantes:

Propriété Type Description Obligatoire ?
_term chaîne Terme à définir. Les valeurs recommandées sont des mots sans trait d'union ou des expressions sans ponctuation. Obligatoire
_synonyme chaîne (répétée) Autres termes à inclure dans les requêtes correspondant à la chaîne définie dans _term. Obligatoire
_onlyApplicableForAttachedSearchApplications boolean Permet de regrouper des synonymes par source de données et application de recherche. Pour en savoir plus, consultez Définir des synonymes propres à une source de données. Facultatif

Lorsqu'un utilisateur inclut la valeur de la propriété _term dans une requête, la requête effectuée devient terme OR synonymes. Par exemple, si le terme "scifi" est défini avec le synonyme "science fiction", une requête contenant le mot "scifi" renvoie alors des éléments contenant soit "scifi", soit "science-fiction".

Les synonymes ne sont pas appliqués de manière bidirectionnelle. Si l'utilisateur lance une requête sur "SF", Cloud Search n'applique aucun synonyme. La requête ne renvoie que les éléments contenant "SF". Les éléments avec "science fiction" sont omis.

Pour que les deux termes soient interchangeables, vous devez les définir séparément:

Terme Synonymes
science-fiction science-fiction
science-fiction science-fiction

Au cours du traitement de la requête, le trait d'union et les autres signes de ponctuation sont supprimés avant l'application des synonymes. La requête utilisateur "SF" correspond au _term "science fiction". Pour créer des synonymes pour des termes auxquels les utilisateurs sont susceptibles d'ajouter un trait d'union, normalisez d'abord la valeur _term pour qu'elle utilise un espace blanc au lieu de traits d'union.

Pour reprendre l'exemple, avec les définitions suivantes, les termes "science fiction", "science fiction", "science fiction" et "SF" sont considérés comme interchangeables:

Terme Synonymes
science-fiction science-fiction, science-fiction
science-fiction science-fiction, science-fiction
science-fiction science fiction, science-fiction

Par défaut, les synonymes d'une source de données s'appliquent à l'ensemble du domaine. Plus précisément, des synonymes sont appliqués dans toutes les applications de recherche pour toutes les recherches, quelle que soit la source de données. Si vous souhaitez obtenir des synonymes propres à une source de données, consultez Définir des synonymes spécifiques à une source de données.

Définir des synonymes globaux à l'aide du SDK Cloud Search

Vous pouvez utiliser le SDK Content Connector pour définir des termes et leurs synonymes. Pour savoir comment créer un connecteur, consultez Créer un connecteur de contenu.

L'extrait de code suivant illustre la création d'une RepositoryDoc représentant le terme et le synonyme à partir d'un enregistrement de fichier CSV:

DictionaryConnector.java
/**
 * Creates a document for indexing.
 *
 * For this connector sample, the created document is domain public
 *  searchable. The content is a simple text string.
 *
 * @param record The current CSV record to convert
 * @return the fully formed document ready for indexing
 */
private ApiOperation buildDocument(CSVRecord record) {
  // Extract term and synonyms from record
  String term = record.get(0);
  List<String> synonyms = StreamSupport.stream(record.spliterator(), false)
      .skip(1) // Skip term
      .collect(Collectors.toList());

  Multimap<String, Object> structuredData = ArrayListMultimap.create();
  structuredData.put("_term", term);
  structuredData.putAll("_synonym", synonyms);

  if (Configuration.getBoolean("dictionary.attachedToSearchApp", false).get()) {
    structuredData.put("_onlyApplicableForAttachedSearchApplications", true);
  }

  String itemName = String.format("dictionary/%s", term);

  // Using the SDK item builder class to create the item
  Item item =
      IndexingItemBuilder.fromConfiguration(itemName)
          .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
          .setObjectType("_dictionaryEntry")
          .setValues(structuredData)
          .setAcl(DOMAIN_PUBLIC_ACL)
          .build();

  // Create the fully formed document
  return new RepositoryDoc.Builder()
      .setItem(item)
      .build();
}

Tenez compte des points suivants lorsque vous définissez des synonymes:

  • Les synonymes saisis doivent être publics dans le domaine. Dans l'exemple précédent, cela est possible en définissant la LCA sur DOMAIN_PUBLIC_ACL.
  • Les propriétés suivantes ne doivent pas être définies pour votre fichier de configuration, car elles remplacent le paramètre public du domaine dans votre code :
    • defaultAcl.mode=FALLBACK
    • defaultAcl.public=true

Définir des synonymes propres à une application de recherche

Par défaut, les synonymes sont appliqués à toutes les sources de données de toutes les applications de recherche.

Toutefois, supposons que votre entreprise dispose d'équipes d'ingénierie et de ventes distinctes, et que vous souhaitiez fournir à chaque équipe une expérience de recherche différente, y compris des synonymes spécifiques à un poste. Dans ce cas, vous pouvez créer une application de recherche avec une source de données spécifique à l'ingénierie et des synonymes, et une autre application de recherche avec une source de données et des synonymes spécifiques aux ventes. Pour atteindre cet objectif, indexez chaque synonyme d'une source de données spécifique à l'aide de _onlyApplicableForAttachedSearchApplications=true. Ce paramètre limite les synonymes de sorte qu'ils ne soient appliqués qu'aux applications de recherche qui incluent une source de données spécifique.

Par exemple, en ajoutant la ligne de code suivante à l'exemple de code précédent, vous vous assurez que les synonymes indexés sont spécifiques à la source de données:

structuredData.put("_onlyApplicableForAttachedSearchApplications", true);