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

İçerik bağlayıcısı, bir kuruluşun veri havuzunda gezinip bir veri kaynağını doldurmak için kullanılan bir yazılım programıdır. Google, içerik bağlayıcıları geliştirmek için aşağıdaki seçenekleri sunar:

  • Content Connector SDK'sı. Bu, Java'da programlama yapıyorsanız iyi bir seçenektir. Content Connector SDK, REST API'nin etrafında hızla bağlayıcılar oluşturmanızı sağlayan bir sarmalayıcıdır. SDK kullanarak içerik bağlayıcı oluşturmak için Content Connector SDK kullanarak içerik bağlayıcı oluşturma konusuna bakın.

  • Alt düzey REST API veya API kitaplıkları. Java'da programlama yapmıyorsanız veya kod tabanınız bir REST API veya kitaplığı daha iyi barındırıyorsa bu seçenekleri kullanın. REST API kullanarak içerik bağlayıcı oluşturmak için REST API kullanarak içerik bağlayıcı oluşturma bölümüne bakın.

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

  1. Yapılandırma parametrelerini okur ve işler.
  2. Dizine eklenebilir farklı veri parçalarını ("items") üçüncü taraf içerik deposundan çeker.
  3. EKL'leri, meta verileri ve içerik verilerini dizine eklenebilir öğelerde birleştirir.
  4. Öğeleri Cloud Search veri kaynağına dizine ekler.
  5. (isteğe bağlı) Üçüncü taraf içerik deposundan gelen bildirimleri değiştirir. Değişiklik bildirimleri, Cloud Search veri kaynağının üçüncü taraf veri havuzuyla senkronize olmasını sağlamak 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, Content Connector SDK kullanılarak içerik bağlayıcının nasıl oluşturulacağı açıklanmaktadır.

Bağımlılıklar ayarlayın

SDK'yı kullanmak için derleme dosyanıza belirli bağımlılıkları dahil etmeniz gerekir. Derleme ortamınızın bağımlılıklarını görüntülemek için aşağıdaki bir sekmeyi tıklayın:

Maven

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

Gradle

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ının, deponuzun kimliği gibi bağlayıcı tarafından kullanılan parametreleri içeren bir yapılandırma dosyası vardır. Parametreler, api.sourceId=1234567890abcdef gibi anahtar/değer çiftleri olarak tanımlanır.

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

  • İçerik bağlayıcısı için api.sourceId ve api.serviceAccountPrivateKeyFile parametrelerini deponuzun ve deponuza erişmek için gereken özel anahtarınızın konumunu tanımladığını belirtmeniz gerekir.
  • Bir kimlik bağlayıcısı için bu parametre harici kimlik kaynağınızın konumunu tanımladığından api.identitySourceId değerini belirtmeniz gerekir. Kullanıcıları senkronize ediyorsanız api.customerId öğesini kuruluşunuzun Google Workspace hesabı için benzersiz kimlik olarak da bildirmeniz gerekir.

Google tarafından sağlanan diğer parametrelerin varsayılan değerlerini geçersiz kılmak istemiyorsanız bu parametreleri yapılandırma dosyanızda belirtmeniz gerekmez. Google tarafından sağlanan yapılandırma parametreleri (ör. belirli kimliklerin ve anahtarların nasıl oluşturulacağı) hakkında ek bilgi için Google'ın sağladığı yapılandırma parametrelerine bakın.

Yapılandırma dosyanızda kullanmak üzere kendi deponuza özgü parametreleri de tanımlayabilirsiniz.

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

Yapılandırma dosyasını bağlayıcınıza iletmek için config adlı sistem özelliğini ayarlayın. Bağlayıcıyı başlatırken -D bağımsız değişkenini kullanarak özelliği ayarlayabilirsiniz. Örneğin, aşağıdaki komut bağlayıcıyı MyConfig.properties yapılandırma dosyasıyla başlatır:

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

Bu bağımsız değişken yoksa SDK, connector-config.properties adlı varsayılan bir yapılandırma dosyasına erişmeye çalışır.

Geçiş stratejinizi belirleme

İçerik bağlayıcısının birincil işlevi, depoya gidip verilerini dizine eklemektir. Deponuzdaki verilerin boyutuna ve düzenine göre bir geçiş stratejisi uygulamanız gerekir. Kendi stratejinizi tasarlayabilir veya SDK'da uygulanan aşağıdaki stratejiler arasından seçim yapabilirsiniz:

Tam geçiş stratejisi

Tam geçiş stratejisi, deponun tamamını tarar ve her öğeyi gizlice dizine ekler. Bu strateji genellikle küçük bir veri havuzunuz olduğunda ve her dizine ekleme esnasında tam geçiş yapma yükünü karşılayabilecek durumda kullanılır.

Bu geçiş stratejisi, çoğunlukla statik, hiyerarşik olmayan veriler içeren küçük depolar için uygundur. Bu geçiş stratejisini, değişiklik algılaması zor olduğunda veya depo tarafından desteklenmediğinde de kullanabilirsiniz.

Geçiş geçişi stratejisi

Liste geçiş stratejisi, tüm alt düğümler dahil, deponun tamamını tarayarak her bir öğenin durumunu belirler. Ardından, bağlayıcı ikinci bir geçişte yer alır ve yalnızca son dizine eklenen veya yeni eklenen öğeleri dizine ekler. Bu strateji genellikle (dizin her güncellendiğinde tam geçiş yapmak zorunda kalmak yerine) mevcut bir dizinde artımlı güncellemeler yapmak için kullanılır.

Bu geçiş stratejisi, veri havuzunun değişiklik algılaması zor olduğunda veya desteklenmediğinde, hiyerarşik olmayan verileriniz varsa ve çok büyük veri kümeleriyle çalışıyorsanız uygundur.

Grafik geçişi

Grafik geçiş stratejisi, her bir öğenin durumunu belirleyen üst düğümün tamamını tarar. Ardından, bağlayıcı ikinci bir kart alır ve yalnızca kök düğümdeki öğeleri yeni dizine ekler veya son dizine eklemeden bu yana güncellenmiştir. Son olarak, bağlayıcı tüm alt kimlikleri iletir ve ardından, yeni veya güncellenmiş olan alt düğümlerdeki öğeleri dizine ekler. Bağlayıcı, tüm öğeler ele alınana kadar tüm alt düğümler boyunca yinelemeli olarak devam eder. Bu geçiş, genellikle tüm kimliklerin listelenmesinin mümkün olmadığı hiyerarşik depolar için kullanılır.

