İçerik bağlayıcı oluşturma

İçerik bağlayıcı, bir kurumsal depodaki verileri tarayan ve bir veri kaynağını dolduran bir yazılım programıdır. Google, içerik bağlayıcıları geliştirme konusunda aşağıdaki seçenekleri sunar:

  • İçerik Bağlayıcı SDK'sı. Bu, Java programcıları için iyi bir seçenektir. SDK, bağlayıcıları hızlı bir şekilde oluşturmanıza olanak tanıyan REST API'nin sarmalayıcısıdır. SDK'yı kullanarak içerik bağlayıcı oluşturmak için İçerik Bağlayıcı SDK'sını kullanarak içerik bağlayıcı oluşturma başlıklı makaleyi inceleyin.

  • Düşük düzeyli bir REST API veya API kitaplıkları. Java kullanmıyorsanız veya kod tabanınız bir REST API'yi ya da kitaplığı daha iyi destekliyorsa bu seçenekleri kullanın. REST API'yi kullanarak içerik bağlayıcı oluşturmak için REST API'yi kullanarak içerik bağlayıcı oluşturma başlıklı makaleyi inceleyin.

Tipik bir içerik bağlayıcı aşağıdaki görevleri yerine getirir:

  1. Yapılandırma parametrelerini okur ve işler.
  2. Üçüncü taraf deposundan "öğeler" adı verilen, dizine eklenebilir verilerin ayrı parçalarını çeker.
  3. Erişim kontrol listelerini, meta verileri ve içerik verilerini dizine eklenebilir öğeler halinde birleştirir.
  4. Öğeleri Cloud Search veri kaynağında dizine ekler.
  5. (İsteğe bağlı) Depodan gelen değişiklik bildirimlerini dinler. Değişiklik bildirimleri, Cloud Search veri kaynağının senkronize kalması için dizine ekleme isteklerine dönüştürülür. Bağlayıcı bu görevi yalnızca depo değişiklik algılamayı destekliyorsa gerçekleştirir.

Content Connector SDK'yı kullanarak içerik bağlayıcı oluşturma

Aşağıdaki bölümlerde, İçerik Bağlayıcı SDK'sını kullanarak nasıl içerik bağlayıcı oluşturacağınız açıklanmaktadır.

Bağımlılıkları ayarlama

Bu bağımlılıkları derleme dosyanıza ekleyin.

Maven

xml <dependency> <groupId>com.google.enterprise.cloudsearch</groupId> <artifactId>google-cloudsearch-indexing-connector-sdk</artifactId> <version>v1-0.0.3</version> </dependency>

Gradle

groovy compile group: 'com.google.enterprise.cloudsearch', name: 'google-cloudsearch-indexing-connector-sdk', version: 'v1-0.0.3'

Bağlayıcı yapılandırmanızı oluşturun

Her bağlayıcı, depo kimliğiniz gibi parametreler için bir yapılandırma dosyası kullanır. Parametreleri anahtar-değer çiftleri olarak tanımlayın. Örneğin, api.sourceId=1234567890abcdef.

Google Cloud Search SDK, tüm bağlayıcılar için Google tarafından sağlanan parametreleri içerir. Yapılandırma dosyanızda aşağıdakileri belirtmeniz gerekir:

  • İçerik bağlayıcı: api.sourceId ve api.serviceAccountPrivateKeyFile öğelerini beyan edin. Bunlar, deponuzu ve erişim için gereken özel anahtarı tanımlar.
  • Kimlik bağlayıcı: Harici kimlik kaynağınızı tanımlamak için api.identitySourceId öğesini bildirin. Kullanıcı senkronizasyonu için api.customerId (Google Workspace hesabınızın benzersiz kimliği) değerini de beyan edin.

Diğer Google tarafından sağlanan parametreleri yalnızca varsayılan değerlerini geçersiz kılmak için bildirin. Kimlik ve anahtar oluşturma hakkında ayrıntılı bilgi için Google tarafından sağlanan parametreler başlıklı makaleyi inceleyin.

Yapılandırma dosyanızda depoya özgü parametreler de tanımlayabilirsiniz.

Yapılandırma dosyasını bağlayıcıya iletme

Yapılandırma dosyasını iletmek için config sistem özelliğini ayarlayın. Bağlayıcıyı başlatırken -D argümanını kullanın. Örneğin:

java -classpath myconnector.jar -Dconfig=MyConfig.properties MyConnector

Bu bağımsız değişkeni atlarsanız SDK, yerel dizinde connector-config.properties adlı bir dosyayı kullanmaya çalışır.

Geçiş stratejinizi belirleme

İçerik bağlayıcının temel işlevi, bir depoyu geçerek verilerini dizine eklemektir. Deponuzun boyutuna ve düzenine göre bir strateji uygulamanız gerekir. Kendi stratejinizi tasarlayabilir veya SDK'dan bir strateji seçebilirsiniz:

Tam geçiş stratejisi
Deponun tamamını tarar ve her öğeyi indeksler. Bu strateji, her indeksleme sırasında tam geçişin ek yükünü karşılayabileceğiniz küçük depolar için en iyisidir. Çoğunlukla statik, hiyerarşik olmayan verilerin bulunduğu küçük depolarda veya değişiklik algılamanın zor olduğu durumlarda kullanın.
Liste geçişi stratejisi
Her öğenin durumunu belirlemek için tüm depoyu tarar, ardından yalnızca yeni veya güncellenmiş öğeleri indeksler. Değişiklik algılama desteklenmediğinde büyük ve hiyerarşik olmayan bir dizinde artımlı güncellemeler için bu yöntemi kullanın.
Grafik geçişi
Öğelerinin durumunu belirlemek için bir üst düğümü tarar, ardından bu düğümdeki yeni veya güncellenmiş öğeleri indeksler. Ardından, alt düğümleri yinelemeli olarak işler. Tüm kimliklerin listelenmesinin pratik olmadığı hiyerarşik depolar için (ör. dizin yapıları veya web siteleri) bunu kullanın.

SDK, bu stratejileri şablon bağlayıcı sınıflarında uygular. Bu şablonlar, geliştirme sürecinizi hızlandırabilir. Şablon kullanmak için ilgili bölüme bakın:

Şablon sınıfı kullanarak tam geçiş bağlayıcısı oluşturma

Bu bölümde, FullTraversalSample'daki koddan bahsedilmektedir.

Bağlayıcı giriş noktasını uygulama

Giriş noktası main() yöntemidir. Application örneği oluşturur ve bağlayıcıyı çalıştırmak için start() işlevini çağırır.

application.start() işlevini çağırmadan önce IndexingApplication.Builder sınıfını kullanarak FullTraversalConnector şablonunu oluşturun. Bu şablon, Repository nesnesini kabul eder.

FullTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a full
 * traversal connector.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new SampleRepository();
  IndexingConnector connector = new FullTraversalConnector(repository);
  IndexingApplication application = new IndexingApplication.Builder(connector, args).build();
  application.start();
}

SDK, initConfig() yöntem çağrılarınızdan sonra main() yöntemini çağırır Application.build(). initConfig() yöntemi:

  1. Configuration öğesinin daha önce başlatılmadığından emin olun.
  2. Configuration nesnesini Google tarafından sağlanan anahtar/değer çiftleriyle başlatır.

Depo arayüzünü uygulama

Repository nesnesi, depo öğelerini dolaşır ve dizine ekler. Şablon kullanırken yalnızca Repository arayüzündeki belirli yöntemleri geçersiz kılmanız gerekir. FullTraversalConnector için geçersiz kılma:

  • init(): Depo kurulumu ve başlatma için.
  • getAllDocs(): Tüm öğeleri geçmek ve dizine eklemek için. Bu, planlanmış her geçiş için bir kez çağrılır.
  • (İsteğe bağlı) getChanges(): Deponuz değişiklik algılamayı destekliyorsa değiştirilen öğeleri almak ve dizine eklemek için bu ayarı geçersiz kılın.
  • (İsteğe bağlı) close(): Kapatma sırasında depoyu temizlemek için.

Her yöntem, IndexingService.indexItem() kullanılarak dizine ekleme işlemini gerçekleştiren bir ApiOperation nesnesi döndürür.

Özel yapılandırma parametrelerini alma

Bağlayıcınızın yapılandırmasını yönetmek için Configuration nesnesinden tüm özel parametreleri almanız gerekir. Bu görevi Repository sınıfınızın init() yönteminde gerçekleştirin.

