類義語を定義する

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

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

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

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

ユーザーがクエリに _term プロパティの値を含めると、有効なクエリは「キーワード OR 類義語」になります。たとえば、用語「scifi」が同義語「サイエンス フィクション」と定義されている場合、「scifi」という単語を含むクエリは、「scifi」または「サイエンス フィクション」のいずれかを含む項目に一致します。

類義語は双方向には適用されません。クエリが「サイエンス フィクション」である場合、Cloud Search はクエリに同義語を適用しません。クエリは「サイエンス フィクション」を含むアイテムにのみ一致します。「scifi」を含むアイテムは省略されます。

この 2 つの用語をすべて同じ意味にするには、それぞれの用語を個別に定義します。

用語 類義語
scifi science fiction
science fiction scifi

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

この例の場合、次の定義はユーザークエリと一致します。「sci-fi」、「sci fi」、「scifi」、「science finance」は交換可能なものとして扱います。

用語 類義語
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);