Bu strateji, taranması gereken bir dizi dizin veya web sayfası gibi hiyerarşik verileriniz varsa uygundur.

Bu geçiş stratejilerinin her biri SDK'da bir şablon bağlayıcı sınıfı tarafından uygulanır. Kendi geçiş stratejinizi uygulayabilirsiniz, ancak bu şablonlar bağlayıcınızın geliştirme sürecini önemli ölçüde hızlandırır. Bir şablon kullanarak bağlayıcı oluşturmak için geçiş stratejinize karşılık gelen bölüme ilerleyin:

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

Belgelerin bu bölümü, FullTraversalSample örneğindeki kod snippet'lerini belirtir.

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

Bağlayıcının giriş noktası main() yöntemidir. Bu yöntemin birincil görevi, Application sınıfının bir örneğini oluşturup start() yöntemini çağırmaktır kullanın.

Aramadan önce application.start() , IndexingApplication.Builder sınıfını oluşturmak için FullTraversalConnector şablonu. FullTraversalConnector, yöntemlerini uyguladığınız bir Repository nesnesini kabul eder. Aşağıdaki kod snippet'i, main() yönteminin nasıl uygulanacağını gösterir:

TamTraversalSample.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, bağlayıcınızın main() yöntemi Application.build çağırdıktan sonra arka planda initConfig() yöntemini çağırır. initConfig() yöntemi aşağıdaki görevleri yerine getirir:

  1. Configuration'in başlatılmadığından emin olmak için Configuation.isInitialized() yöntemini çağırır.
  2. Google tarafından sağlanan anahtar/değer çiftleriyle bir Configuration nesnesi başlatır. Her bir anahtar/değer çifti, Configuration nesnesi içindeki bir ConfigValue nesnesinde depolanır.

Repository arayüzünü uygulama

Repository nesnesinin tek amacı, depo öğelerinin geçişini ve dizine eklenmesini sağlamaktır. Şablon kullanırken, içerik bağlayıcısı oluşturmak için Repository arayüzünde yalnızca belirli yöntemleri geçersiz kılmanız gerekir. Geçersiz kıldığınız yöntemler, kullandığınız şablona ve geçiş stratejisine bağlıdır. FullTraversalConnector için aşağıdaki yöntemleri geçersiz kılın:

  • init() yöntemi. Veri deposu kurulumu ve başlatma işlemleri yapmak için init() yöntemini geçersiz kılın.

  • getAllDocs() yöntemi. Veri deposundaki tüm öğeleri çekip dizine eklemek için getAllDocs() yöntemini geçersiz kılın. Bu yöntem, her planlanan geçiş için (yapılandırmanız tarafından tanımlandığı şekilde) bir kez çağrılır.

  • (isteğe bağlı) getChanges() yöntemidir. Deponuz değişiklik algılamayı destekliyorsa getChanges() yöntemini geçersiz kılın. Bu yöntem, değiştirilen öğeleri almak ve dizine eklemek için planlanan her artımlı geçiş (yapılandırmanız tarafından tanımlandığı şekilde) için bir kez çağrılır.

  • (isteğe bağlı) close() yöntemidir. Depo temizleme işlemi gerçekleştirmeniz gerekiyorsa close() yöntemini geçersiz kılın. Bu yöntem, bağlayıcının kapatılması sırasında bir kez çağrılır.

Repository nesnesinin yöntemlerinin her biri bir tür ApiOperation nesnesi döndürür. Bir ApiOperation nesnesi, kod deponuzun gerçek dizine eklenmesini gerçekleştirmek için bir veya birden fazla IndexingService.indexItem() çağrısı şeklinde bir işlem gerçekleştirir.

Özel yapılandırma parametrelerini alma

Bağlayıcınızın yapılandırmasını işlemenin bir parçası olarak, Configuration nesnesinden tüm özel parametreleri almanız gerekir. Bu görev genellikle Repository sınıfının init() yönteminde gerçekleştirilir.

Configuration sınıfı, bir yapılandırmadan farklı veri türlerini almak için çeşitli yöntemlere sahiptir. Her yöntem bir ConfigValue nesnesi döndürür. Daha sonra, gerçek değeri almak için ConfigValue nesnesinin get() yöntemini kullanırsınız. Aşağıdaki FullTraversalSample snippet'inde bir Configuration nesnesinden nasıl tek bir özel tam sayı değeri alınacağı gösterilmektedir:

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

Birkaç değer içeren bir parametreyi almak ve ayrıştırmak için verileri belirli parçalara ayrıştırmak amacıyla Configuration sınıfının tür ayrıştırıcılarından birini kullanın. Eğitim bağlayıcısındaki aşağıdaki snippet, GitHub depo adlarının bir listesini almak için getMultiValue yöntemini kullanır:

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

Tam geçiş yapma

Tam geçiş yapmak ve deponuzu dizine eklemek için geçersiz kılın getAllDocs(). getAllDocs() yöntemi bir kontrol noktasını kabul eder. Kontrol noktası, işlemin kesintiye uğraması durumunda belirli bir öğede dizine ekleme işlemini devam ettirmek için kullanılır. Deponuzdaki her öğe için getAllDocs()yöntemindeki şu adımları uygulayın:

  1. İzinleri ayarlayın.
  2. Dizine eklediğiniz öğenin meta verilerini ayarlayın.
  3. Meta veri ile öğeyi dizine eklenebilir tek bir RepositoryDoc dosyasında birleştirin.
  4. Her dizine eklenebilir öğeyi getAllDocs() yöntemi tarafından döndürülen bir yineleyicide paketleyin. Not:getAllDocs() gerçekte birCheckpointCloseableIterable, bu daApiOperation }nesneler, her biri bir API isteğini temsil eden her nesneRepositoryDoc.

Öğe grubu tek bir çağrıda işlenemeyecek kadar büyükse bir kontrol noktası ekleyin ve dizine ekleme için daha fazla öğenin kullanılabileceğini belirtmek üzere hasMore(true) değerini ayarlayın.

Bir öğenin izinlerini ayarlama