Configuration sınıfı, farklı veri türlerini almak için yöntemler içerir. Her yöntem bir ConfigValue nesnesi döndürür. Değeri almak için ConfigValue nesnesinin get() yöntemini kullanın. FullTraversalSample kaynaklı bu snippet'te özel bir tam sayı değerinin nasıl alınacağı gösterilmektedir:

FullTraversalSample.java
@Override
public void init(RepositoryContext context) {
  log.info("Initializing repository");
  numberOfDocuments = Configuration.getInteger("sample.documentCount", 10).get();
}

Birden fazla değere sahip parametreleri almak ve ayrıştırmak için Configuration sınıfının tür ayrıştırıcılarından birini kullanın. Eğitim bağlayıcısından alınan bu snippet, GitHub depo adlarının listesini almak için getMultiValue kullanır:

GithubRepository.java
ConfigValue<List<String>> repos = Configuration.getMultiValue(
    "github.repos",
    Collections.emptyList(),
    Configuration.STRING_PARSER);

Tam geçiş gerçekleştirme

Tam geçiş gerçekleştirmek için geçersiz kılma getAllDocs(). Bu yöntem, kesintiye uğraması durumunda dizine ekleme işlemine devam etmek için bir kontrol noktası kabul eder. Her öğe için:

  1. İzinleri ayarlayın.
  2. Meta verileri ayarlayın.
  3. Bunları bir RepositoryDoc olarak birleştirin.
  4. Her öğeyi getAllDocs() tarafından döndürülen yineleyiciye paketleyin.

Öğe grubu tek bir arama için çok büyükse kontrol noktası kullanın ve hasMore(true) numaralı hattı arayın.

Bir öğenin izinlerini ayarlama

