Définir des synonymes

Il est courant qu'une organisation utilise une terminologie propre ou différentes appellations pour désigner un concept ou une notion. En établissant des équivalences grâce aux synonymes, vous pouvez aider les utilisateurs à trouver l'information recherchée.

Les synonymes sont définis en indexant des éléments à l'aide d'un schéma courant : _dictionaryEntry.

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

Propriété Type Description Obligatoire ?
_term string Terme à définir. Utilisez de préférence des mots sans trait d'union ou des expressions sans ponctuation. Obligatoire
_synonym string (repeated) 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 spécifiques à une source de données. Facultatif

Lorsqu'un utilisateur inclut la valeur de la propriété _term dans une requête, la requête effective devient "terme OU synonymes". Par exemple, si le terme "scifi" est défini avec le synonyme "science fiction", une requête contenant le mot "scifi" correspond aux éléments contenant "scifi" ou "science fiction.".

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

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

Terme Synonymes
scifi science fiction
science fiction scifi

Pendant le traitement de la requête, les traits d'union et autres signes de ponctuation sont supprimés avant que les synonymes soient appliqués. La requête utilisateur "sci-fi" correspond à _term "sci fi.". Pour créer des synonymes pour des termes auxquels les utilisateurs sont susceptibles d'ajouter un trait d'union, normalisez d'abord _term avec un espace au lieu d'un tiret.

Poursuivant l'exemple, les définitions suivantes correspondent aux requêtes utilisateur et considèrent "sci-fi," "sci fi," "scifi," et "science fiction" comme interchangeables:

Terme Synonymes
scifi science fiction, sci fi
sci fi science fiction, scifi
science fiction scifi, sci fi

Par défaut, les synonymes d'une source de données s'appliquent à l'ensemble du domaine. En effet, les applications de recherche utilisent les synonymes pour toutes les recherches, quelle que soit la source de données. Si vous souhaitez que les synonymes s'appliquent une source de données particulière, 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 permet de créer un RepositoryDoc représentant le terme et les synonymes à 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();
}

Prenez en compte les informations suivantes lorsque vous définissez des synonymes:

  • Les synonymes saisis doivent être publics au sein du domaine. Pour ce faire, dans l'exemple précédent, vous devez définir 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 spécifiques à une application de recherche

Par défaut, les synonymes sont pris en compte pour toutes les sources de données dans l'ensemble des applications de recherche.

Toutefois, supposons que votre organisation dispose d'équipes d'ingénierie et de ventes distinctes, et que vous souhaitiez associer à chacune une expérience de recherche différente, y compris des synonymes spécifiques à leurs postes. Dans ce cas, vous pouvez créer deux applications de recherche distinctes pour l'ingénierie et les ventes, associées à leurs propres source de données et synonymes. Pour ce faire, indexez chaque synonyme dans une source de données spécifique à l'aide de _onlyApplicableForAttachedSearchApplications=true. Ce paramètre limite les synonymes de sorte qu'ils soient pris en compte uniquement dans les applications de recherche incluant une source de données spécifique.

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

structuredData.put("_onlyApplicableForAttachedSearchApplications", true);