類義語を定義する

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

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

_dictionaryEntry タイプのアイテムには、次のプロパティを設定できます。

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

ユーザーがクエリに _term プロパティの値を含めると、有効なクエリは「term OR synonyms」になります。たとえば、用語 "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

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

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

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

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

structuredData.put("_onlyApplicableForAttachedSearchApplications", true);