Deponuz, bir öğeye erişimi olan kullanıcıları veya grupları tanımlamak için bir Erişim Kontrol Listesi (EKL) kullanır. EKL, öğeye erişebilen grup veya kullanıcıların kimlik listesidir.

Bir öğeye yalnızca erişimi olan kullanıcıların bir öğeyi arama sonucunda görebilmesini sağlamak için deponuz tarafından kullanılan EKL'yi kopyalamanız gerekir. Google Cloud Search'ün öğeye doğru erişim düzeyini sağlamak için ihtiyaç duyduğu bilgilere sahip olması amacıyla bir öğe dizine eklenirken öğenin EKL'si eklenmelidir.

Content Connector SDK, çoğu deponun EKL'lerini modellemek için zengin bir EKL sınıfları ve yöntemleri sağlar. Deponuzdaki her öğenin EKL'sini analiz etmeniz ve bir öğeyi dizine eklediğinizde Google Cloud Search için ilgili bir EKL oluşturmanız gerekir. Deponuzun EKL'si, EKL devralma gibi kavramlar kullanıyorsa bu EKL'yi modellemek zor olabilir. Google Cloud Search EKL'leri hakkında daha fazla bilgi için Google Cloud Search EKL'leri konusuna bakın.

Not: Cloud Search Dizine Ekleme API'si tek alanlı EKL'leri destekler. Web alanları arası EKL'leri desteklemez. EKL kullanarak her bir öğeye erişimi ayarlamak için Acl.Builder sınıfını kullanın. Tam geçiş örneğinden alınan aşağıdaki kod snippet'i, tüm kullanıcıların veya "ana yöneticilerin" (getCustomerPrincipal()) tüm öğelere (.setReaders()) göz atın.

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

Depo için uygun şekilde EKL'ler oluşturmak üzere EKL'leri anlamanız gerekir. Örneğin, alt klasörlerin izinleri üst klasörlerden devraldığı bir tür devralma modeli kullanan bir dosya sistemindeki dosyaları dizine eklemiş olabilirsiniz. EKL devrinin modellenmesi, Google Cloud Search EKL'leri kapsamındaki ek bilgileri gerektirir

Bir öğenin meta verilerini ayarlama

Meta veriler bir Item nesnesinde depolanır. Item oluşturmak üzere öğe için minimum benzersiz dize kimliği, öğe türü, EKL, URL ve sürüm gerekir. Aşağıdaki kod snippet'i, IndexingItemBuilder yardımcı sınıfını kullanarak nasıl Item oluşturulacağını gösterir.

TamTraversalSample.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();

Dizine eklenebilir öğe oluşturma

Öğenin meta verilerini ayarladıktan sonra RepositoryDoc.Builder sınıfını kullanarak gerçek dizine eklenebilir öğeyi oluşturabilirsiniz. Aşağıdaki örnekte, tek bir dizine eklenebilir öğenin nasıl oluşturulacağı gösterilmektedir.

TamTraversalSample.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, gerçek IndexingService.indexItem() isteğini gerçekleştiren bir ApiOperation türüdür.

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

ASYNCHRONOUS
Eşzamansız mod, daha uzun dizine eklemeden sunuma gecikmeye neden olur ve dizine ekleme istekleri için büyük işleme hızı kotası kullanır. Deponun tamamının ilk dizine eklenmesi (dolgu) için eşzamansız mod kullanılması önerilir.
SYNCHRONOUS
Eşzamanlı mod, dizine ekleme ve yayınlamada daha kısa gecikme sağlar ve işleme hızını sınırlandırır. Depoda yapılan güncellemelerin ve değişikliklerin dizine eklenmesi için eşzamanlı mod önerilir. Belirtilmezse istek modu varsayılan olarak SYNCHRONOUS değerine ayarlanır.

Dizine eklenebilir her bir öğeyi yineleyicide paketleme

getAllDocs() yöntemi, başta CheckpointCloseableIterable öğesi olmak üzere bir Iterator döndürür, RepositoryDoc nesneleri. Yineleyici oluşturmak ve döndürmek için CheckpointClosableIterableImpl.Builder sınıfını kullanabilirsiniz. Aşağıdaki kod snippet'i, bir yinelemenin nasıl oluşturulacağını ve döndürüleceğini göstermektedir.

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

SDK, yinelemeyi içeren her dizine ekleme çağrısını yürütür.

Sonraki Adımlar

Atabileceğiniz birkaç adım aşağıda verilmiştir:

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

Depodaki her bir öğenin kimliklerini ve isteğe bağlı karma değerlerini tutmak için Cloud Search Dizine Ekleme Sırası kullanılır. Liste geçiş bağlayıcısı, öğe kimliklerini Google Cloud Search Dizine Ekleme Sırası'na aktarıp bunları tek tek dizine ekleme için alır. Google Cloud Search, bir öğenin depodan silinip silinmediği gibi öğe durumunu belirlemek için sıraları saklar ve sıra 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ı bölümüne bakın.

Belgelerin bu bölümü, ListTraversalSample örneğindeki kod snippet'lerini belirtir.

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

Bağlayıcının giriş noktası main() yöntemidir. Bu yöntemin birincil görevi, Application sınıfının bir örneğini oluşturup start() yöntemini çağırmaktır kullanın.

Aramadan önce application.start() , IndexingApplication.Builder sınıfını oluşturmak için ListingConnector şablonu. ListingConnector, yöntemlerini uyguladığınız bir Repository nesnesini kabul eder. Aşağıdaki snippet'te ListingConnector ve ilişkili Repository öğesinin nasıl başlatılacağı gösterilmektedir:

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

SDK, bağlayıcınızın main() yöntemi Application.build çağırdıktan sonra arka planda initConfig() yöntemini çağırır. initConfig() yöntemi:

  1. Configuration'in başlatılmadığından emin olmak için Configuation.isInitialized() yöntemini çağırır.
  2. Google tarafından sağlanan anahtar/değer çiftleriyle bir Configuration nesnesi başlatır. Her bir anahtar/değer çifti, Configuration nesnesi içindeki bir ConfigValue nesnesinde depolanır.

Repository arayüzünü uygulama

