類義語を定義する

組織では、コンセプトやものごとを指し示すのに固有の用語や複数の方法が存在することがよくあります。ユーザーが検索時にアイテムを見つけるのに役立つように、類義語を定義して用語の同等性を確立する必要があります。

類義語は、既知のスキーマ _dictionaryEntry を使用してアイテムをインデックスに登録することで定義されます。

_dictionaryEntry 型のアイテムには次のプロパティがあります。

プロパティ タイプ 説明 必須 / 任意
_term string 定義する用語。推奨値は、ハイフンが付いていない単語または句読点のないフレーズです。 必須
_synonym string (repeated) _term で定義された文字列に一致するクエリに含める代替語句。 必須
_onlyApplicableForAttachedSearchApplications boolean データソースと検索アプリケーション別に類義語をグループ化できます。詳細については、データソース固有の類義語を定義するをご覧ください。 任意

ユーザーがクエリに _term プロパティの値を含めると、有効なクエリは「term OR 類義語」になります。たとえば、用語 "scifi" が類義語 "science fiction" で定義されている場合、単語 "scifi" を含むクエリは、"scifi" または "science fiction." のいずれかを含むアイテムに一致します。

類義語は双方向には適用されません。クエリが "science fiction," に対する場合、Cloud Search はクエリに類義語を適用しません。このクエリは、"science fiction." を含むアイテムにのみ一致します。"scifi" を含むアイテムは省略されます。

両方の用語をすべて同じ意味にするには、各用語を個別に定義します。

用語 類義語
scifi science fiction
science fiction scifi

クエリ処理中に、類義語を適用する前にハイフンなどの句読点が削除されます。ユーザークエリ "sci-fi"_term "sci fi." と一致します。ユーザーがハイフンでつなぐ可能性がある用語の類義語を作成するには、まず、ハイフンの代わりに空白文字を使用するように _term を正規化します。

引き続き例を続けると、次の定義は、"sci-fi," "sci fi," "scifi,""science fiction" を交換可能として扱うユーザークエリと一致します。

用語 類義語
scifi science fiction, sci fi
sci fi science fiction, scifi
science fiction scifi, sci fi

デフォルトでは、データソースの類義語はドメイン全体に適用されます。具体的には、類義語はデータソースに関係なくすべての検索の検索アプリケーションに適用されます。データソース固有の類義語が必要な場合は、データソース固有の類義語を定義するをご覧ください。

Cloud Search SDK を使用してグローバルな類義語を定義する

コンテンツ コネクタ SDK を使用して、用語とその同義語を定義できます。コネクタを構築する方法については、コンテンツ コネクタを作成するをご覧ください。

次のスニペットは、CSV ファイルのレコードに基づいて、用語と類義語を表す RepositoryDoc を作成する方法を示しています。

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();
}

類義語を定義する際は、以下の点に注意してください。

  • 類義語エントリはドメイン公開にする必要があります。前述の例では、ACL を DOMAIN_PUBLIC_ACL に設定することによってこれを実現しています。
  • 次のプロパティは、コード内のドメインの公開設定をオーバーライドするため、構成ファイルには定義しないでください。
    • defaultAcl.mode=FALLBACK
    • defaultAcl.public=true

検索アプリケーション固有の類義語を定義する

デフォルトでは、類義語はすべての検索アプリケーションのすべてのデータソースに適用されます。

ただし、組織にエンジニアリング チームとセールスチームが別々にあり、各チームに、職務固有の類義語を含む異なる検索エクスペリエンスを提供するとします。この場合、エンジニアリング固有のデータソースと類義語を使用した検索アプリケーションと、販売固有のデータソースと類義語を使用した別の検索アプリケーションを作成できます。この目標を達成するには、_onlyApplicableForAttachedSearchApplications=true を使用して特定のデータソース内の各類義語にインデックスを付けます。この設定により、類義語が特定のデータソースを含む検索アプリケーションにのみ適用されるように制限されます。

たとえば、上記のコードサンプルに次のコード行を追加すると、インデックス登録された類義語がデータソース固有になります。

structuredData.put("_onlyApplicableForAttachedSearchApplications", true);