Depolar, bir öğeye erişimi olan kullanıcıları veya grupları belirlemek için Erişim Kontrol Listelerini (EKL'ler) kullanır. EKL, yetkili kullanıcıların veya grupların kimliklerini listeler.

Kullanıcıların yalnızca erişmeye yetkili oldukları arama sonuçlarını görmelerini sağlamak için deponuzun EKL'lerini kopyalamanız gerekir. Google Cloud Search'ün doğru erişim düzeyini sağlayabilmesi için bir öğeyi dizine eklerken ACL'yi ekleyin.

İçerik Bağlayıcı SDK'sı, çoğu deponun erişim kontrol listelerini modellemek için sınıflar ve yöntemler içerir. Deponuzun erişim kontrol listelerini analiz edin ve dizine ekleme sırasında Cloud Search için karşılık gelen erişim kontrol listeleri oluşturun. Devralmayı kullananlar gibi karmaşık erişim kontrol listelerini modellemek için dikkatli bir planlama gerekir. Daha fazla bilgi için Cloud Search ACL'leri başlıklı makaleyi inceleyin.

Erişimi ayarlamak için Acl.Builder sınıfını kullanın. Tam geçiş örneğindeki bu snippet, tüm alan kullanıcılarının (getCustomerPrincipal()) tüm öğeleri (setReaders()) okumasına olanak tanır:

FullTraversalSample.java
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

Özellikle devralma modellerini kullanan depo erişim kontrol listelerinin doğru şekilde modellenmesi için Cloud Search erişim kontrol listelerindeki bilgiler gerekir.

Öğe için meta verileri ayarlama

Meta veriler Item nesnesinde depolanır. Item oluşturmak için benzersiz bir kimliğe, öğe türüne, ACL'ye, URL'ye ve sürüme ihtiyacınız vardır. IndexingItemBuilder yardımcı sınıfını kullanın.

FullTraversalSample.java
// Url is required. Use google.com as a placeholder for this sample.
String viewUrl = "https://www.google.com";

// Version is required, set to current timestamp.
byte[] version = Longs.toByteArray(System.currentTimeMillis());

// Using the SDK item builder class to create the document with appropriate attributes
// (this can be expanded to include metadata fields etc.)
Item item = IndexingItemBuilder.fromConfiguration(Integer.toString(id))
    .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
    .setAcl(acl)
    .setSourceRepositoryUrl(IndexingItemBuilder.FieldOrValue.withValue(viewUrl))
    .setVersion(version)
    .build();
Dizinlenebilir öğeyi oluşturma

RepositoryDoc.Builder sınıfını kullanın.

FullTraversalSample.java
// For this sample, content is just plain text
String content = String.format("Hello world from sample doc %d", id);
ByteArrayContent byteContent = ByteArrayContent.fromString("text/plain", content);

// Create the fully formed document
RepositoryDoc doc = new RepositoryDoc.Builder()
    .setItem(item)
    .setContent(byteContent, IndexingService.ContentFormat.TEXT)
    .build();

RepositoryDoc, IndexingService.indexItem() isteğini gerçekleştiren bir ApiOperation'dir.

Dizine ekleme isteğini ASYNCHRONOUS veya SYNCHRONOUS olarak ayarlamak için RepositoryDoc.Builder sınıfının setRequestMode() yöntemini kullanın:

ASYNCHRONOUS
Bu modda, dizine ekleme ile yayınlama arasındaki gecikme daha uzundur ancak daha yüksek bir işleme hızı kotası desteklenir. Bir deponun tamamının ilk dizine eklenmesi (dolgu) için eş zamansız modu kullanın.
SYNCHRONOUS
Bu modda, dizine ekleme ile yayınlama arasındaki gecikme süresi daha kısadır ancak işleme hızı kotası daha düşüktür. Depo güncellemelerini ve değişikliklerini dizine eklemek için eşzamanlı modu kullanın. İstek modu belirtilmezse varsayılan olarak SYNCHRONOUS olur.
Dizinlenebilir her öğeyi bir yineleyicide paketleyin.

getAllDocs() yöntemi, CheckpointCloseableIterable RepositoryDoc nesneleri döndürür. CheckpointCloseableIterableImpl.Builder sınıfını kullanın.

FullTraversalSample.java
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(allDocs).build();

Sonraki adımlar

Şablon sınıfı kullanarak liste geçişi bağlayıcısı oluşturma

Cloud Search dizine ekleme kuyruğunda, depo öğelerinin kimlikleri ve isteğe bağlı karma değerleri bulunur. Liste geçişi bağlayıcısı, kimlikleri bu sıraya gönderir ve dizine eklemek için alır. Cloud Search, öğe durumunu (ör. silme) belirlemek için bu sıraları kullanır. Cloud Search Dizine Ekleme Kuyruğu başlıklı makaleyi inceleyin.

Bu bölümde ListTraversalSample'a atıfta bulunulmaktadır.

Bağlayıcı giriş noktasını uygulama

main() yöntemi, bir Application örneği oluşturur ve start() işlevini çağırır. ListingConnector şablonunu oluşturmak için IndexingApplication.Builder kullanın.

ListTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a
 * list traversal connector.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new SampleRepository();
  IndexingConnector connector = new ListingConnector(repository);
  IndexingApplication application = new IndexingApplication.Builder(connector, args).build();
  application.start();
}

Depo arayüzünü uygulama

ListingConnector için aşağıdaki yöntemleri geçersiz kılın:

  • init(): Depo kurulumu için.
  • getIds(): Tüm kayıtların kimliklerini ve karma değerlerini almak için.
  • getDoc(): Öğeleri dizine eklemek, güncellemek veya dizinden silmek için kullanılır.
  • (İsteğe bağlı) getChanges(): Değişiklik algılama kullanılarak yapılan artımlı güncellemeler için.
  • (İsteğe bağlı) close(): Depo temizliği için.

Liste geçişini gerçekleştirme

Kimlikleri ve karma değerlerini almak için getIds() değerini geçersiz kılın. Cloud Search dizine ekleme kuyruğundaki her öğeyi işlemek için getDoc() değerini geçersiz kılın.

Öğe kimliklerini ve karma değerlerini gönderme

Kimlikleri ve içerik karmalarını getirmek için getIds() değerini geçersiz kılın. Bunları bir PushItems dizin oluşturma sırası isteği olarak paketleyin.

ListTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
for (Map.Entry<Integer, Long> entry : this.documents.entrySet()) {
  String documentId = Integer.toString(entry.getKey());
  String hash = this.calculateMetadataHash(entry.getKey());
  PushItem item = new PushItem().setMetadataHash(hash);
  log.info("Pushing " + documentId);
  allIds.addPushItem(documentId, item);
}

Kimlikleri ve karma değerlerini paketlemek için PushItems.Builder kullanın.

ListTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();
return iterator;
Her öğeyi alıp işleme

Öğeleri dizine ekleme sırasına almak için getDoc() değerini geçersiz kılın. Öğeler yeni, değiştirilmiş, değiştirilmemiş veya silinmiş olabilir.

  1. Öğe kimliğinin depoda olup olmadığını kontrol edin. Değilse silin.
  2. Durum için dizine yoklama yapın. Değiştirilmediyse (ACCEPTED) herhangi bir işlem yapmayın.
  3. Dizine eklenen değiştirilmiş veya yeni öğeler: İzinleri ayarlayın, meta verileri ayarlayın, RepositoryDoc içine birleştirin ve döndürün.
Silinen öğeleri yönetme

Bu snippet, bir öğenin mevcut olup olmadığını belirleme ve mevcut değilse silme işleminin nasıl yapılacağını gösterir.

ListTraversalSample.java
String resourceName = item.getName();
int documentId = Integer.parseInt(resourceName);

if (!documents.containsKey(documentId)) {
  // Document no longer exists -- delete it
  log.info(() -> String.format("Deleting document %s", item.getName()));
  return ApiOperations.deleteItem(resourceName);
}
Değiştirilmeyen öğeleri işleme

Değişmeyen öğeleri işlemek için dizine ekleme sırasını yoklayın.

ListTraversalSample.java
String currentHash = this.calculateMetadataHash(documentId);
if (this.canSkipIndexing(item, currentHash)) {
  // Document neither modified nor deleted, ack the push
  log.info(() -> String.format("Document %s not modified", item.getName()));
  PushItem pushItem = new PushItem().setType("NOT_MODIFIED");
  return new PushItems.Builder().addPushItem(resourceName, pushItem).build();
}

Örnekte, değişiklikleri algılamak için karma kullanılır.

ListTraversalSample.java
/**
 * Checks to see if an item is already up to date
 *
 * @param previousItem Polled item
 * @param currentHash  Metadata hash of the current github object
 * @return PushItem operation
 */
private boolean canSkipIndexing(Item previousItem, String currentHash) {
  if (previousItem.getStatus() == null || previousItem.getMetadata() == null) {
    return false;
  }
  String status = previousItem.getStatus().getCode();
  String previousHash = previousItem.getMetadata().getHash();
  return "ACCEPTED".equals(status)
      && previousHash != null
      && previousHash.equals(currentHash);
}
Bir öğenin izinlerini ayarlama