Repository nesnesinin tek amacı, depo öğelerinin geçişini ve dizine eklenmesini sağlamaktır. Şablon kullanırken, içerik bağlayıcısı oluşturmak için yalnızca Repository arayüzündeki belirli yöntemleri geçersiz kılmanız gerekir. Geçersiz kıldığınız yöntemler, kullandığınız şablona ve geçiş stratejisine bağlıdır. ListingConnector için aşağıdaki yöntemleri geçersiz kılın:

  • init() yöntemi. Veri deposu kurulumu ve başlatma işlemleri yapmak için init() yöntemini geçersiz kılın.

  • getIds() yöntemi. Depodaki tüm kayıtların kimliklerini ve karma değerlerini almak için getIds() yöntemini geçersiz kılın.

  • getDoc() yöntemi. Dizine yeni öğe eklemek, bu öğeleri güncellemek, değiştirmek veya silmek için getDoc() yöntemini geçersiz kılın.

  • (isteğe bağlı) getChanges() yöntemidir. Deponuz değişiklik algılamayı destekliyorsa getChanges() yöntemini geçersiz kılın. Bu yöntem, değiştirilen öğeleri almak ve dizine eklemek için planlanan her artımlı geçiş (yapılandırmanız tarafından tanımlandığı şekilde) için bir kez çağrılır.

  • (isteğe bağlı) close() yöntemidir. Depo temizleme işlemi gerçekleştirmeniz gerekiyorsa close() yöntemini geçersiz kılın. Bu yöntem, bağlayıcının kapatılması sırasında bir kez çağrılır.

Repository nesnesinin yöntemlerinin her biri bir tür ApiOperation nesnesi döndürür. Bir ApiOperation nesnesi, kod deponuzun gerçek dizine eklenmesini gerçekleştirmek için bir veya birden fazla IndexingService.indexItem() çağrısı şeklinde bir işlem gerçekleştirir.

Özel yapılandırma parametrelerini alma

Bağlayıcınızın yapılandırmasını işlemenin bir parçası olarak, Configuration nesnesinden tüm özel parametreleri almanız gerekir. Bu görev genellikle Repository sınıfının init() yönteminde gerçekleştirilir.

Configuration sınıfı, bir yapılandırmadan farklı veri türlerini almak için çeşitli yöntemlere sahiptir. Her yöntem bir ConfigValue nesnesi döndürür. Daha sonra, gerçek değeri almak için ConfigValue nesnesinin get() yöntemini kullanırsınız. Aşağıdaki FullTraversalSample snippet'inde bir Configuration nesnesinden nasıl tek bir özel tam sayı değeri alınacağı gösterilmektedir:

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

Birkaç değer içeren bir parametreyi almak ve ayrıştırmak için verileri belirli parçalara ayrıştırmak amacıyla Configuration sınıfının tür ayrıştırıcılarından birini kullanın. Eğitim bağlayıcısındaki aşağıdaki snippet, GitHub depo adlarının bir listesini almak için getMultiValue yöntemini kullanır:

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

Liste geçişini gerçekleştirme

Depodaki tüm kayıtlar için kimlikleri ve karma değerlerini almak üzere getIds() yöntemini geçersiz kılın. getIds() yöntemi bir kontrol noktasını kabul eder. Kontrol noktası, işlemin kesintiye uğraması durumunda belirli bir öğede dizine eklemeye devam etmek için kullanılır.

Ardından, Cloud Search Dizine Ekleme Sırasındaki her bir öğeyi işlemek için getDoc() yöntemini geçersiz kılın.

Push öğesi kimlikleri ve karma değerleri

Depodan öğe kimliklerini ve bunlarla ilişkili içerik karma değerlerini almak için geçersiz kılın. getIds() Kimlik ve karma değer çiftleri daha sonra Cloud Search Dizine Ekleme Sırasına push işlemi isteğine paketlenir. Kök veya üst kimlikler genellikle öğe hiyerarşisinin tamamı işlenene kadar ilk olarak alt kimlikleri aktarır.

getIds() yöntemi, dizine eklenecek son öğeyi temsil eden bir kontrol noktasını kabul eder. İşlem noktası, işlemin kesintiye uğraması durumunda belirli bir öğede dizine ekleme işlemini devam ettirmek için kullanılabilir. Deponuzdaki her öğe için getIds() yönteminde şu adımları uygulayın:

  • Depodan her öğe kimliğini ve ilişkili karma değerini alın.
  • Her bir kimlik ve karma değer çiftini bir PushItems olarak paketleyin.
  • Her bir PushItems öğesini, getIds() yöntemi tarafından döndürülen bir yineleyicide birleştirin. Not:getIds() gerçekte birCheckpointCloseableIterable , bu daApiOperation }nesneler, her biri bir API isteğini temsil eden her nesneRepositoryDoc (örneğin, öğeleri sıraya aktarmak gibi)

Aşağıdaki kod snippet'i, her bir öğe kimliğinin ve karma değerinin nasıl alınacağını ve bunları bir PushItems öğesine nasıl ekleyeceğinizi göstermektedir. PushItems, öğeyi Cloud Search Dizine Ekleme Sırasına aktarma ApiOperation isteğidir.

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

Aşağıdaki kod snippet'i, PushItems.Builder kimlik ve karma değerlerini tek bir push paketinde ApiOperation ,

ListTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();
return iterator;

Öğeler, daha ayrıntılı işlenmek üzere Cloud Search Dizine Ekleme Sırasına aktarılır.

Öğeleri alma ve işleme

Cloud Search Dizine Ekleme Sırasındaki her bir öğeyi işlemek için getDoc() ayarını geçersiz kılın. Bir öğe yeni veya değiştirilmiş olabilir ya da artık kaynak depoda mevcut olmayabilir. Yeni veya değiştirilmiş olan her öğeyi alın ve dizine ekleyin. Artık kaynak depoda mevcut olmayan öğeleri dizinden kaldırın.

getDoc() yöntemi, Google Cloud Search Dizine Ekleme Sırasındaki bir Öğeyi kabul eder. Sıradaki her bir öğe için getDoc() yönteminde aşağıdaki adımları uygulayın:

  1. Cloud Search Dizine Ekleme Sırasındaki öğe kimliğinin depoda mevcut olup olmadığını kontrol edin. Öyle değilse, öğeyi dizinden silin.

  2. Öğe durumu için dizin anketi yapın ve bir öğe değiştirilmezse (ACCEPTED) hiçbir şey yapmayın.

  3. Dizin değiştirildi veya yeni öğeler:

    1. İzinleri ayarlayın.
    2. Dizine eklediğiniz öğenin meta verilerini ayarlayın.
    3. Meta veri ile öğeyi dizine eklenebilir tek bir RepositoryDoc dosyasında birleştirin.
    4. RepositoryDoc iade edin.

