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

İçerik bağlayıcı, verileri bir kurumsal veri havuzuna erişebilir ve bir veri kaynağını doldurabilir. Google aşağıdakileri sağlar: içerik bağlayıcıları geliştirme seçenekleri:

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. "items" adı verilen ve dizine eklenebilir veri parçalarının ayrık parçalarını alır üçüncü taraflardan içerik deposu olarak kullanabilirsiniz.
  3. ACL'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çeriğinden gelen bildirimleri değiştirmek için dinler depodur. Değişiklik bildirimleri, saklanması gereken dizine ekleme isteklerine dönüştürülür Cloud Search veri kaynağı, üçüncü taraf veri havuzuyla senkronize edilir. İlgili içeriği oluşturmak için kullanılan bağlayıcı yalnızca depo değişiklik algılamayı destekliyorsa bu görevi gerçekleştirir.

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

Aşağıdaki bölümlerde, Content Connector SDK'sı.

Bağımlılıkları belirleme

SDK'yı kullanmak için derleme dosyanıza belirli bağımlılıkları eklemeniz gerekir. Sonraki slayta geçin bağımlılıklarını görüntülemek için aşağıdaki sekmelerden birini 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şturma

Her bağlayıcının, bağlayıcınızın kimliğini girin. Parametreler şu şekilde tanımlanır: anahtar/değer çiftleri: api.sourceId=1234567890abcdef.

Google Cloud Search SDK'sı, Google tarafından sağlanan çeşitli yapılandırma içerir tüm bağlayıcılar tarafından kullanılan parametrelerdir. Aşağıdakileri beyan etmeniz gerekir: Yapılandırma dosyanızdaki Google tarafından sağlanan parametreler:

  • İçerik bağlayıcısı için api.sourceId ve Bu parametreler konumu tanımladığından api.serviceAccountPrivateKeyFile deponuz ve özel anahtarınız olabilir.
  • Kimlik bağlayıcısı için api.identitySourceId öğesini bu olarak tanımlamanız gerekir parametresi, harici kimlik kaynağınızın konumunu tanımlar. Şu durumda: kullanıcılar senkronize ediliyorsa api.customerId öğesini de şunlar için benzersiz kimlik olarak beyan etmeniz gerekir: kuruluşunuzun Google Workspace hesabıyla ilişkilidir.

Google tarafından sağlanan diğer parametrelerini yapılandırma dosyanızda bildirmeniz gerekmez. Google'ın sağladığı yapılandırma parametreleri (ör. hakkında bilgi edinmek için Google'ın sağladığı yapılandırma parametreleri.

Ayrıca yapılandırma dosyası.

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

Yapılandırma dosyasınıconfig bağlayıcı. Özelliği, başlatırken -D bağımsız değişkenini kullanarak ayarlayabilirsiniz bağlayıcı. Örneğin, aşağıdaki komut, MyConfig.properties yapılandırma dosyasıyla:

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

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

Geçiş stratejinizi belirleyin

İçerik bağlayıcısının birincil işlevi, bir depodan bilgi edinmek ve dizine ekler. Tarayıcının boyutuna ve boyutlarına göre bir geçiş stratejisi verilerin düzenini artırabilirsiniz. Kendi stratejinizi tasarlayabilir veya SDK'da uygulanan aşağıdaki stratejilerden:

Tam geçiş stratejisi

Tam geçiş stratejisi, tüm depoyu tarar ve gizli bir şekilde dizinleri ele alacağız. Bu strateji genellikle küçük bir deponuz olduğunda ve , dizine her eklediğinizde tam bir geçiş yapmanın ek yükünü karşılayabilir.

Bu geçiş stratejisi, çoğunlukla web sitesi statik, hiyerarşik olmayan verilerdir. Bu geçiş stratejisini ayrıca zor olduğu veya desteklenmeyeceği durumlar olabilir.

Liste geçiş stratejisi

