Definir sinónimos

Es habitual que una organización tenga una terminología única o varias formas de referirse a un concepto o un objeto. Para ayudar a los usuarios a encontrar elementos durante las búsquedas, debes definir sinónimos que establezcan equivalencias entre términos.

Los sinónimos se definen indexando elementos con el esquema _dictionaryEntry, que es muy conocido.

Los elementos de tipo _dictionaryEntry pueden tener las siguientes propiedades:

Propiedad Tipo Descripción ¿Es obligatorio?
_term cadena El término que se va a definir. Los valores recomendados son palabras sin guiones o frases sin puntuación. Obligatorio
_synonym cadena (repetida) Términos alternativos que se incluirán en las consultas que coincidan con la cadena definida en _term. Obligatorio
_onlyApplicableForAttachedSearchApplications booleano Permite agrupar sinónimos por fuente de datos y aplicación de búsqueda. Consulta más información en la sección Definir sinónimos específicos de fuentes de datos. Opcional

Cuando un usuario incluye el valor de la propiedad _term en una consulta, la consulta real pasa a ser de "término O sinónimos". Por ejemplo, si el término "scifi" se define con el sinónimo "ciencia ficción", una consulta que contenga la palabra "scifi" incluirá los elementos que contengan "scifi" o "ciencia ficción".

Los sinónimos no se aplican bidireccionalmente. Si, por el contrario, la consulta solo incluye el término "ciencia ficción", Cloud Search no aplicará ningún sinónimo a la consulta. La consulta solo incluirá elementos que contengan la palabra "ciencia ficción", y se omitirán los elementos que contengan "scifi".

Para que los dos términos sean intercambiables, define cada uno por separado:

Término Sinónimos
scifi ciencia ficción
ciencia ficción scifi

Durante el procesamiento de consultas, se eliminan los guiones y otros signos de puntuación antes de aplicar los sinónimos. La consulta de usuario "sci-fi" coincide con el término _term "sci fi." Para crear sinónimos de términos que los usuarios hayan podido separar con un guion, primero normaliza el término _term de forma que use espacios en blanco en lugar de guiones.

Siguiendo con el ejemplo, en las siguientes definiciones se incluyen las consultas de los usuarios que tratan los términos "sci-fi", "sci fi", "scifi" y "ciencia ficción" como intercambiables:

Término Sinónimos
scifi ciencia ficción, sci fi
sci fi ciencia ficción, scifi
ciencia ficción scifi, sci fi

De forma predeterminada, los sinónimos de cualquier fuente de datos se aplican a un dominio entero. En concreto, los sinónimos se aplican a todas las búsquedas de todas las aplicaciones de búsqueda, independientemente de la fuente de datos. Consulta la sección Definir sinónimos específicos de fuentes de datos para obtener información al respecto.

Definir sinónimos globales con el SDK de Cloud Search

Puedes usar el SDK Content Connector para definir términos y sus sinónimos. Consulta la página Crear un conector de contenido para obtener instrucciones al respecto.

En el siguiente fragmento se muestra cómo crear un RepositoryDoc que represente el término y el sinónimo según el registro de un archivo 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();
}

Cuando definas sinónimos, ten en cuenta lo siguiente:

  • Las entradas de sinónimos deben ser de dominio público. Según el ejemplo anterior, esto se consigue definiendo la LCA como DOMAIN_PUBLIC_ACL.
  • No se deben definir las siguientes propiedades en el archivo de configuración porque anulan la configuración pública del dominio de tu código:
    • defaultAcl.mode=FALLBACK
    • defaultAcl.public=true

Definir sinónimos específicos de fuentes de datos

De forma predeterminada, se aplican sinónimos a todas las fuentes de datos de todas las aplicaciones de búsqueda. Sin embargo, puedes agrupar sinónimos por fuente de datos y aplicación de búsqueda. Por ejemplo, es posible que tu organización tenga equipos de ingeniería y ventas independientes y que quieras definir una experiencia de búsqueda diferente para cada uno, incluidos los sinónimos específicos de puestos de trabajo. En ese caso, puedes crear una aplicación de búsqueda con una fuente de datos y unos sinónimos específicos de ingeniería, y otra aplicación de búsqueda con una fuente de datos y unos sinónimos específicos de ventas.

Para limitar dónde se aplican sinónimos, asigna el valor _onlyApplicableForAttachedSearchApplications a true durante la indexación. Con esta configuración, se define un límite para que los sinónimos solo se apliquen a las aplicaciones de búsqueda que incluyan una fuente de datos concreta. Por ejemplo, se puede añadir la siguiente línea de código al código de ejemplo anterior para que los sinónimos indexados sean específicos de una fuente de datos:

structuredData.put("_onlyApplicableForAttachedSearchApplications", true);