Not: ListingConnector şablonu, getDoc() yönteminde null döndürülmesini desteklemez. null sorgusu NullPointerException. içinde döndürülür

Silinen öğeleri işleme

Aşağıdaki kod snippet'i, bir öğenin kod deposunda mevcut olup olmadığının nasıl belirleneceğini ve yoksa nasıl silineceğini 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);
}

documents veri havuzunun temsil edildiğini gösteren bir veri yapısı olduğunu unutmayın. documents öğesinde documentID bulunmuyorsa öğeyi dizinden silmek için APIOperations.deleteItem(resourceName) komutunu döndürün.

Değişmeyen öğeleri işleyin

Aşağıdaki kod snippet'i, Cloud Search Dizine Ekleme Sırasında öğe durumunun nasıl anket yapılacağını ve değiştirilmemiş bir öğenin nasıl kullanılacağını gösterir.

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

Öğenin değiştirilip değiştirilmediğini belirlemek için öğenin durumunu ve değişiklik gösterebilecek diğer meta verileri kontrol edin. Bu örnekte, öğenin değiştirilip değiştirilmediğini belirlemek için meta veri karması 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

Deponuz, bir öğeye erişimi olan kullanıcıları veya grupları tanımlamak için bir Erişim Kontrol Listesi (EKL) kullanır. EKL, öğeye erişebilen grup veya kullanıcıların kimlik listesidir.

Bir öğeye yalnızca erişimi olan kullanıcıların bir öğeyi arama sonucunda görebilmesini sağlamak için deponuz tarafından kullanılan EKL'yi kopyalamanız gerekir. Google Cloud Search'ün öğeye doğru erişim düzeyini sağlamak için ihtiyaç duyduğu bilgilere sahip olması amacıyla bir öğe dizine eklenirken öğenin EKL'si eklenmelidir.

Content Connector SDK, çoğu deponun EKL'lerini modellemek için zengin bir EKL sınıfları ve yöntemleri sağlar. Deponuzdaki her öğenin EKL'sini analiz etmeniz ve bir öğeyi dizine eklediğinizde Google Cloud Search için ilgili bir EKL oluşturmanız gerekir. Deponuzun EKL'si, EKL devralma gibi kavramlar kullanıyorsa bu EKL'yi modellemek zor olabilir. Google Cloud Search EKL'leri hakkında daha fazla bilgi için Google Cloud Search EKL'leri konusuna bakın.

Not: Cloud Search Dizine Ekleme API'si tek alanlı EKL'leri destekler. Web alanları arası EKL'leri desteklemez. EKL kullanarak her bir öğeye erişimi ayarlamak için Acl.Builder sınıfını kullanın. Tam geçiş örneğinden alınan aşağıdaki kod snippet'i, tüm kullanıcıların veya "ana yöneticilerin" (getCustomerPrincipal()) tüm öğelere (.setReaders()) göz atın.

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

Depo için uygun şekilde EKL'ler oluşturmak üzere EKL'leri anlamanız gerekir. Örneğin, alt klasörlerin izinleri üst klasörlerden devraldığı bir tür devralma modeli kullanan bir dosya sistemindeki dosyaları dizine eklemiş olabilirsiniz. EKL devrinin modellenmesi, Google Cloud Search EKL'leri kapsamındaki ek bilgileri gerektirir

Bir öğenin meta verilerini ayarlama

Meta veriler bir Item nesnesinde depolanır. Item oluşturmak üzere öğe için minimum benzersiz dize kimliği, öğe türü, EKL, URL ve sürüm gerekir. Aşağıdaki kod snippet'i, IndexingItemBuilder yardımcı sınıfını kullanarak nasıl Item oluşturulacağını gösterir.

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

Dizine eklenebilir bir öğe oluşturma

Öğenin meta verilerini ayarladıktan sonra RepositoryDoc.Builder kullanarak gerçek dizine eklenebilir öğeyi oluşturabilirsiniz. Aşağıdaki örnekte, tek bir dizine eklenebilir öğenin nasıl oluşturulacağı gösterilmektedir.

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

CRepositoryDoc bir türApiOperation asıl işlemi gerçekleştirenIndexingService.indexItem() request.

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

ASYNCHRONOUS
Eşzamansız mod, daha uzun dizine eklemeden sunuma gecikmeye neden olur ve dizine ekleme istekleri için büyük işleme hızı kotası kullanır. Deponun tamamının ilk dizine eklenmesi (dolgu) için eşzamansız mod kullanılması önerilir.
SYNCHRONOUS
Eşzamanlı mod, dizine ekleme ve yayınlamada daha kısa gecikme sağlar ve işleme hızını sınırlandırır. Depoda yapılan güncellemelerin ve değişikliklerin dizine eklenmesi için eşzamanlı mod önerilir. Belirtilmezse istek modu varsayılan olarak SYNCHRONOUS değerine ayarlanır.

Sonraki Adımlar

Atabileceğiniz birkaç adım aşağıda verilmiştir:

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

Depodaki her bir öğenin kimliklerini ve isteğe bağlı karma değerlerini tutmak için Cloud Search Dizine Ekleme Sırası kullanılır. Grafik geçiş bağlayıcısı, Google Cloud Search Dizine Ekleme Sırasına öğe kimliklerini aktarır ve bunları, dizine ekleme amacıyla teker teker alır. Google Cloud Search, sıraları tutar ve bir öğenin kod deposundan silinip silinmediği gibi öğe durumunu belirlemek için sıra içeriklerini karşılaştırır. Google Arama Dizine Ekleme Sırası hakkında daha fazla bilgi için Google Cloud Arama Dizine Ekleme Sırası bölümüne bakın.

Dizin sırasında öğe içeriği veri deposundan getirilir ve tüm alt öğe kimlikleri sıraya aktarılır. Bağlayıcı, tüm öğeler işlenene kadar üst ve alt kimlikleri tekrarlı bir şekilde işler.

Belgelerin bu bölümü, GraphTraversalSample örneğindeki kod snippet'lerini belirtir.

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