Liste gezinme stratejisi, tüm alt öğeler dahil olmak üzere deponun tamamını tarar. her bir öğenin durumunu belirler. Ardından, bağlayıcı birkaç saniye içinde yalnızca son yükleme tarihinden itibaren yeni olan veya güncellenmiş öğeleri dizine ekleyin. Bu strateji genellikle, artımlılık denemelerinde bir dizin güncellemelerini (her biri için tam bir geçiş yapmak tıklayın.

Bu geçiş stratejisi, değişikliğin tespit edilmesinin zor veya veri havuzu tarafından desteklenmiyorsa, hiyerarşik olmayan verileriniz vardır ve büyük veri kümeleriyle çalışıyor.

Grafik geçişi

Bir grafik geçiş stratejisi, her öğenin durumunu gösterir. Ardından, bağlayıcı ikinci bir geçişi gerçekleştirir ve yalnızca kök düğümdeki öğeler yenidir veya son dizine ekleme işleminden sonra güncellenmiştir. Son olarak, bağlayıcı tüm alt kimlikleri iletir ve ardından alt düğümlerdeki öğeleri dizine ekler. yeni veya güncellenmiş sayfaları gösterebilirsiniz. Bağlayıcı, yineleyen bir şekilde tüm alt düğümler üzerinde işlem yapılmasını beklemelisiniz. Bu geçiş, genellikle tüm kimliklerin listelenmediği hiyerarşik depolar için kullanılır pratik.

Bu strateji, olması gereken hiyerarşik verilerin olduğu taranamaz.

'nı inceleyin.

Bu geçiş stratejilerinin her biri, bir şablon bağlayıcısı tarafından uygulanır. sınıfını kullanır. Kendi geçiş stratejinizi uygulayabilirsiniz, ancak bu şablonları, bağlayıcınızın geliştirilmesini önemli ölçüde hızlandırır. Alıcı: şablon kullanarak bir bağlayıcı oluşturun, bağlı olan bölüme geçiş stratejiniz:

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

Belgelerin bu bölümü, FullTraversalSample örneğidir.

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

Bağlayıcının giriş noktası main() yöntemini çağırın. Bu yöntemin birincil görevi, yeni Application sınıfını çağırarak start() yöntemini kullanın.

Aramadan önce application.start(), her bir arama terimi için IndexingApplication.Builder sınıfını kullanarak FullTraversalConnector tıklayın. İlgili içeriği oluşturmak için kullanılan FullTraversalConnector kabul eder: Repository nesne (yöntemlerini uyguladığınız) Aşağıdaki kod snippet'i, sitenizin main() yöntemini uygulamak için:

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

Arka planda SDK, initConfig() yöntemini çağırınmain() Application.build. İlgili içeriği oluşturmak için kullanılan initConfig() yöntem şu görevleri gerçekleştirir:

  1. Configuation.isInitialized() yöntemini kullanan Configuration henüz başlatılmadı.
  2. Google'ın sağladığı anahtar/değer çiftiyle bir Configuration nesnesini başlatır çiftler. Her anahtar/değer çifti ConfigValue Configuration nesnesinin içindeki bir nesnedir.

Repository arayüzünü uygulama

Repository nesnesinin tek amacı geçişi gerçekleştirmek ve dizine eklenir. Bunu kullanırken yalnızca Repository içindeki belirli yöntemleri geçersiz kılmanız gerekir arayüzünü kullanın. Geçersiz kıldığınız yöntemler şablonu ve geçiş stratejisidir. FullTraversalConnector , aşağıdaki yöntemleri geçersiz kılın:

  • İlgili içeriği oluşturmak için kullanılan init() yöntemidir. Veri deposu kurulumu ve başlatma işlemleri yapmak için init() yöntemini çağırın.

  • İlgili içeriği oluşturmak için kullanılan getAllDocs() yöntemidir. Veri deposundaki tüm öğeleri tarayıp dizine eklemek için veri deposundaki tüm öğeleri tarayıp dizine eklemek için getAllDocs() yöntemini çağırın. Bu yöntem, planlanmış her geçiş için bir kez çağrılır (yapılandırmanız tarafından tanımlandığı şekilde).

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

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

Bu yöntemlerin her biri Repository nesnesi, ApiOperation nesnesini tanımlayın. Bir ApiOperation nesnesi, tek bir veya şu şekilde bir işlem gerçekleştirir: birden fazla olabilir, IndexingService.indexItem() çağrılarına bir örnektir.

Özel yapılandırma parametrelerini alma

Bağlayıcınızın yapılandırmasınıın bir parçası olarak, özel parametrelerini içeren Configuration nesnesini tanımlayın. Bu görev genellikle Repository sınıfın init() yöntemini kullanabilirsiniz.

Configuration sınıfı, farklı veri türlerini almak için çeşitli yöntemler sunar. kaldıracaktır. Her yöntem bir ConfigValue nesnesi döndürür. Bu durumda, ConfigValue nesnesini kullan get() yöntemini kullanın. Aşağıdaki snippet, FullTraversalSample, bir dosyanın Configuration nesnesindeki tek özel tam sayı değeri:

FullTraversalSample.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 Configuration sınıfının tür ayrıştırıcıları, verileri ayrı parçalara ayrıştırır. Eğitim bağlayıcısında bulunan aşağıdaki snippet, getMultiValue yöntemini kullanarak GitHub deposu adlarını listele:

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

Tam geçiş gerçekleştir

Geçersiz kıl getAllDocs() kullanarak deponuzu dizine ekleyin. getAllDocs() yöntemi bir kontrol noktası kabul eder. Kontrol noktası, dizine ekleme işlemini Süreç kesintiye uğrarsa ilgili öğeyi belirtin. Projenizdeki her bir öğe için deponuz varsa getAllDocs() yönteminde şu adımları uygulayın:

  1. İzinleri ayarlayın.
  2. Dizine eklediğiniz öğenin meta verilerini ayarlayın.
  3. Meta veriyi ve öğeyi dizine eklenebilir bir kaynakta birleştirin RepositoryDoc.
  4. Dizine eklenebilir her öğeyi getAllDocs() tarafından döndürülen bir iteratöre paketleyin yöntemidir. getAllDocs() işlevinin aslında CheckpointCloseableIterable Bu, projenin hedeflendiği ApiOperation her nesne bir tarayıcıda gerçekleştirilen API isteğini temsil eden RepositoryDoc gibi.

Öğe grubu tek bir çağrıda işlenemeyecek kadar büyükse kontrol noktası belirleyin hasMore(true) ifadesini girin.

Bir öğenin izinlerini ayarlama

Deponuz kullanıcıları tanımlamak için Erişim Kontrol Listesi (EKL) bir öğeye erişimi olan gruplar için kullanılır. EKL, grup veya kullanıcılara ait kimliklerden oluşan bir listedir erişebilir.

Yalnızca bu kullanıcıların sağlandığından emin olmak için deponuz tarafından kullanılan EKL'yi kopyalamalısınız erişimi olan kullanıcılar ilgili öğeyi arama sonucu içinde görebilirler. İlgili içeriği oluşturmak için kullanılan Google Cloud Search'ün doğru erişim düzeyini sağlamak için ihtiyaç duyduğu bilgilere sahip olması için bir öğe dizine eklenirken öğenin EKL'si eklenmelidir. öğedir.

Content Connector SDK'sı, aşağıdakileri yapmak için zengin bir EKL sınıfı ve yöntemi kümesi sağlar: model oluşturabilirsiniz. Şu klasördeki her öğe için EKL'yi analiz etmelisiniz: depoladığınızda veri deponuz ve Google Cloud Search için buna karşılık gelen dizine ekleyin. Kod deponuzun EKL'si ACL gibi kavramları kullanıyorsa gibi verilerin modellenmesi zor olabilir. Google Cloud ile ilgili Cloud Search EKL'ler için şuraya bakın: Google Cloud Search EKL'leri.

Not: Cloud Search Indexing API, tek alanlı EKL'leri destekler. İçermiyor: daha fazla bilgi edinin. Şunu kullanın: Acl.Builder sınıfını kullanır. Aşağıdaki kod snippet'i, büyük geçiş örneğinden çıkarılacak şekilde tüm kullanıcıları veya "ana hesapları" (getCustomerPrincipal()) tüm öğelerin "okuyucusu" olmak (.setReaders()) en iyi yoludur.

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

Depoda EKL'leri doğru şekilde modellemek için ACL'leri anlamanız gerekir. Örneğin, Örneğin, bir dosya sistemi içindeki dosyaları, Alt klasörlerin izinleri devraldığı bir tür devralma modeli kullanır üst klasörlerden kaldırın. EKL devralma modellemesi için ek bilgi gerekir kapsamı Google Cloud Search EKL'leri

Bir öğenin meta verilerini ayarlama

Meta veriler bir Item nesnesinde depolanır. Item oluşturmak için: öğe için en az benzersiz dize kimliği, öğe türü, EKL, URL ve sürüm olmalıdır. Aşağıdaki kod snippet'i,Item IndexingItemBuilder yardımcı sınıf.

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

Dizine eklenebilir öğeyi oluşturma

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

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, gerçekten aşağıdakileri gerçekleştiren bir ApiOperation türüdür IndexingService.indexItem() isteği.

Ayrıca şunu da kullanabilirsiniz: setRequestMode() yöntemi RepositoryDoc.Builder sınıfını kullanarak dizine ekleme isteğini ASYNCHRONOUS veya SYNCHRONOUS olarak tanımlar:

ASYNCHRONOUS
Eşzamansız mod, dizine eklemeden sunma gecikmesine neden olur ve dizine ekleme istekleri için büyük işleme hızı kotasına olanak tanır. Eşzamansız mod tüm deponun ilk dizine eklemesi (dolgu) için önerilir.
SYNCHRONOUS
Eşzamanlı mod, dizine ekleme ve sunma arasındaki gecikme süresini kısaltır. sınırlı işleme hızı kotası içerir. Eşzamanlı mod: ve depoda yapılan değişikliklerin dizine eklenmesi için önerilir. Eğer belirtilmemişse istek modu varsayılan olarak SYNCHRONOUS olur.

Dizine eklenebilir her öğeyi bir iteratörde paketleyin

getAllDocs() yöntemi bir Iterator değeri döndürür, özellikle de CheckpointCloseableIterable, / RepositoryDoc nesneler'i tıklayın. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için CheckpointClosableIterableImpl.Builder sınıfını kullanır. Aşağıdaki kod snippet'i, sitenizin bir yineleme oluşturmak ve döndürmektir.

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

SDK, yineleme içinde yer alan her dizine ekleme çağrısını yürütür.

Sonraki Adımlar

Atabileceğiniz sonraki adımlardan bazıları şunlardır:

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

Cloud Search Dizine Ekleme Sırası, kimlikleri ve isteğe bağlı karmayı tutmak için kullanılır değerleridir. Bir liste geçiş bağlayıcısı, Google Cloud Search Dizine Ekleme Sırasına öğe kimlikleri ekler ve bunları için gereken süreyi ifade eder. Google Cloud Search kuyrukları takip eder öğe durumunu (ör. bir öğenin öğede mevcut olup olmadığı gibi) depodan silindi. Cloud Search hakkında daha fazla bilgi için Dizine Ekleme Sırası, bakın Cloud Search Dizine Ekleme Sırası.

Belgelerin bu bölümü, ListTraversalSample örneğine bakalım.

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

Bağlayıcının giriş noktası main() yöntemini çağırın. Bu yöntemin birincil görevi, yeni Application sınıfını çağırarak start() yöntemini kullanın.

Aramadan önce application.start(), her bir arama terimi için IndexingApplication.Builder sınıfını kullanarak ListingConnector tıklayın. ListingConnector şunları kabul ediyor: Repository nesne (yöntemlerini uyguladığınız) Aşağıdaki snippet'te ListingConnector ve ilişkili Repository örneğini gösterin:

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

Arka planda SDK, initConfig() yöntemini çağırınmain() Application.build. initConfig() yöntemi:

  1. Configuation.isInitialized() yöntemini kullanan Configuration henüz başlatılmadı.
  2. Google'ın sağladığı anahtar/değer çiftiyle bir Configuration nesnesini başlatır çiftler. Her anahtar/değer çifti ConfigValue Configuration nesnesinin içindeki bir nesnedir.

Repository arayüzünü uygulama

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

  • İlgili içeriği oluşturmak için kullanılan init() yöntemidir. Veri deposu kurulumu ve başlatma işlemleri yapmak için init() yöntemini çağırın.

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

  • getDoc() yöntemidir. Dizine yeni öğe eklemek, mevcut öğeleri güncellemek, değiştirmek veya silmek için getDoc() yöntemini çağırın.

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

  • (isteğe bağlı) close() yöntemidir. Depo temizleme işlemi gerçekleştirmeniz gerekiyorsa close() yönergesini geçersiz kılın yöntemidir. 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 nesnesini tanımlayın. Bir ApiOperation nesnesi, tek bir veya şu şekilde bir işlem gerçekleştirir: birden fazla olabilir, IndexingService.indexItem() çağrılarına bir örnektir.

Özel yapılandırma parametrelerini alma

Bağlayıcınızın yapılandırmasınıın bir parçası olarak, özel parametrelerini içeren Configuration nesnesini tanımlayın. Bu görev genellikle Repository sınıfın init() yöntemini kullanabilirsiniz.

Configuration sınıfı, farklı veri türlerini almak için çeşitli yöntemler sunar. kaldıracaktır. Her yöntem bir ConfigValue nesnesi döndürür. Bu durumda, ConfigValue nesnesini kullan get() yöntemini kullanın. Aşağıdaki snippet, FullTraversalSample, bir dosyanın Configuration nesnesindeki tek özel tam sayı değeri:

FullTraversalSample.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 Configuration sınıfının tür ayrıştırıcıları, verileri ayrı parçalara ayrıştırır. Eğitim bağlayıcısında bulunan aşağıdaki snippet, getMultiValue yöntemini kullanarak GitHub deposu adlarını listele:

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

Liste geçişini gerçekleştirme

Geçersiz kıl getIds() yöntemini kullanabilirsiniz. getIds() yöntemi bir kontrol noktası kabul eder. Kontrol noktası, kampanyanın devam ettirilmesi için kullanılır. işlemin kesintiye uğraması durumunda belirli bir öğe için dizine eklenmesine olanak tanır.

Ardından, getDoc() yöntemini kullanmanızı öneririz.

Öğe kimliklerini ve karma değerlerini aktarın

Geçersiz kıl getIds() öğesini kullanarak öğe kimliklerini ve ilişkili içerik karma değerlerini depodur. Kimlik ve karma değer çiftleri, daha sonra push işlemine paketlenir. Cloud Search Dizine Ekleme Sırasına istek gönderebilir. Kök veya üst kimlikler genellikle öğe hiyerarşisinin tamamı tamamlanana kadar önce alt kimlikler, ardından da alt kimlikler aktarılır işlendi.

getIds() yöntemi, eklenecek son öğeyi temsil eden bir kontrol noktası kabul eder: dizine eklendi. Kontrol noktası, dizine ekleme işlemine belirli bir öğede devam etmek için kullanılabilir. süreç kesintiye uğrayabilir. Deponuzdaki her öğe için şu işlemleri yapın: getIds() yöntemindeki adımlar:

  • Depodan her öğe kimliğini ve ilişkili karma değerini alın.
  • Her kimlik ve karma değeri çiftini bir PushItems olarak paketleyin.
  • Her PushItems öğesini getIds() yöntemidir. getIds() işlevinin aslında CheckpointCloseableIterable Bu, projenin hedeflendiği ApiOperation her nesne bir tarayıcıda gerçekleştirilen API isteğini temsil eden RepositoryDoc , öğeleri sıraya aktarın.

Aşağıdaki kod snippet'i, her bir öğe kimliğinin ve karma değerinin nasıl alınacağını ve bunları bir PushItems. PushItems, bir öğeyi Cloud Search'e aktarmak için yapılan bir ApiOperation isteğidir Dizine Ekleme Sırası.

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 sınıfları, kimlikleri ve karma değerlerini tek bir aktarımda paketleme ApiOperation.

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

Öğeler, daha fazla işlenmek üzere Cloud Search Dizine Ekleme Sırasına gönderilir.

Her bir öğeyi alma ve işleme

Geçersiz kıl Cloud Search Dizine Ekleme Sırasındaki her bir öğeyi işlemek için getDoc(). Bir öğe yeni, değiştirilmiş, değiştirilmemiş veya artık kaynakta yer almıyor olabilir depodur. Yeni veya değiştirilmiş her bir öğeyi alın ve dizine ekleyin. Öğeleri kaldırma artık kaynak depoda bulunmayan dizinden kaldırmalıdır.

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

  1. Cloud Search Dizine Ekleme Sırasında öğe kimliğinin olup olmadığını kontrol edin seçeceğim. Değilse öğeyi dizinden silin.

  2. Dizinde öğe durumu için anket yapın ve öğe değişmediyse (ACCEPTED) anket yapmayın hiçbir şey yapmaz.

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

    1. İzinleri ayarlayın.
    2. Dizine eklediğiniz öğenin meta verilerini ayarlayın.
    3. Meta veriyi ve öğeyi dizine eklenebilir bir kaynakta birleştirin RepositoryDoc.
    4. RepositoryDoc öğesini iade edin.

Not: ListingConnector şablonu, şu sürümlerde null değerinin döndürülmesini desteklemez: getDoc() yöntemi. null sonucu döndürüldüğünde NullPointerException. ile sonuçlanır

Silinen öğeleri işleme

Aşağıdaki kod snippet'i, saklamanız gerekir. Aksi takdirde silebilirsiniz.

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 öğesinin, depoyu temsil eden bir veri yapısı olduğunu unutmayın. Eğer documentID, documents dilinde bulunamadı, döndürülür APIOperations.deleteItem(resourceName) tuşuna basarak öğeyi dizinden silebilirsiniz.

Değiştirilmeyen öğeleri işleyin

Aşağıdaki kod snippet'i, Cloud Search'te öğe durumunun nasıl sorgulanacağını gösterir Dizine Ekleme Sırası ve değiştirilmemiş bir öğeyi işleme.

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 da kontrol edin meta veriler olarak da adlandırılır. Bu örnekte, meta veriler karma değeri, öğenin değiştirilip değiştirilmediğini belirlemek için 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 kullanıcıları tanımlamak için Erişim Kontrol Listesi (EKL) bir öğeye erişimi olan gruplar için kullanılır. EKL, grup veya kullanıcılara ait kimliklerden oluşan bir listedir erişebilir.

Yalnızca bu kullanıcıların sağlandığından emin olmak için deponuz tarafından kullanılan EKL'yi kopyalamalısınız erişimi olan kullanıcılar ilgili öğeyi arama sonucu içinde görebilirler. İlgili içeriği oluşturmak için kullanılan Google Cloud Search'ün doğru erişim düzeyini sağlamak için ihtiyaç duyduğu bilgilere sahip olması için bir öğe dizine eklenirken öğenin EKL'si eklenmelidir. öğedir.

Content Connector SDK'sı, aşağıdakileri yapmak için zengin bir EKL sınıfı ve yöntemi kümesi sağlar: model oluşturabilirsiniz. Şu klasördeki her öğe için EKL'yi analiz etmelisiniz: depoladığınızda veri deponuz ve Google Cloud Search için buna karşılık gelen dizine ekleyin. Kod deponuzun EKL'si ACL gibi kavramları kullanıyorsa gibi verilerin modellenmesi zor olabilir. Google Cloud ile ilgili Cloud Search EKL'ler için şuraya bakın: Google Cloud Search EKL'leri.

Not: Cloud Search Indexing API, tek alanlı EKL'leri destekler. İçermiyor: daha fazla bilgi edinin. Şunu kullanın: Acl.Builder sınıfını kullanır. Aşağıdaki kod snippet'i, büyük geçiş örneğinden çıkarılacak şekilde tüm kullanıcıları veya "ana hesapları" (getCustomerPrincipal()) tüm öğelerin "okuyucusu" olmak (.setReaders()) en iyi yoludur.

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

Depoda EKL'leri doğru şekilde modellemek için ACL'leri anlamanız gerekir. Örneğin, Örneğin, bir dosya sistemi içindeki dosyaları, Alt klasörlerin izinleri devraldığı bir tür devralma modeli kullanır üst klasörlerden kaldırın. EKL devralma modellemesi için ek bilgi gerekir kapsamı Google Cloud Search EKL'leri

Bir öğenin meta verilerini ayarlama

Meta veriler bir Item nesnesinde depolanır. Item oluşturmak için: öğe için en az benzersiz dize kimliği, öğe türü, EKL, URL ve sürüm olmalıdır. Aşağıdaki kod snippet'i,Item IndexingItemBuilder yardımcı sınıf.

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 öğe oluşturma

Öğenin meta verilerini ayarladıktan sonra, gerçek dizine eklenebilir öğe oluşturabilirsiniz öğesini kullanarak RepositoryDoc.Builder. Aşağıdaki örnekte, dizine eklenebilir tek bir öğ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();

RepositoryDoc bir tür Gerçek performansı gösteren ApiOperation IndexingService.indexItem() isteği gönderin.

Ayrıca şunu da kullanabilirsiniz: setRequestMode() yöntemi RepositoryDoc.Builder sınıfını kullanarak dizine ekleme isteğini ASYNCHRONOUS veya SYNCHRONOUS olarak tanımlar:

ASYNCHRONOUS
Eşzamansız mod, dizine eklemeden sunma gecikmesine neden olur ve dizine ekleme istekleri için büyük işleme hızı kotasına olanak tanır. Eşzamansız mod tüm deponun ilk dizine eklemesi (dolgu) için önerilir.
SYNCHRONOUS
Eşzamanlı mod, dizine ekleme ve sunma arasındaki gecikme süresini kısaltır. sınırlı işleme hızı kotası içerir. Eşzamanlı mod: ve depoda yapılan değişikliklerin dizine eklenmesi için önerilir. Eğer belirtilmemişse istek modu varsayılan olarak SYNCHRONOUS olur.
'nı inceleyin.

Sonraki Adımlar

Atabileceğiniz sonraki adımlardan bazıları şunlardır:

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

Cloud Search Dizine Ekleme Sırası, kimlikleri ve isteğe bağlı karma değerlerini tutmak için kullanılır her bir öğe için otomatik olarak oluşturulur. Bir grafik geçiş bağlayıcısı, öğe kimliklerini Google Cloud Search Dizine Ekleme Sırasını düzenler ve sorgularınızı tek tek dizine ekleyin. Google Cloud Search sıraları korur ve sıra içeriklerini bir öğenin depodur. Cloud Search Dizine Ekleme Sırası hakkında daha fazla bilgi için - Google Cloud Search Dizine Ekleme Sırası.

Dizine ekleme sırasında, öğe içeriği veri deposundan alınır ve alt öğe kimlikleri sıraya aktarılır. Bağlayıcı yinelemeli olarak ilerler tüm öğeler işlenene kadar üst ve alt kimlikler işlenir.

Belgelerin bu bölümü, GraphTraversalSample örneğine bakalım.

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

Bağlayıcının giriş noktası main() yöntemini çağırın. Bu yöntemin birincil görevi, yeni Application sınıfını çağırarak start() yöntemini kullanın.

Aramadan önce application.start(), her bir arama terimi için IndexingApplication.Builder sınıfını kullanarak ListingConnector şablonunu örneklendirin. İlgili içeriği oluşturmak için kullanılan ListingConnector kabul eder: Repository nesne (yöntemlerini uyguladığınız)

Aşağıdaki snippet'te ListingConnector ve ilişkili Repository örneğini gösterin:

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

Arka planda SDK, initConfig() yöntemini çağırınmain() Application.build. initConfig() yöntemi:

  1. Configuation.isInitialized() yöntemini kullanan Configuration henüz başlatılmadı.
  2. Google'ın sağladığı anahtar/değer çiftiyle bir Configuration nesnesini başlatır çiftler. Her anahtar/değer çifti ConfigValue Configuration nesnesinin içindeki bir nesnedir.

Repository arayüzünü uygulama

Belgenin tek amacı Repository nesnesi, depoda gezinme ve dizine ekleme işlemini gerçekleştirmektir öğeler. Bir şablon kullanırken İçerik bağlayıcı oluşturmak için kullanılan Repository arayüzü. Geçersiz kıldığınız yöntemler kullandığınız şablona ve geçiş stratejisine bağlıdır. ListingConnector, aşağıdaki yöntemleri geçersiz kılarsınız:

  • İlgili içeriği oluşturmak için kullanılan init() yöntemidir. Veri deposu kurulumu ve başlatma işlemleri yapmak için init() yöntemini çağırın.

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

  • getDoc() yöntemidir. Dizine yeni öğe eklemek, mevcut öğeleri güncellemek, değiştirmek veya silmek için getDoc() yöntemini çağırın.

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

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

Bu yöntemlerin her biri Repository nesnesi bir tür ApiOperation nesnesi döndürüyor. ApiOperation bir veya birden fazla sonuç biçiminde bir işlem gerçekleştirir. IndexingService.indexItem() çağrılarına bir örnektir.

Özel yapılandırma parametrelerini alma

Bağlayıcınızın yapılandırmasınıın bir parçası olarak, özel parametrelerini içeren Configuration nesnesini tanımlayın. Bu görev genellikle Repository sınıfın init() yöntemini kullanabilirsiniz.

Configuration sınıfı, farklı veri türlerini almak için çeşitli yöntemler sunar. kaldıracaktır. Her yöntem bir ConfigValue nesnesi döndürür. Bu durumda, ConfigValue nesnesini kullan get() yöntemini kullanın. Aşağıdaki snippet, FullTraversalSample, bir dosyanın Configuration nesnesindeki tek özel tam sayı değeri:

FullTraversalSample.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 Configuration sınıfının tür ayrıştırıcıları, verileri ayrı parçalara ayrıştırır. Eğitim bağlayıcısında bulunan aşağıdaki snippet, getMultiValue yöntemini kullanarak GitHub deposu adlarını listele:

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

Grafik geçişini gerçekleştir

Geçersiz kıl getIds() yöntemini kullanabilirsiniz. getIds() yöntemi bir kontrol noktası kabul eder. Kontrol noktası, kampanyanın devam ettirilmesi için kullanılır. işlemin kesintiye uğraması durumunda belirli bir öğe için dizine eklenmesine olanak tanır.

Ardından, getDoc() yöntemini kullanmanızı öneririz.

Öğe kimliklerini ve karma değerlerini aktarın

Geçersiz kıl getIds() öğesini kullanarak öğe kimliklerini ve ilişkili içerik karma değerlerini depodur. Kimlik ve karma değer çiftleri, daha sonra push işlemine paketlenir. Cloud Search Dizine Ekleme Sırasına istek gönderebilir. Kök veya üst kimlikler genellikle öğe hiyerarşisinin tamamı tamamlanana kadar önce alt kimlikler, ardından da alt kimlikler aktarılır işlendi.

getIds() yöntemi, eklenecek son öğeyi temsil eden bir kontrol noktası kabul eder: dizine eklendi. Kontrol noktası, dizine ekleme işlemine belirli bir öğede devam etmek için kullanılabilir. süreç kesintiye uğrayabilir. Deponuzdaki her öğe için şu işlemleri yapın: getIds() yöntemindeki adımlar:

  • Depodan her öğe kimliğini ve ilişkili karma değerini alın.
  • Her kimlik ve karma değeri çiftini bir PushItems olarak paketleyin.
  • Her PushItems öğesini getIds() yöntemini çağırın. getIds() işlevinin aslında CheckpointCloseableIterable Bu, projenin hedeflendiği ApiOperation her nesne bir tarayıcıda gerçekleştirilen API isteğini temsil eden RepositoryDoc , öğeleri sıraya aktarın.

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

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

Aşağıdaki kod snippet'i, PushItems.Builder sınıfları, kimlikleri ve karma değerlerini tek bir aktarımda paketleme ApiOperation.

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

Öğeler, daha fazla işlenmek üzere Cloud Search Dizine Ekleme Sırasına gönderilir.

Her bir öğeyi alma ve işleme

Geçersiz kıl Cloud Search Dizine Ekleme Sırasındaki her bir öğeyi işlemek için getDoc(). Bir öğe yeni, değiştirilmiş, değiştirilmemiş veya artık kaynakta yer almıyor olabilir depodur. Yeni veya değiştirilmiş her bir öğeyi alın ve dizine ekleyin. Öğeleri kaldırma artık kaynak depoda bulunmayan dizinden kaldırmalıdır.

getDoc() yöntemi, Cloud Search Dizine Ekleme'den bir öğe kabul eder Sıra. Sıradaki her bir öğe için aşağıdaki adımları uygulayın: getDoc() yöntem:

  1. Cloud Search Dizine Ekleme Sırasındaki öğe kimliğinin depodur. Değilse öğeyi dizinden silin. Öğe mevcutsa sonraki adıma geçin.

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

    1. İzinleri ayarlayın.
    2. Dizine eklediğiniz öğenin meta verilerini ayarlayın.
    3. Meta veriyi ve öğeyi dizine eklenebilir bir kaynakta birleştirin RepositoryDoc.
    4. Alt kimlikleri daha fazla işlenmek üzere Cloud Search Dizine Ekleme Sırasına yerleştirin.
    5. RepositoryDoc öğesini iade edin.

Silinen öğeleri işleme

Aşağıdaki kod snippet'i, bir öğenin dizinde mevcut olup olmadığını nasıl belirleyeceğinizi gösterir. veya silmezler.

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 kullanıcıları tanımlamak için Erişim Kontrol Listesi (EKL) bir öğeye erişimi olan gruplar için kullanılır. EKL, grup veya kullanıcılara ait kimliklerden oluşan bir listedir erişebilir.

Yalnızca bu kullanıcıların sağlandığından emin olmak için deponuz tarafından kullanılan EKL'yi kopyalamalısınız erişimi olan kullanıcılar ilgili öğeyi arama sonucu içinde görebilirler. İlgili içeriği oluşturmak için kullanılan Google Cloud Search'ün doğru erişim düzeyini sağlamak için ihtiyaç duyduğu bilgilere sahip olması için bir öğe dizine eklenirken öğenin EKL'si eklenmelidir. öğedir.

Content Connector SDK'sı, aşağıdakileri yapmak için zengin bir EKL sınıfı ve yöntemi kümesi sağlar: model oluşturabilirsiniz. Şu klasördeki her öğe için EKL'yi analiz etmelisiniz: depoladığınızda veri deponuz ve Google Cloud Search için buna karşılık gelen dizine ekleyin. Kod deponuzun EKL'si ACL gibi kavramları kullanıyorsa gibi verilerin modellenmesi zor olabilir. Google Cloud ile ilgili Cloud Search EKL'ler için şuraya bakın: Google Cloud Search EKL'leri.

Not: Cloud Search Indexing API, tek alanlı EKL'leri destekler. İçermiyor: daha fazla bilgi edinin. Şunu kullanın: Acl.Builder sınıfını kullanır. Aşağıdaki kod snippet'i, büyük geçiş örneğinden çıkarılacak şekilde tüm kullanıcıları veya "ana hesapları" (getCustomerPrincipal()) tüm öğelerin "okuyucusu" olmak (.setReaders()) en iyi yoludur.

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

Depoda EKL'leri doğru şekilde modellemek için ACL'leri anlamanız gerekir. Örneğin, Örneğin, bir dosya sistemi içindeki dosyaları, Alt klasörlerin izinleri devraldığı bir tür devralma modeli kullanır üst klasörlerden kaldırın. EKL devralma modellemesi için ek bilgi gerekir kapsamı Google Cloud Search EKL'leri

Bir öğenin meta verilerini ayarlama

Meta veriler bir Item nesnesinde depolanır. Item oluşturmak için: öğe için en az benzersiz dize kimliği, öğe türü, EKL, URL ve sürüm olmalıdır. Aşağıdaki kod snippet'i,Item IndexingItemBuilder yardımcı sınıf.

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 öğeyi oluşturma

Öğenin meta verilerini ayarladıktan sonra, gerçek dizine eklenebilir öğe oluşturabilirsiniz öğesini kullanarak RepositoryDoc.Builder. Aşağıdaki örnekte, dizine eklenebilir tek bir öğ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çekten aşağıdakileri gerçekleştiren bir ApiOperation türüdür IndexingService.indexItem() isteği.

Ayrıca şunu da kullanabilirsiniz: setRequestMode() yöntemi RepositoryDoc.Builder sınıfını kullanarak dizine ekleme isteğini ASYNCHRONOUS veya SYNCHRONOUS olarak tanımlar:

ASYNCHRONOUS
Eşzamansız mod, dizine eklemeden sunma gecikmesine neden olur ve dizine ekleme istekleri için büyük işleme hızı kotasına olanak tanır. Eşzamansız mod tüm deponun ilk dizine eklemesi (dolgu) için önerilir.
SYNCHRONOUS
Eşzamanlı mod, dizine ekleme ve sunma arasındaki gecikme süresini kısaltır. sınırlı işleme hızı kotası içerir. Eşzamanlı mod: ve depoda yapılan değişikliklerin dizine eklenmesi için önerilir. Eğer belirtilmemişse istek modu varsayılan olarak SYNCHRONOUS olur.

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

Aşağıdaki kod snippet'i, şu anda işlenmekte olan üst öğe, işlenmek üzere sıraya alınır. 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 sonraki adımlardan bazıları şunlardır:

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

Aşağıdaki bölümlerde, REST API.

Geçiş stratejinizi belirleyin

İçerik bağlayıcısının birincil işlevi, bir depodan bilgi edinmek ve dizine ekler. Tarayıcının boyutuna ve boyutlarına göre bir geçiş stratejisi verilerin düzenini artırabilirsiniz. Aşağıda, üç yaygın geçiş adımı verilmiştir: stratejiler:

Tam geçiş stratejisi

Tam geçiş stratejisi, tüm depoyu tarar ve gizli bir şekilde dizinleri ele alacağız. Bu strateji genellikle küçük bir deponuz olduğunda ve , dizine her eklediğinizde tam bir geçiş yapmanın ek yükünü karşılayabilir.

Bu geçiş stratejisi, çoğunlukla web sitesi statik, hiyerarşik olmayan verilerdir. Bu geçiş stratejisini ayrıca zor olduğu veya desteklenmeyeceği durumlar olabilir.

Liste geçiş stratejisi

Liste gezinme stratejisi, tüm alt öğeler dahil olmak üzere deponun tamamını tarar. her bir öğenin durumunu belirler. Ardından, bağlayıcı birkaç saniye içinde yalnızca son yükleme tarihinden itibaren yeni olan veya güncellenmiş öğeleri dizine ekleyin. Bu strateji genellikle, artımlılık denemelerinde bir dizin güncellemelerini (her biri için tam bir geçiş yapmak tıklayın.

Bu geçiş stratejisi, değişikliğin tespit edilmesinin zor veya veri havuzu tarafından desteklenmiyorsa, hiyerarşik olmayan verileriniz vardır ve büyük veri kümeleriyle çalışıyor.

Grafik geçişi

Bir grafik geçiş stratejisi, her öğenin durumunu gösterir. Ardından, bağlayıcı ikinci bir geçişi gerçekleştirir ve yalnızca kök düğümdeki öğeler yenidir veya son dizine ekleme işleminden sonra güncellenmiştir. Son olarak, bağlayıcı tüm alt kimlikleri iletir ve ardından alt düğümlerdeki öğeleri dizine ekler. yeni veya güncellenmiş sayfaları gösterebilirsiniz. Bağlayıcı, yineleyen bir şekilde tüm alt düğümler üzerinde işlem yapılmasını beklemelisiniz. Bu geçiş, genellikle tüm kimliklerin listelenmediği hiyerarşik depolar için kullanılır pratik.

Bu strateji, olması gereken hiyerarşik verilerin olduğu taranır.

'nı inceleyin.

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

Cloud Search için dizine eklenebilir her öğe, API'de item Cloud Search API'yi kullanabilirsiniz. Öğe; dosya, klasör, CSV dosyasındaki bir satır veya olması gerekir.

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

  1. (isteğe bağlı) items.upload kullanımı . Daha küçük dosyalar için içeriği inlineContent kullanarak items.index.

  2. (isteğe bağlı) media.upload kullanımı dizine eklemek üzere medya dosyalarını yüklemek için kullanılır.

  3. Öğeyi dizine eklemek için items.index kullanılıyor. Örneğin, şemanız filmdeki bir filmdeki schema öğesi olan tek bir dizine ekleme isteği öğe aşağıdaki gibi 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ı) items.get kullanarak Öğeyi doğrulamak için yapılan aramalar dizine eklendi.

Tam geçiş yapmak için, sitenin tamamını belirli aralıklarla yeniden dizine eklersiniz depodur. Liste veya grafik geçişi gerçekleştirmek için depo değişikliklerini işleme kodunu eklemeniz gerekir.

Depo değişikliklerini işleme

Belirli aralıklarla veri havuzundan her öğeyi depolayarak tam dizin oluşturma. Dizininizin güncel olmasını sağlamada etkili olmakla birlikte, daha büyük veya hiyerarşik depolarla çalışırken dizine ekleme maliyetli olabilir.

Kod deposunun tamamını dizine eklemek için ara sıra dizin çağrılarını kullanmak yerine Google Cloud Dizine Ekleme Sırası'nı da kullanabilir değişiklikleri izlemek ve yalnızca değiştirildi. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için items.push öğeleri daha sonra yoklama ve güncelleme amacıyla sıraya aktarma istekleridir. Daha fazla Google Cloud Dizine Ekleme Sırası hakkında bilgi için Google Cloud Dizine Ekleme Sırası.

Google Cloud Search API hakkında daha fazla bilgi için Cloud Search API.