類義語を定義する

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

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

_dictionaryEntry 型のアイテムには、2 つのプロパティが必要です。

プロパティ 説明
_term 文字列 定義する用語。推奨値は、ハイフンが付いていない単語または句読点のないフレーズです。
_synonym 文字列(繰り返し) _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-fisci fiscifiscience fiction を交換可能として扱うユーザークエリと一致します。

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

コンテンツ コネクタ 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);

      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