Bağlayıcının giriş noktası main() yöntemidir. Bu yöntemin birincil görevi, Application sınıfının bir örneğini oluşturup start() yöntemini çağırmaktır kullanın.

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

Aşağıdaki snippet'te ListingConnector ve ilişkili Repository öğesinin nasıl başlatılacağı gösterilmektedir:

GraphTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a graph
 * 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();
}

SDK, bağlayıcınızın main() yöntemi Application.build çağırdıktan sonra arka planda initConfig() yöntemini çağırır. initConfig() yöntemi:

  1. Configuration'in başlatılmadığından emin olmak için Configuation.isInitialized() yöntemini çağırır.
  2. Google tarafından sağlanan anahtar/değer çiftleriyle bir Configuration nesnesi başlatır. Her bir anahtar/değer çifti, Configuration nesnesi içindeki bir ConfigValue nesnesinde depolanır.

Repository arayüzünü uygulama

Repository nesnesinin tek amacı, depo öğelerinin geçiş ve dizine ekleme işlemlerini gerçekleştirmektir. Şablon kullanırken, içerik bağlayıcısı oluşturmak için Repository arayüzünde yalnızca belirli yöntemleri geçersiz kılmanız gerekir. Geçersiz kıldığınız yöntemler, kullandığınız şablona ve geçiş stratejisine bağlıdır. ListingConnector için aşağıdaki yöntemleri geçersiz kılarsınız:

  • init() yöntemi. Veri deposu kurulumu ve başlatma işlemleri yapmak için init() yöntemini geçersiz kılın.

  • getIds() yöntemi. Depodaki tüm kayıtların kimliklerini ve karma değerlerini almak için getIds() yöntemini geçersiz kılın.

  • getDoc() yöntemi. Dizine yeni öğe eklemek, bu öğeleri güncellemek, değiştirmek veya silmek için getDoc() yöntemini geçersiz kılın.

  • (isteğe bağlı) getChanges() yöntemidir. Deponuz değişiklik algılamayı destekliyorsa getChanges() yöntemini geçersiz kılın. Bu yöntem, değiştirilen öğeleri almak ve dizine eklemek için planlanan her artımlı geçiş (yapılandırmanız tarafından tanımlandığı şekilde) için bir kez çağrılır.

  • (isteğe bağlı) close() yöntemidir. Depo temizleme işlemi gerçekleştirmeniz gerekiyorsa close() yöntemini geçersiz kılın. Bu yöntem, bağlayıcının kapatılması sırasında bir kez çağrılır.

Repository nesnesinin yöntemlerinin her biri bir tür ApiOperation nesnesi döndürür. Bir ApiOperation nesnesi, kod deponuzun gerçek dizine eklenmesini gerçekleştirmek için bir veya birden fazla IndexingService.indexItem() çağrısı olarak bir işlem gerçekleştirir.

Özel yapılandırma parametrelerini alma

Bağlayıcınızın yapılandırmasını işlemenin bir parçası olarak, Configuration nesnesinden tüm özel parametreleri almanız gerekir. Bu görev genellikle Repository sınıfının init() yönteminde gerçekleştirilir.

Configuration sınıfı, bir yapılandırmadan farklı veri türlerini almak için çeşitli yöntemlere sahiptir. Her yöntem bir ConfigValue nesnesi döndürür. Daha sonra, gerçek değeri almak için ConfigValue nesnesinin get() yöntemini kullanırsınız. Aşağıdaki FullTraversalSample snippet'inde bir Configuration nesnesinden nasıl tek bir özel tam sayı değeri alınacağı gösterilmektedir:

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

Birkaç değer içeren bir parametreyi almak ve ayrıştırmak için verileri belirli parçalara ayrıştırmak amacıyla Configuration sınıfının tür ayrıştırıcılarından birini kullanın. Eğitim bağlayıcısındaki aşağıdaki snippet, GitHub depo adlarının bir listesini almak için getMultiValue yöntemini kullanır:

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

Grafikte geçiş yapma

Depodaki tüm kayıtlar için kimlikleri ve karma değerlerini almak üzere getIds() yöntemini geçersiz kılın. getIds() yöntemi bir kontrol noktasını kabul eder. Kontrol noktası, işlemin kesintiye uğraması durumunda belirli bir öğede dizine eklemeye devam etmek için kullanılır.

Ardından, Cloud Search Dizine Ekleme Sırasındaki her bir öğeyi işlemek için getDoc() yöntemini geçersiz kılın.

Push öğesi kimlikleri ve karma değerleri

Depodan öğe kimliklerini ve bunlarla ilişkili içerik karma değerlerini almak için geçersiz kılın. getIds() Kimlik ve karma değer çiftleri daha sonra Cloud Search Dizine Ekleme Sırasına push işlemi isteğine paketlenir. Kök veya üst kimlikler genellikle öğe hiyerarşisinin tamamı işlenene kadar ilk olarak alt kimlikleri aktarır.

getIds() yöntemi, dizine eklenecek son öğeyi temsil eden bir kontrol noktasını kabul eder. İşlem noktası, işlemin kesintiye uğraması durumunda belirli bir öğede dizine ekleme işlemini devam ettirmek için kullanılabilir. Deponuzdaki her öğe için getIds() yönteminde şu adımları uygulayın:

  • Depodan her öğe kimliğini ve ilişkili karma değerini alın.
  • Her bir kimlik ve karma değer çiftini bir PushItems olarak paketleyin.
  • Her bir PushItems kodunu, getIds() yöntemi tarafından döndürülen bir yineleyicide birleştirin. Not:getIds() gerçekte birCheckpointCloseableIterable , bu daApiOperation }nesneler, her biri bir API isteğini temsil eden her nesneRepositoryDoc (örneğin, öğeleri sıraya aktarmak gibi)

Aşağıdaki kod snippet'i, her bir öğe kimliğinin ve karma değerinin nasıl alınacağını ve bunları bir PushItems öğesine nasıl ekleyeceğinizi göstermektedir. CPushItems birApiOperation Cloud Search Dizine Ekleme Sırasına bir öğe aktarma isteği.

GraphTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);

Aşağıdaki kod snippet'i, kimlikleri ve karma değerlerini tek bir push işleminde paketlemek için PushItems.Builder sınıfının nasıl kullanılacağını gösterir ApiOperation.

GraphTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();

Öğeler, daha ayrıntılı işlenmek üzere Cloud Search Dizine Ekleme Sırasına aktarılır.