Depolar, bir öğeye erişimi olan kullanıcıları veya grupları belirlemek için Erişim Kontrol Listelerini (EKL'ler) kullanır. EKL, yetkili kullanıcıların veya grupların kimliklerini listeler.

Kullanıcıların yalnızca erişmeye yetkili oldukları arama sonuçlarını görmelerini sağlamak için deponuzun EKL'lerini kopyalamanız gerekir. Google Cloud Search'ün doğru erişim düzeyini sağlayabilmesi için bir öğeyi dizine eklerken ACL'yi ekleyin.

İçerik Bağlayıcı SDK'sı, çoğu deponun erişim kontrol listelerini modellemek için sınıflar ve yöntemler içerir. Deponuzun erişim kontrol listelerini analiz edin ve dizine ekleme sırasında Cloud Search için karşılık gelen erişim kontrol listeleri oluşturun. Devralmayı kullananlar gibi karmaşık erişim kontrol listelerini modellemek için dikkatli bir planlama gerekir. Daha fazla bilgi için Cloud Search ACL'leri başlıklı makaleyi inceleyin.

Erişimi ayarlamak için Acl.Builder sınıfını kullanın. Tam geçiş örneğindeki bu snippet, tüm alan kullanıcılarının (getCustomerPrincipal()) tüm öğeleri (setReaders()) okumasına olanak tanır:

FullTraversalSample.java
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

Özellikle devralma modellerini kullanan depo erişim kontrol listelerinin doğru şekilde modellenmesi için Cloud Search erişim kontrol listelerindeki bilgiler gerekir.

Öğe için meta verileri ayarlama
ListTraversalSample.java
// Url is required. Use google.com as a placeholder for this sample.
String viewUrl = "https://www.google.com";

// Version is required, set to current timestamp.
byte[] version = Longs.toByteArray(System.currentTimeMillis());

// Set metadata hash so queue can detect changes
String metadataHash = this.calculateMetadataHash(documentId);

// Using the SDK item builder class to create the document with
// appropriate attributes. This can be expanded to include metadata
// fields etc.
Item item = IndexingItemBuilder.fromConfiguration(Integer.toString(documentId))
    .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
    .setAcl(acl)
    .setSourceRepositoryUrl(IndexingItemBuilder.FieldOrValue.withValue(viewUrl))
    .setVersion(version)
    .setHash(metadataHash)
    .build();
Dizinlenebilir öğe oluşturma
ListTraversalSample.java
// For this sample, content is just plain text
String content = String.format("Hello world from sample doc %d", documentId);
ByteArrayContent byteContent = ByteArrayContent.fromString("text/plain", content);

// Create the fully formed document
RepositoryDoc doc = new RepositoryDoc.Builder()
    .setItem(item)
    .setContent(byteContent, IndexingService.ContentFormat.TEXT)
    .build();

Dizine ekleme isteğini ASYNCHRONOUS veya SYNCHRONOUS olarak ayarlamak için RepositoryDoc.Builder sınıfının setRequestMode() yöntemini kullanın:

ASYNCHRONOUS
Bu modda, dizine ekleme ile yayınlama arasındaki gecikme daha uzundur ancak daha yüksek bir işleme hızı kotası desteklenir. Bir deponun tamamının ilk dizine eklenmesi (dolgu) için eş zamansız modu kullanın.
SYNCHRONOUS
Bu modda, dizine ekleme ile yayınlama arasındaki gecikme süresi daha kısadır ancak işleme hızı kotası daha düşüktür. Depo güncellemelerini ve değişikliklerini dizine eklemek için eşzamanlı modu kullanın. İstek modu belirtilmezse varsayılan olarak SYNCHRONOUS olur.

Sonraki adımlar

İsterseniz aşağıdaki adımları uygulayabilirsiniz:

  • (İsteğe bağlı) Kapatmadan önce kaynakları serbest bırakmak için close() yöntemini uygulayın.
  • (İsteğe bağlı) İçerik Bağlayıcı SDK'sını kullanarak kimlik bağlayıcı oluşturun.

Şablon sınıfı kullanarak grafik geçişi bağlayıcısı oluşturma

Cloud Search dizine ekleme sırası, depodaki her öğe için kimlikleri ve isteğe bağlı karma değerlerini tutar. Grafik geçişi bağlayıcısı, öğe kimliklerini Google Cloud Search dizine ekleme sırasına gönderir ve dizine ekleme için bunları tek tek alır. Google Cloud Search, kuyrukları korur ve öğe durumunu (ör. bir öğenin depodan silinip silinmediği) belirlemek için kuyruk içeriklerini karşılaştırır. Cloud Search dizine ekleme sırası hakkında daha fazla bilgi için Google Cloud Search dizine ekleme sırası başlıklı makaleyi inceleyin.

Dizin oluşturma sırasında, öğe içeriği veri deposundan alınır ve tüm alt öğe kimlikleri sıraya gönderilir. Bağlayıcı, tüm öğeler işlenene kadar üst ve alt kimlikleri yinelemeli olarak işler.

Bağlayıcının giriş noktasını uygulama

Bir bağlayıcının giriş noktası main() yöntemidir. Bu yöntem, Application sınıfının bir örneğini oluşturur ve bağlayıcıyı çalıştırmak için start() yöntemini çağırır.

Çağırmadan önce application.start(), ListingConnector şablonunu oluşturmak için IndexingApplication.Builder sınıfını kullanın. ListingConnector, yöntemlerini uyguladığınız bir Repository nesnesini kabul eder.

Depo arayüzünü uygulama

init(), getIds(), getDoc() ve isteğe bağlı olarak getChanges() veya close() öğesini geçersiz kılın.

Grafik geçişini gerçekleştirme

İlk kimlikleri almak için getIds(), öğeleri işlemek ve alt öğe kimliklerini sıraya göndermek için getDoc() işlevini geçersiz kılın.

Öğe kimliklerini ve karma değerlerini gönderme
GraphTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);
Her öğeyi alıp işleme
  1. Kimliğin depoda olup olmadığını kontrol edin. Aksi takdirde öğeyi silin.
  2. Mevcut öğeler için izinleri ve meta verileri ayarlayın ve bunları bir RepositoryDoc içinde birleştirin.
  3. Alt öğe kimliklerini dizine ekleme sırasına gönderin.
  4. RepositoryDoc öğesini iade edin.