Öğeleri alma ve işleme

Cloud Search Dizine Ekleme Sırasındaki her bir öğeyi işlemek için getDoc() ayarını geçersiz kılın. Bir öğe yeni veya değiştirilmiş olabilir ya da artık kaynak depoda mevcut olmayabilir. Yeni veya değiştirilmiş olan her öğeyi alın ve dizine ekleyin. Artık kaynak depoda mevcut olmayan öğeleri dizinden kaldırın.

getDoc() yöntemi, Google Arama Dizini Oluşturma Sırasındaki bir Öğeyi kabul eder. Sıradaki her bir öğe için getDoc() yönteminde aşağıdaki adımları uygulayın:

  1. Cloud Search Dizine Ekleme Sırasındaki öğe kimliğinin depoda mevcut olup olmadığını kontrol edin. Öyle değilse, öğeyi dizinden silin. Öğe mevcutsa bir sonraki adımla devam edin.

  2. Dizin değiştirildi veya yeni öğeler:

    1. İzinleri ayarlayın.
    2. Dizine eklediğiniz öğenin meta verilerini ayarlayın.
    3. Meta veri ile öğeyi dizine eklenebilir tek bir RepositoryDoc dosyasında birleştirin.
    4. Alt kimlikleri, daha ayrıntılı işlemeler için Cloud Search Dizine Ekleme Sırasına yerleştirin.
    5. RepositoryDoc iade edin.

Silinen öğeleri işleme

Aşağıdaki kod snippet'i, bir öğenin dizinde olup olmadığının nasıl tespit edileceğini ve silinmeyeceğini gösterir.

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

Bir öğenin izinlerini ayarlama

Deponuz, bir öğeye erişimi olan kullanıcıları veya grupları tanımlamak için bir Erişim Kontrol Listesi (EKL) kullanır. EKL, öğeye erişebilen grup veya kullanıcıların kimlik listesidir.

Bir öğeye yalnızca erişimi olan kullanıcıların bir öğeyi arama sonucunda görebilmesini sağlamak için deponuz tarafından kullanılan EKL'yi kopyalamanız gerekir. Google Cloud Search'ün öğeye doğru erişim düzeyini sağlamak için ihtiyaç duyduğu bilgilere sahip olması amacıyla bir öğe dizine eklenirken öğenin EKL'si eklenmelidir.

Content Connector SDK, çoğu deponun EKL'lerini modellemek için zengin bir EKL sınıfları ve yöntemleri sağlar. Deponuzdaki her öğenin EKL'sini analiz etmeniz ve bir öğeyi dizine eklediğinizde Google Cloud Search için ilgili bir EKL oluşturmanız gerekir. Deponuzun EKL'si, EKL devralma gibi kavramlar kullanıyorsa bu EKL'yi modellemek zor olabilir. Google Cloud Search EKL'leri hakkında daha fazla bilgi için Google Cloud Search EKL'leri konusuna bakın.

Not: Cloud Search Dizine Ekleme API'si tek alanlı EKL'leri destekler. Web alanları arası EKL'leri desteklemez. EKL kullanarak her bir öğeye erişimi ayarlamak için Acl.Builder sınıfını kullanın. Tam geçiş örneğinden alınan aşağıdaki kod snippet'i, tüm kullanıcıların veya "ana yöneticilerin" (getCustomerPrincipal()) tüm öğelere (.setReaders()) göz atın.

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

Depo için uygun şekilde EKL'ler oluşturmak üzere EKL'leri anlamanız gerekir. Örneğin, alt klasörlerin izinleri üst klasörlerden devraldığı bir tür devralma modeli kullanan bir dosya sistemindeki dosyaları dizine eklemiş olabilirsiniz. EKL devrinin modellenmesi, Google Cloud Search EKL'leri kapsamındaki ek bilgileri gerektirir

Bir öğenin meta verilerini ayarlama

Meta veriler bir Item nesnesinde depolanır. Item oluşturmak üzere öğe için minimum benzersiz dize kimliği, öğe türü, EKL, URL ve sürüm gerekir. Aşağıdaki kod snippet'i, IndexingItemBuilder yardımcı sınıfını kullanarak nasıl Item oluşturulacağını gösterir.

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

Dizine eklenebilir öğe oluşturma

Öğenin meta verilerini ayarladıktan sonra RepositoryDoc.Builder kullanarak gerçek dizine eklenebilir öğeyi oluşturabilirsiniz. Aşağıdaki örnekte, tek bir dizine eklenebilir öğenin nasıl oluşturulacağı gösterilmektedir.

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

RepositoryDoc, gerçek IndexingService.indexItem() isteğini gerçekleştiren bir ApiOperation türüdür.

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

ASYNCHRONOUS
Eşzamansız mod, daha uzun dizine eklemeden sunuma gecikmeye neden olur ve dizine ekleme istekleri için büyük işleme hızı kotası kullanır. Deponun tamamının ilk dizine eklenmesi (dolgu) için eşzamansız mod kullanılması önerilir.
SYNCHRONOUS
Eşzamanlı mod, dizine ekleme ve yayınlamada daha kısa gecikme sağlar ve işleme hızını sınırlandırır. Depoda yapılan güncellemelerin ve değişikliklerin dizine eklenmesi için eşzamanlı mod önerilir. Belirtilmezse istek modu varsayılan olarak SYNCHRONOUS değerine ayarlanır.

Alt kimlikleri Cloud Search Dizine Ekleme Sırasına yerleştirme

Aşağıdaki kod snippet'i, işlenmekte olan üst öğenin alt kimliklerini işleme sırasına nasıl ekleyeceğinizi gösterir. Bu kimlikler, üst öğe dizine eklendikten sonra işlenir.

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

Sonraki Adımlar

Atabileceğiniz birkaç adım aşağıda verilmiştir:

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

Aşağıdaki bölümlerde, REST API kullanılarak içerik bağlayıcının nasıl oluşturulacağı açıklanmaktadır.

Geçiş stratejinizi belirleme

İçerik bağlayıcısının birincil işlevi, depoya gidip verilerini dizine eklemektir. Deponuzdaki verilerin boyutuna ve düzenine göre bir geçiş stratejisi uygulamanız gerekir. Aşağıda, yaygın olarak kullanılan üç geçiş stratejisi bulunmaktadır:

Tam geçiş stratejisi

Tam geçiş stratejisi, deponun tamamını tarar ve her öğeyi gizlice dizine ekler. Bu strateji genellikle küçük bir veri havuzunuz olduğunda ve her dizine ekleme esnasında tam geçiş yapma yükünü karşılayabilecek durumda kullanılır.

Bu geçiş stratejisi, çoğunlukla statik, hiyerarşik olmayan veriler içeren küçük depolar için uygundur. Bu geçiş stratejisini, değişiklik algılaması zor olduğunda veya depo tarafından desteklenmediğinde de kullanabilirsiniz.

Geçiş geçişi stratejisi

Liste geçiş stratejisi, tüm alt düğümler dahil, deponun tamamını tarayarak her bir öğenin durumunu belirler. Ardından, bağlayıcı ikinci bir geçişte yer alır ve yalnızca son dizine eklenen veya yeni eklenen öğeleri dizine ekler. Bu strateji genellikle (dizin her güncellendiğinde tam geçiş yapmak zorunda kalmak yerine) mevcut bir dizinde artımlı güncellemeler yapmak için kullanılır.

Bu geçiş stratejisi, veri havuzunun değişiklik algılaması zor olduğunda veya desteklenmediğinde, hiyerarşik olmayan verileriniz varsa ve çok büyük veri kümeleriyle çalışıyorsanız uygundur.

Grafik geçişi

Grafik geçiş stratejisi, her bir öğenin durumunu belirleyen üst düğümün tamamını tarar. Ardından, bağlayıcı ikinci bir kart alır ve yalnızca kök düğümdeki öğeleri yeni dizine ekler veya son dizine eklemeden bu yana güncellenmiştir. Son olarak, bağlayıcı tüm alt kimlikleri iletir ve ardından, yeni veya güncellenmiş olan alt düğümlerdeki öğeleri dizine ekler. Bağlayıcı, tüm öğeler ele alınana kadar tüm alt düğümler boyunca yinelemeli olarak devam eder. Bu geçiş, genellikle tüm kimliklerin listelenmesinin mümkün olmadığı hiyerarşik depolar için kullanılır.

Seri dizinleri veya web sayfaları gibi hiyerarşik verilerin taranması gerekiyorsa bu strateji uygundur.

Geçiş stratejinizi uygulayın ve öğelerinizi dizine ekleyin

Google Cloud Search için dizine eklenebilir her öğeye Cloud Search API'de öğe denir. Bir öğe bir dosya, klasör, CSV dosyasındaki bir satır veya bir veritabanı kaydı olabilir.

Şemanız kaydedildikten sonra dizini şu şekilde doldurabilirsiniz:

  1. (isteğe bağlı) Dizine ekleme için 100 KiB'tan büyük dosyaları yüklemek üzere items.upload kullanma. Daha küçük dosyalar için içeriği items.index kullanarak inlineContent olarak yerleştirin.

  2. (İsteğe bağlı) Medya dosyalarını dizine eklenecek şekilde yüklemek için media.upload kullanma.

  3. Öğeyi dizine eklemek için items.index işlevini kullanma. Örneğin, şemanız film şemasında nesne tanımını kullanıyorsa tek bir öğe için dizine ekleme isteği şöyle görünür:

    {
      "name": "datasource/<data_source_id>/items/titanic",
      "acl": {
        "readers": [
          {
            "gsuitePrincipal": {
              "gsuiteDomain": true
            }
          }
        ]
      },
      "metadata": {
        "title": "Titanic",
        "viewUrl": "http://www.imdb.com/title/tt2234155/?ref_=nv_sr_1",
        "objectType": "movie"
      },
      "structuredData": {
        "object": {
          "properties": [
            {
              "name": "movieTitle",
              "textValues": {
                "values": [
                  "Titanic"
                ]
              }
            },
            {
              "name": "releaseDate",
              "dateValues": {
                "values": [
                  {
                    "year": 1997,
                    "month": 12,
                    "day": 19
                  }
                ]
              }
            },
            {
              "name": "actorName",
              "textValues": {
                "values": [
                  "Leonardo DiCaprio",
                  "Kate Winslet",
                  "Billy Zane"
                ]
              }
            },
            {
              "name": "genre",
              "enumValues": {
                "values": [
                  "Drama",
                  "Action"
                ]
              }
            },
            {
              "name": "userRating",
              "integerValues": {
                "values": [
                  8
                ]
              }
            },
            {
              "name": "mpaaRating",
              "textValues": {
                "values": [
                  "PG-13"
                ]
              }
            },
            {
              "name": "duration",
              "textValues": {
                "values": [
                  "3 h 14 min"
                ]
              }
            }
          ]
        }
      },
      "content": {
        "inlineContent": "A seventeen-year-old aristocrat falls in love with a kind but poor artist aboard the luxurious, ill-fated R.M.S. Titanic.",
        "contentFormat": "TEXT"
      },
      "version": "01",
      "itemType": "CONTENT_ITEM"
    }
    
  4. (İsteğe bağlı) Bir öğenin doğrulanması için items.get çağrılarının dizine eklenmesi.

Tam geçiş yapmak için tüm depoyu belirli aralıklarla yeniden dizine eklersiniz. Bir liste veya grafik geçişi gerçekleştirmek için depo deposu değişikliklerini işlemek üzere kod uygulamanız gerekir.

Depo değişikliklerini işleme

Tam dizine ekleme işlemini gerçekleştirmek için her bir depodan her öğeyi düzenli olarak toplayabilir ve dizine ekleyebilirsiniz. Dizininizin güncel olmasını sağlamada etkili olsa da, daha büyük veya hiyerarşik depolarda tam dizin oluşturma maliyetli olabilir.

Bir deponun tamamını sık sık dizine eklemek için dizin çağrılarını kullanmak yerine, Google Cloud Dizine Ekleme Sırası'nı değişiklikleri izlemek ve yalnızca 101}değişti. Daha sonra yoklamak ve güncellemek üzere öğeleri sıraya aktarmak için items.push isteklerini kullanabilirsiniz. Google Cloud Dizine Ekleme Sırası hakkında daha fazla bilgi için Google Cloud Dizine Ekleme Sırası bölümüne bakın.

Cloud Search REST API hakkında daha fazla bilgi için Cloud Search API konusuna bakın.