Silinen öğeleri yönetme
GraphTraversalSample.java
String resourceName = item.getName();
if (documentExists(resourceName)) {
  return buildDocumentAndChildren(resourceName);
}
// Document doesn't exist, delete it
log.info(() -> String.format("Deleting document %s", resourceName));
return ApiOperations.deleteItem(resourceName);
Meta verileri ayarlama ve öğeyi oluşturma
GraphTraversalSample.java
// Url is required. Use google.com as a placeholder for this sample.
String viewUrl = "https://www.google.com";

// Version is required, set to current timestamp.
byte[] version = Longs.toByteArray(System.currentTimeMillis());

// Using the SDK item builder class to create the document with
// appropriate attributes. This can be expanded to include metadata
// fields etc.
Item item = IndexingItemBuilder.fromConfiguration(documentId)
    .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
    .setAcl(acl)
    .setSourceRepositoryUrl(IndexingItemBuilder.FieldOrValue.withValue(viewUrl))
    .setVersion(version)
    .build();
GraphTraversalSample.java
// For this sample, content is just plain text
String content = String.format("Hello world from sample doc %s", documentId);
ByteArrayContent byteContent = ByteArrayContent.fromString("text/plain", content);

RepositoryDoc.Builder docBuilder = new RepositoryDoc.Builder()
    .setItem(item)
    .setContent(byteContent, IndexingService.ContentFormat.TEXT);
Alt öğe kimliklerini dizine ekleme sırasına yerleştirme
GraphTraversalSample.java
// Queue the child nodes to visit after indexing this document
Set<String> childIds = getChildItemNames(documentId);
for (String id : childIds) {
  log.info(() -> String.format("Pushing child node %s", id));
  PushItem pushItem = new PushItem();
  docBuilder.addChildId(id, pushItem);
}

RepositoryDoc doc = docBuilder.build();

REST API'yi kullanarak içerik bağlayıcısı oluşturma

Aşağıdaki bölümlerde, REST API'yi kullanarak nasıl içerik bağlayıcı oluşturacağınız açıklanmaktadır.

Geçiş stratejinizi belirleme

Stratejiler (Tam, Liste ve Grafik), SDK'dakiyle aynıdır. REST API'yi kullanarak seçtiğiniz stratejiyi uygulayın.

Geçiş stratejinizi uygulama ve öğeleri dizine ekleme

Şemanızı kaydedin, ardından dizini aşağıdaki yöntemlerle doldurun:

  1. (İsteğe bağlı) items.upload 100 KiB'tan büyük dosyalar için.
  2. (İsteğe bağlı) Medya dosyaları için media.upload
  3. items.index öğeyi dizine eklemek için.

    Örnek dizine ekleme isteği:

    {
      "name": "datasource/<data_source_id>/items/titanic",
      "acl": {
        "readers": [
          {
            "gsuitePrincipal": {
              "gsuiteDomain": true
            }
          }
        ]
      },
      "metadata": {
        "title": "Titanic",
        "viewUrl": "http://www.imdb.com/title/tt2234155/",
        "objectType": "movie"
      },
      "structuredData": {
        "object": {
          "properties": [
            {
              "name": "movieTitle",
              "textValues": { "values": ["Titanic"] }
            }
          ]
        }
      },
      "content": {
        "inlineContent": "A seventeen-year-old aristocrat falls in love...",
        "contentFormat": "TEXT"
      },
      "version": "01",
      "itemType": "CONTENT_ITEM"
    }
    
  4. (İsteğe bağlı) Dizine eklemeyi doğrulamak için items.get simgesini kullanın.

Depo değişikliklerini işleme

Tam dizin oluşturma için tüm depoyu düzenli olarak yeniden dizine ekleyin. Liste veya grafik geçişi için değişiklikleri izlemek ve yalnızca değişenleri dizine eklemek üzere Google Cloud Indexing Queue'yu kullanın. Sıraya öğe eklemek için items.push simgesini kullanın.