Tworzenie łącznika treści

Łącznik treści to program służący do przeglądania danych dla repozytorium przedsiębiorstwa i uzupełnić źródło danych. Google zapewnia: opcje tworzenia oprogramowania sprzęgającego treści:

Typowy łącznik treści wykonuje te zadania:

  1. Odczyt i przetwarzanie parametrów konfiguracji.
  2. Pobiera dyskretne fragmenty danych do indeksowania, nazywane „elementami”. od osoby trzeciej do repozytorium treści.
  3. Łączy listy kontroli dostępu, metadane i dane o treści w elementy możliwe do indeksowania.
  4. Indeksuje elementy do źródła danych Cloud Search.
  5. (opcjonalnie) nasłuchuje powiadomień o zmianach w treściach osób trzecich z repozytorium. Powiadomienia o zmianach są konwertowane na prośby o zindeksowanie, aby zachować źródła danych Cloud Search zsynchronizowanego z repozytorium innej firmy. Oprogramowanie sprzęgające wykonuje to zadanie tylko wtedy, gdy repozytorium obsługuje wykrywanie zmian.

Utwórz oprogramowanie sprzęgające treści za pomocą pakietu Content Connector SDK

W poniższych sekcjach dowiesz się, jak utworzyć oprogramowanie sprzęgające treści za pomocą SDK Content Connector.

Skonfiguruj zależności

Aby korzystać z pakietu SDK, musisz w pliku kompilacji uwzględnić określone zależności. Kliknij na karcie poniżej, aby wyświetlić zależności dla środowiska kompilacji:

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'

Tworzenie konfiguracji oprogramowania sprzęgającego

Każde oprogramowanie sprzęgające ma plik konfiguracji zawierający parametry używane przez takie jak identyfikator repozytorium. Parametry są zdefiniowane jako par klucz-wartość, takich jak api.sourceId=1234567890abcdef

Pakiet SDK Google Cloud Search zawiera kilka konfiguracji dostarczonych przez Google parametrów używanych przez wszystkie oprogramowanie sprzęgające. Musisz zadeklarować: Parametry dostarczone przez Google w pliku konfiguracyjnym:

  • W przypadku łącznika treści musisz zadeklarować api.sourceId i api.serviceAccountPrivateKeyFile, ponieważ te parametry identyfikują lokalizację. i klucza prywatnego potrzebnego do uzyskania dostępu do repozytorium.
  • W przypadku łącznika tożsamości musisz zadeklarować api.identitySourceId jako określa lokalizację zewnętrznego źródła tożsamości. Jeśli jesteś synchronizujesz użytkowników, musisz też zadeklarować api.customerId jako unikalny identyfikator dla konto Google Workspace Twojej firmy.

O ile nie chcesz zastąpić wartości domyślnych innych ustawień nie musisz deklarować ich w pliku konfiguracji. Dodatkowe informacje na temat parametrów konfiguracji dostarczonych przez Google, takich jak jak generować identyfikatory i klucze, zapoznaj się z artykułem Parametry konfiguracji udostępnione przez Google.

Możesz też zdefiniować własne parametry repozytorium do wykorzystania w .

Przekaż plik konfiguracji do oprogramowania sprzęgającego

Ustaw właściwość systemową config, aby przekazywać plik konfiguracji do . Możesz ustawić właściwość za pomocą argumentu -D podczas uruchamiania i łącznika danych. Na przykład poniższe polecenie uruchamia oprogramowanie sprzęgające za pomocą pliku konfiguracji MyConfig.properties:

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

Jeśli brakuje tego argumentu, pakiet SDK próbuje uzyskać dostęp do konfiguracji domyślnej. plik o nazwie connector-config.properties.

Określ strategię przemierzania

Główną funkcją łącznika treści jest przemierzanie repozytorium indeksowanie jej danych. Musisz wdrożyć strategię przemierzania opartą na układ danych w repozytorium. Możesz opracować własną strategię lub wybrać spośród następujących strategii zaimplementowanych w pakiecie SDK:

Strategia pełnego przemierzania

Strategia pełnego przemierzania skanuje całe repozytorium i ślepo wykonuje indeksowanie każdego elementu. Ta strategia jest często stosowana, gdy masz małe repozytorium i możesz sobie pozwolić na koszty związane z pełnym przemierzaniem przy każdym indeksowaniu.

Ta strategia przemierzania jest odpowiednia dla małych repozytoriów zawierających głównie statyczne, niehierarchiczne. Możesz też użyć tej strategii przemierzania gdy wykrywanie zmian jest trudne lub nieobsługiwane przez repozytorium.

Strategia przemierzania listy

Strategia przemierzania listy skanuje całe repozytorium, w tym wszystkie obiekty podrzędne węzłów, które określają stan każdego elementu. Następnie łączy się przez chwilę i indeksuje tylko te elementy, które są nowe lub zostały zaktualizowane od ostatniego indeksowanie. Strategia ta jest zwykle wykorzystywana do zwiększania przyrostu wartości aktualizacji istniejącego indeksu (bez konieczności wykonywania pełnego przemierzania podczas aktualizowania indeksu).

Ta strategia przemierzania jest odpowiednia, gdy wykrywanie zmian jest trudne lub nie jest obsługiwane przez repozytorium, masz dane niehierarchiczne i jesteś pracy z bardzo dużymi zbiorami danych.

Omijanie wykresu

Strategia przemierzania wykresu skanuje cały węzeł nadrzędny, określając stan każdego elementu. Następnie oprogramowanie sprzęgające korzysta z drugiego przebiegu i przeprowadza indeksowanie tylko elementy w węźle głównym są nowe lub zostały zaktualizowane od ostatniego indeksowania. Na koniec oprogramowanie sprzęgające przekazuje wszelkie identyfikatory podrzędne, a następnie indeksuje elementy w węzłach podrzędnych. nowe lub zaktualizowane. Łącznik rekurencyjnie we wszystkich węzłach podrzędnych, dopóki nie zareagujesz na wszystkie elementy. Takie przemierzanie jest zwykle używany w repozytoriach hierarchicznych, w których lista wszystkich identyfikatorów nie jest praktyczny.

Ta strategia jest odpowiednia, jeśli masz dane hierarchiczne, które muszą indeksowania, np. serii katalogów lub stron internetowych.

Każda z tych strategii przemierzania jest wdrażana przez szablon oprogramowania sprzęgającego w pakiecie SDK. Możesz wdrożyć własną strategię przemierzania, jednak te znacznie przyspieszają tworzenie oprogramowania sprzęgającego. Do utworzyć oprogramowanie sprzęgające przy użyciu szablonu. Zostanie wykonane do sekcji odpowiadającej strategię przemierzania:

Utwórz oprogramowanie sprzęgające przemierzania pełnego za pomocą klasy szablonu

Ta sekcja dokumentacji odnosi się do fragmentów kodu z FullTraversalSample.

Wdróż punkt wejścia oprogramowania sprzęgającego

Punktem wejścia oprogramowania sprzęgającego jest Metoda main(). Głównym zadaniem tej metody jest utworzenie instancji Application i wywołaj jej klasę start() do uruchomienia oprogramowania sprzęgającego.

Zanim zadzwonisz application.start() użyj IndexingApplication.Builder klasy do utworzenia instancji FullTraversalConnector szablon. FullTraversalConnector akceptuje Repository którego metody implementujesz. Fragment kodu poniżej pokazuje, aby wdrożyć metodę main():

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

W tle pakiet SDK wywołuje metodę initConfig() po wywołaniu metody main() oprogramowania sprzęgającego Application.build initConfig() metoda wykonuje następujące zadania:

  1. Wywołuje funkcję Configuation.isInitialized() aby zapewnić, że Configuration nie została zainicjowana.
  2. Inicjuje obiekt Configuration przy użyciu pary klucz-wartość dostarczonej przez Google pary. Każda para klucz-wartość jest przechowywana w pliku ConfigValue w obiekcie Configuration.

Wdrażanie interfejsu Repository

Jedynym przeznaczeniem obiektu Repository jest wykonywanie przemierzania i indeksowania elementów repozytorium. W przypadku użycia funkcji szablonem, musisz zastąpić tylko niektóre metody w pliku Repository aby utworzyć oprogramowanie sprzęgające treści. Zastępowane metody zależą od szablonu i przemierzania. W przypadku wartości FullTraversalConnector , zastąp te metody:

  • init() . Aby przeprowadzić konfigurację i zainicjowanie dowolnego repozytorium danych, zastąp Metoda init().

  • getAllDocs() . Aby przeglądać i indeksować wszystkie elementy w repozytorium danych, zastąp Metoda getAllDocs(). Ta metoda jest wywoływana raz na każde zaplanowane przemierzanie (zgodnie z definicją w Twojej konfiguracji).

  • (opcjonalnie) Parametr getChanges() . Jeśli repozytorium obsługuje wykrywanie zmian, zastąp Metoda getChanges(). Ta metoda jest wywoływana raz dla każdego zaplanowanego przyrostu przemierzania (zgodnie z definicją w konfiguracji) w celu pobrania zmodyfikowanych elementów oraz w indeksie.

  • (opcjonalnie) Parametr close() . Jeśli chcesz wyczyścić repozytorium, zastąp close() . Ta metoda jest wywoływana raz podczas wyłączania oprogramowania sprzęgającego.

Każda z metod Repository obiekt zwraca jakiś typ ApiOperation obiektu. Obiekt ApiOperation wykonuje działanie w postaci pojedynczej lub np. kilku, IndexingService.indexItem() aby wykonać rzeczywiste indeksowanie repozytorium.

Pobierz niestandardowe parametry konfiguracji

W ramach konfiguracji oprogramowania sprzęgającego musisz pobrać parametrów niestandardowych z parametru Configuration obiektu. To zadanie jest zwykle wykonywane Repository zajęcia Metoda init().

Klasa Configuration ma kilka metod uzyskiwania różnych typów danych z konfiguracji. Każda metoda zwraca obiekt ConfigValue. Ty następnie użyj funkcji ConfigValue get() do pobrania rzeczywistej wartości. Ten fragment kodu pochodzi z: FullTraversalSample pokazuje, jak pobrać pojedynczą niestandardową wartość całkowitą z obiektu Configuration:

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

Aby pobrać i przeanalizować parametr zawierający kilka wartości, użyj jednej z funkcji parsery typów klasy Configuration do analizowania danych na części. Ten fragment kodu z oprogramowania sprzęgającego samouczka używa parametru getMultiValue metody pobierania listy nazw repozytoriów GitHub:

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

Wykonaj pełne przemierzenie

Zastąp getAllDocs() aby wykonać pełne przemierzenie i zindeksować repozytorium. getAllDocs() akceptuje punkt kontrolny. Punkt kontrolny służy do wznawiania indeksowania w określony element, jeśli proces ma zostać przerwany. Dla każdego elementu w wykonaj te czynności w metodzie getAllDocs():

  1. Ustaw uprawnienia.
  2. Ustaw metadane zindeksowanego elementu.
  3. Połącz metadane i element w jeden możliwy do zindeksowania RepositoryDoc
  4. Umieść każdy element możliwy do zindeksowania w iterator zwrócony przez funkcję getAllDocs() . Pamiętaj, że funkcja getAllDocs() zwraca błąd CheckpointCloseableIterable czyli iterację ApiOperation każdy obiekt reprezentujący żądanie API wykonane na RepositoryDoc, na przykład jej zindeksowanie.

Jeśli zbiór elementów jest zbyt duży, aby można było przetworzyć je w jednym wywołaniu, dołącz parametr i ustaw punkt kontrolny hasMore(true) aby wskazać, że więcej elementów jest dostępnych do indeksowania.

Ustawianie uprawnień elementu

Twoje repozytorium używa listy kontroli dostępu (ACL) do identyfikowania użytkowników lub grupy, które mają dostęp do elementu. Lista kontroli dostępu (ACL) to lista identyfikatorów grup lub użytkowników którzy mają dostęp do danego elementu.

Musisz zduplikować listę kontroli dostępu (ACL) używaną przez Twoje repozytorium, aby mieć pewność, że tylko tych użytkowników użytkownik z dostępem do elementu może zobaczyć go w wynikach wyszukiwania. Podczas indeksowania elementu musi być uwzględniona lista kontroli dostępu (ACL), aby usługa Google Cloud Search miała informacje potrzebne do zapewnienia odpowiedniego poziomu dostępu. elementu.

Content Connector SDK udostępnia bogaty zestaw klas i metod ACL, aby modelowanie list kontroli dostępu w większości repozytoriów. Musisz przeanalizować listę ACL dla każdego elementu w i utworzyć odpowiednią listę kontroli dostępu dla Google Cloud Search, indeksuj element. Jeśli lista kontroli dostępu repozytorium obejmuje takie elementy jak lista kontroli dostępu (ACL) dziedziczenie, modelowanie, że ACL może być trudne. Więcej informacji o Google Listy ACL Cloud Search: patrz Listy kontroli dostępu (ACL) w Google Cloud Search

Uwaga: interfejs Cloud Search Indexing API obsługuje listy kontroli dostępu (ACL) w jednej domenie. Nie obsługi list ACL dla wielu domen. Użyj Acl.Builder klasy dostępu do poszczególnych elementów za pomocą list kontroli dostępu. Poniższy fragment kodu został pobrany z pełnej próby przemierzania, umożliwia wszyscy użytkownicy lub „podmioty zabezpieczeń” (getCustomerPrincipal()) być „czytelnikami” wszystkich elementów (.setReaders()) podczas wyszukiwania.

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

Aby prawidłowo modelować listy kontroli dostępu w repozytorium, musisz znać listy kontroli dostępu. Dla: możesz na przykład indeksować pliki w systemie plików, Wykorzystuje model dziedziczenia, w którym foldery podrzędne dziedziczą uprawnienia. z folderów nadrzędnych. Dziedziczenie ACL w modelowaniu wymaga dodatkowych informacji poruszone w Listy kontroli dostępu (ACL) w Google Cloud Search

Ustawianie metadanych elementu

Metadane są przechowywane w obiekcie Item. Aby utworzyć Item, potrzebujesz musi zawierać co najmniej identyfikator unikalnego ciągu znaków, typ elementu, listę kontroli dostępu, adres URL i wersję elementu. Poniższy fragment kodu pokazuje, jak utworzyć Item za pomocą IndexingItemBuilder klasę pomocniczą.

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

Tworzenie elementu możliwego do indeksowania

Po ustawieniu metadanych elementu możesz utworzyć plik za pomocą atrybutu RepositoryDoc.Builder zajęcia. Przykład poniżej pokazuje, jak utworzyć pojedynczy element możliwy do zindeksowania.

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 to typ funkcji ApiOperation, który wykonuje działanie Prośba o IndexingService.indexItem().

Możesz też użyć usługi setRequestMode() funkcji RepositoryDoc.Builder klasa identyfikująca żądanie indeksowania jako ASYNCHRONOUS lub SYNCHRONOUS:

ASYNCHRONOUS
Tryb asynchroniczny wydłuża czas oczekiwania na indeksowanie i udostępnia obsługuje duży limit przepustowości żądań indeksowania. Obecny tryb asynchroniczny zalecane w przypadku początkowego indeksowania (zapełniania) całego repozytorium.
SYNCHRONOUS
Tryb synchroniczny skraca czas oczekiwania na indeksowanie i wyświetla, uwzględnia ograniczony limit przepustowości. Obecny tryb synchroniczny: jest zalecany w przypadku indeksowania aktualizacji i zmian w repozytorium. Jeśli nieokreślona, domyślny tryb żądania to SYNCHRONOUS.

Spakuj każdy element możliwy do zindeksowania w iteratorze

getAllDocs() zwraca Iterator, a konkretnie CheckpointCloseableIterable, z RepositoryDoc obiektów. Za pomocą CheckpointClosableIterableImpl.Builder do utworzenia i zwrócenia iteracji. Fragment kodu poniżej pokazuje, do utworzenia i zwrócenia iteracji.

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

Pakiet SDK wykonuje każde wywołanie indeksowania zawarte w iteratorze.

Dalsze kroki

Oto kilka kolejnych kroków, które możesz podjąć:

Utwórz oprogramowanie sprzęgające przemierzania listy za pomocą klasy szablonu

Kolejka indeksowania w Cloud Search służy do przechowywania identyfikatorów i opcjonalnych haszowania. dla każdego elementu w repozytorium. Wypchnięcia oprogramowania sprzęgającego przemierzania listy identyfikatorów elementów do kolejki indeksowania Google Cloud Search i pobiera je po jednym czas na indeksowanie. Google Cloud Search obsługuje kolejki porównywać zawartość kolejki, aby określić stan elementu, na przykład to, czy element zostały usunięte z repozytorium. Więcej informacji o Cloud Search Kolejka indeksowania, patrz Kolejka indeksowania w Cloud Search.

Ta sekcja dokumentacji odnosi się do fragmentów kodu z ListTraversalSample przykład.

Wdróż punkt wejścia oprogramowania sprzęgającego

Punktem wejścia oprogramowania sprzęgającego jest Metoda main(). Głównym zadaniem tej metody jest utworzenie instancji Application i wywołaj jej klasę start() do uruchomienia oprogramowania sprzęgającego.

Zanim zadzwonisz application.start() użyj IndexingApplication.Builder klasy do utworzenia instancji ListingConnector szablon. ListingConnector akceptuje Repository którego metody implementujesz. Ten fragment kodu pokazuje, jak utwórz instancję ListingConnector i powiązaną z nią instancję Repository:

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

W tle pakiet SDK wywołuje metodę initConfig() po wywołaniu metody main() oprogramowania sprzęgającego Application.build Metoda initConfig():

  1. Wywołuje funkcję Configuation.isInitialized() aby zapewnić, że Configuration nie została zainicjowana.
  2. Inicjuje obiekt Configuration przy użyciu pary klucz-wartość dostarczonej przez Google pary. Każda para klucz-wartość jest przechowywana w pliku ConfigValue w obiekcie Configuration.

Wdrażanie interfejsu Repository

Jedynym przeznaczeniem obiektu Repository jest wykonywanie przemierzania i indeksowania elementów repozytorium. Jeśli używasz szablonu, musisz tylko zastąpić określonych metod za pomocą interfejsu Repository, aby utworzyć łącznik treści. Metody zastępowania zależą od używanego szablonu i strategii przemierzania. W przypadku wartości ListingConnector zastąp te metody:

  • init() . Aby przeprowadzić konfigurację i zainicjowanie dowolnego repozytorium danych, zastąp Metoda init().

  • getIds() . Aby pobrać identyfikatory i wartości skrótu dla wszystkich rekordów w repozytorium, zastąpić metodę getIds().

  • getDoc() . Aby dodać nowe, zaktualizować, zmodyfikować lub usunąć elementy z indeksu, zastąp Metoda getDoc().

  • (opcjonalnie) Parametr getChanges() . Jeśli repozytorium obsługuje wykrywanie zmian, zastąp Metoda getChanges(). Ta metoda jest wywoływana raz dla każdego zaplanowanego przyrostu przemierzania (zgodnie z definicją w konfiguracji) w celu pobrania zmodyfikowanych elementów oraz w indeksie.

  • (opcjonalnie) Parametr close() . Jeśli chcesz wyczyścić repozytorium, zastąp close() . Ta metoda jest wywoływana raz podczas wyłączania oprogramowania sprzęgającego.

Każda z metod obiektu Repository zwraca określony typ ApiOperation obiektu. Obiekt ApiOperation wykonuje działanie w postaci pojedynczej lub np. kilku, IndexingService.indexItem() aby wykonać rzeczywiste indeksowanie repozytorium.

Pobierz niestandardowe parametry konfiguracji

W ramach konfiguracji oprogramowania sprzęgającego musisz pobrać parametrów niestandardowych z parametru Configuration obiektu. To zadanie jest zwykle wykonywane Repository zajęcia Metoda init().

Klasa Configuration ma kilka metod uzyskiwania różnych typów danych z konfiguracji. Każda metoda zwraca obiekt ConfigValue. Ty następnie użyj funkcji ConfigValue get() do pobrania rzeczywistej wartości. Ten fragment kodu pochodzi z: FullTraversalSample pokazuje, jak pobrać pojedynczą niestandardową wartość całkowitą z obiektu Configuration:

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

Aby pobrać i przeanalizować parametr zawierający kilka wartości, użyj jednej z funkcji parsery typów klasy Configuration do analizowania danych na części. Ten fragment kodu z oprogramowania sprzęgającego samouczka używa parametru getMultiValue metody pobierania listy nazw repozytoriów GitHub:

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

Przeprowadź przemierzanie listy

Zastąp getIds() do pobierania identyfikatorów i wartości hash dla wszystkich rekordów w repozytorium. Metoda getIds() akceptuje punkt kontrolny. Punkt kontrolny jest używany do wznawiania indeksowania konkretnego elementu, jeśli ten proces zostanie przerwany.

Następnie zastąp getDoc() do obsługi każdego elementu w kolejce indeksowania Cloud Search.

Przekazuj identyfikatory elementów i wartości skrótu

Zastąp getIds() do pobrania identyfikatorów produktów i powiązanych z nimi wartości skrótu treści z z repozytorium. Pary identyfikatora i wartości skrótu są następnie pakowane w operacje push do kolejki indeksowania w Cloud Search. Identyfikatory główne lub nadrzędne są zwykle najpierw przekazywane są identyfikatory podrzędne, aż cała hierarchia elementów zostanie przetworzono.

Metoda getIds() akceptuje punkt kontrolny reprezentujący ostatni element, który ma zostać . Za pomocą punktu kontrolnego można wznowić indeksowanie określonego elementu, który powinien proces może zostać przerwany. W przypadku każdego elementu w repozytorium wykonaj te kroki metody getIds():

  • Pobierz z repozytorium każdy identyfikator elementu i powiązaną wartość skrótu.
  • Umieść każdą parę identyfikatora i wartości skrótu w PushItems.
  • Połącz każde źródło PushItems w iterator zwrócony przez funkcję getIds() . Pamiętaj, że funkcja getIds() zwraca błąd CheckpointCloseableIterable czyli iterację ApiOperation każdy obiekt reprezentujący żądanie API wykonane na RepositoryDoc , na przykład przesyłając elementy do kolejki.

Poniższy fragment kodu pokazuje, jak uzyskać identyfikator i wartość skrótu każdego produktu oraz wstaw je do PushItems Żądanie PushItems to ApiOperation żądanie przekazania elementu do Cloud Search Kolejka indeksowania.

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

Fragment kodu poniżej pokazuje, jak używać parametru PushItems.Builder , aby spakować identyfikatory i wartości skrótu w pojedynczym przekazie push ApiOperation

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

Elementy są przekazywane do kolejki indeksowania w Cloud Search w celu dalszego przetwarzania.

Pobieranie i obsługa każdego elementu

Zastąp getDoc() do obsługi każdego elementu w kolejce indeksowania w Cloud Search. Element może być nowy, zmodyfikowany, niezmieniony lub nie może już istnieć w źródle z repozytorium. Pobierz i zindeksuj każdy nowy lub zmodyfikowany element. Usuń elementy z indeksu, którego już nie ma w repozytorium źródłowym.

Metoda getDoc() akceptuje element z Google Cloud Search Kolejka indeksowania. W przypadku każdego elementu w kolejce wykonaj te czynności Metoda getDoc():

  1. Sprawdź, czy identyfikator elementu znajduje się w kolejce indeksowania w Cloud Search. w repozytorium. Jeśli nie, usuń ten element z indeksu.

  2. Przeprowadź ankietę w indeksie pod kątem stanu elementu i jeśli element się nie zmieni (ACCEPTED), nie dodawaj cokolwiek robimy.

  3. Zmieniony indeks lub nowe elementy:

    1. Ustaw uprawnienia.
    2. Ustaw metadane zindeksowanego elementu.
    3. Połącz metadane i element w jeden możliwy do zindeksowania RepositoryDoc
    4. Zwrot RepositoryDoc.

Uwaga: szablon ListingConnector nie obsługuje zwracania wartości null w metody getDoc(). Zwracanie wyników null w NullPointerException.

Obsługa usuniętych elementów

Fragment kodu poniżej pokazuje, jak sprawdzić, czy element znajduje się w Jeśli tak nie jest, usuń je.

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

Pamiętaj, że documents to struktura danych reprezentująca repozytorium. Jeśli Nie znaleziono parametru documentID w polu documents, zwróć APIOperations.deleteItem(resourceName). aby usunąć ten element z indeksu.

Obsługa niezmienionych elementów

Ten fragment kodu pokazuje, jak sondować stan elementu w Cloud Search Kolejka indeksowania i obsługa niezmienionego elementu.

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

Aby ustalić, czy produkt jest niezmodyfikowany, sprawdź też jego stan jak inne metadane, które mogą wskazywać na zmianę. W przykładzie metadane jest używany do określenia, czy element uległ zmianie.

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

Ustawianie uprawnień elementu

Twoje repozytorium używa listy kontroli dostępu (ACL) do identyfikowania użytkowników lub grupy, które mają dostęp do elementu. Lista kontroli dostępu (ACL) to lista identyfikatorów grup lub użytkowników którzy mają dostęp do danego elementu.

Musisz zduplikować listę kontroli dostępu (ACL) używaną przez Twoje repozytorium, aby mieć pewność, że tylko tych użytkowników użytkownik z dostępem do elementu może zobaczyć go w wynikach wyszukiwania. Podczas indeksowania elementu musi być uwzględniona lista kontroli dostępu (ACL), aby usługa Google Cloud Search miała informacje potrzebne do zapewnienia odpowiedniego poziomu dostępu. elementu.

Content Connector SDK udostępnia bogaty zestaw klas i metod ACL, aby modelowanie list kontroli dostępu w większości repozytoriów. Musisz przeanalizować listę ACL dla każdego elementu w i utworzyć odpowiednią listę kontroli dostępu dla Google Cloud Search, indeksuj element. Jeśli lista kontroli dostępu repozytorium obejmuje takie elementy jak lista kontroli dostępu (ACL) dziedziczenie, modelowanie, że ACL może być trudne. Więcej informacji o Google Listy ACL Cloud Search: patrz Listy kontroli dostępu (ACL) w Google Cloud Search

Uwaga: interfejs Cloud Search Indexing API obsługuje listy kontroli dostępu (ACL) w jednej domenie. Nie obsługi list ACL dla wielu domen. Użyj Acl.Builder klasy dostępu do poszczególnych elementów za pomocą list kontroli dostępu. Poniższy fragment kodu został pobrany z pełnej próby przemierzania, umożliwia wszyscy użytkownicy lub „podmioty zabezpieczeń” (getCustomerPrincipal()) być „czytelnikami” wszystkich elementów (.setReaders()) podczas wyszukiwania.

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

Aby prawidłowo modelować listy kontroli dostępu w repozytorium, musisz znać listy kontroli dostępu. Dla: możesz na przykład indeksować pliki w systemie plików, Wykorzystuje model dziedziczenia, w którym foldery podrzędne dziedziczą uprawnienia. z folderów nadrzędnych. Dziedziczenie ACL w modelowaniu wymaga dodatkowych informacji poruszone w Listy kontroli dostępu (ACL) w Google Cloud Search

Ustawianie metadanych elementu

Metadane są przechowywane w obiekcie Item. Aby utworzyć Item, potrzebujesz musi zawierać co najmniej identyfikator unikalnego ciągu znaków, typ elementu, listę kontroli dostępu, adres URL i wersję elementu. Poniższy fragment kodu pokazuje, jak utworzyć Item za pomocą IndexingItemBuilder klasę pomocniczą.

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

Tworzenie elementu możliwego do indeksowania

Po ustawieniu metadanych elementu możesz utworzyć plik za pomocą atrybutu RepositoryDoc.Builder Przykład poniżej pokazuje, jak utworzyć pojedynczy element możliwy do zindeksowania.

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 jest typem ApiOperation, który wykonuje czynności IndexingService.indexItem() użytkownika.

Możesz też użyć usługi setRequestMode() funkcji RepositoryDoc.Builder klasa identyfikująca żądanie indeksowania jako ASYNCHRONOUS lub SYNCHRONOUS:

ASYNCHRONOUS
Tryb asynchroniczny wydłuża czas oczekiwania na indeksowanie i udostępnia obsługuje duży limit przepustowości żądań indeksowania. Obecny tryb asynchroniczny zalecane w przypadku początkowego indeksowania (zapełniania) całego repozytorium.
SYNCHRONOUS
Tryb synchroniczny skraca czas oczekiwania na indeksowanie i wyświetla, uwzględnia ograniczony limit przepustowości. Obecny tryb synchroniczny: jest zalecany w przypadku indeksowania aktualizacji i zmian w repozytorium. Jeśli nieokreślona, domyślny tryb żądania to SYNCHRONOUS.

Dalsze kroki

Oto kilka kolejnych kroków, które możesz podjąć:

Utwórz oprogramowanie sprzęgające przemierzania wykresu za pomocą klasy szablonu

Kolejka indeksowania w Cloud Search służy do przechowywania identyfikatorów i opcjonalnych wartości haszowania. dla każdego elementu w repozytorium. Łącznik przemierzania wykresu przekazuje identyfikatory elementów do z kolejki indeksowania Google Cloud Search i pobiera je pojedynczo dla indeksowanie. Google Cloud Search obsługuje kolejki i porównuje ich zawartość z określać stan elementu, np. czy został on usunięty z repozytorium. Więcej informacji na temat kolejki indeksowania w Cloud Search znajdziesz na stronie do Kolejka indeksowania w Google Cloud Search.

Podczas indeksowania treść elementu jest pobierana z repozytorium danych i wszystkie identyfikatory elementów podrzędnych są przekazywane do kolejki. Łącznik działa rekurencyjnie przetwarzania identyfikatorów nadrzędnych i podrzędnych do momentu zakończenia obsługi wszystkich elementów.

Ta sekcja dokumentacji odnosi się do fragmentów kodu z GraphTraversalSample przykład.

Wdróż punkt wejścia oprogramowania sprzęgającego

Punktem wejścia oprogramowania sprzęgającego jest Metoda main(). Głównym zadaniem tej metody jest utworzenie instancji Application i wywołaj jej klasę start() do uruchomienia oprogramowania sprzęgającego.

Zanim zadzwonisz application.start() użyj IndexingApplication.Builder klasy do utworzenia instancji szablonu ListingConnector. ListingConnector akceptuje Repository którego metody implementujesz.

Ten fragment kodu pokazuje, jak utwórz instancję ListingConnector i powiązaną z nią instancję Repository:

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

W tle pakiet SDK wywołuje metodę initConfig() po wywołaniu metody main() oprogramowania sprzęgającego Application.build Metoda initConfig():

  1. Wywołuje funkcję Configuation.isInitialized() aby zapewnić, że Configuration nie została zainicjowana.
  2. Inicjuje obiekt Configuration przy użyciu pary klucz-wartość dostarczonej przez Google pary. Każda para klucz-wartość jest przechowywana w pliku ConfigValue w obiekcie Configuration.

Wdrażanie interfejsu Repository

Jedynym celem Obiekt Repository służy do przemierzania i indeksowania repozytorium elementy(ów). Jeśli używasz szablonu, musisz zastąpić tylko określone metody w tagu Repository, aby utworzyć łącznik treści. Zastępowane metody zależą od używanego szablonu i strategii przemierzania. W przypadku wartości ListingConnector możesz zastąpić te metody:

  • init() . Aby przeprowadzić konfigurację i zainicjowanie dowolnego repozytorium danych, zastąp Metoda init().

  • getIds() . Aby pobrać identyfikatory i wartości skrótu dla wszystkich rekordów w repozytorium, zastąpić metodę getIds().

  • getDoc() . Aby dodać nowe, zaktualizować, zmodyfikować lub usunąć elementy z indeksu, zastąp Metoda getDoc().

  • (opcjonalnie) Parametr getChanges() . Jeśli repozytorium obsługuje wykrywanie zmian, zastąp Metoda getChanges(). Ta metoda jest wywoływana raz dla każdego zaplanowanego przyrostu przemierzania (zgodnie z definicją w konfiguracji) w celu pobrania zmodyfikowanych elementów oraz w indeksie.

  • (opcjonalnie) Parametr close() . Jeśli chcesz wyczyścić repozytorium, zastąp close() . Ta metoda jest wywoływana raz podczas wyłączania oprogramowania sprzęgającego.

Każda z metod Obiekt Repository zwraca jakiś typ obiektu ApiOperation. ApiOperation obiekt wykonuje działanie w formie jednej lub kilku, IndexingService.indexItem() aby wykonać rzeczywiste indeksowanie repozytorium.

Pobierz niestandardowe parametry konfiguracji

W ramach konfiguracji oprogramowania sprzęgającego musisz pobrać parametrów niestandardowych z parametru Configuration obiektu. To zadanie jest zwykle wykonywane Repository zajęcia Metoda init().

Klasa Configuration ma kilka metod uzyskiwania różnych typów danych z konfiguracji. Każda metoda zwraca obiekt ConfigValue. Ty następnie użyj funkcji ConfigValue get() do pobrania rzeczywistej wartości. Ten fragment kodu pochodzi z: FullTraversalSample pokazuje, jak pobrać pojedynczą niestandardową wartość całkowitą z obiektu Configuration:

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

Aby pobrać i przeanalizować parametr zawierający kilka wartości, użyj jednej z funkcji parsery typów klasy Configuration do analizowania danych na części. Ten fragment kodu z oprogramowania sprzęgającego samouczka używa parametru getMultiValue metody pobierania listy nazw repozytoriów GitHub:

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

Wykonaj przemierzanie wykresu

Zastąp getIds() do pobierania identyfikatorów i wartości hash dla wszystkich rekordów w repozytorium. Metoda getIds() akceptuje punkt kontrolny. Punkt kontrolny jest używany do wznawiania indeksowania konkretnego elementu, jeśli ten proces zostanie przerwany.

Następnie zastąp getDoc() do obsługi każdego elementu w kolejce indeksowania Cloud Search.

Przekazuj identyfikatory elementów i wartości skrótu

Zastąp getIds() do pobrania identyfikatorów produktów i powiązanych z nimi wartości skrótu treści z z repozytorium. Pary identyfikatora i wartości skrótu są następnie pakowane w operacje push do kolejki indeksowania w Cloud Search. Identyfikatory główne lub nadrzędne są zwykle najpierw przekazywane są identyfikatory podrzędne, aż cała hierarchia elementów zostanie przetworzono.

Metoda getIds() akceptuje punkt kontrolny reprezentujący ostatni element, który ma zostać . Za pomocą punktu kontrolnego można wznowić indeksowanie określonego elementu, który powinien proces może zostać przerwany. W przypadku każdego elementu w repozytorium wykonaj te kroki metody getIds():

  • Pobierz z repozytorium każdy identyfikator elementu i powiązaną wartość skrótu.
  • Umieść każdą parę identyfikatora i wartości skrótu w PushItems.
  • Połącz każde źródło PushItems w iterator zwrócony przez funkcję Metoda getIds(). Pamiętaj, że funkcja getIds() zwraca błąd CheckpointCloseableIterable czyli iterację ApiOperation każdy obiekt reprezentujący żądanie API wykonane na RepositoryDoc , na przykład przesyłając elementy do kolejki.

Poniższy fragment kodu pokazuje, jak uzyskać identyfikator i wartość skrótu każdego produktu oraz wstaw je do PushItems PushItems to Żądanie ApiOperation dotyczące przekazania elementu do kolejki indeksowania w Cloud Search.

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

Fragment kodu poniżej pokazuje, jak używać parametru PushItems.Builder , aby spakować identyfikatory i wartości skrótu w pojedynczym przekazie push ApiOperation

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

Elementy są przekazywane do kolejki indeksowania w Cloud Search w celu dalszego przetwarzania.

Pobieranie i obsługa każdego elementu

Zastąp getDoc() do obsługi każdego elementu w kolejce indeksowania w Cloud Search. Element może być nowy, zmodyfikowany, niezmieniony lub nie może już istnieć w źródle z repozytorium. Pobierz i zindeksuj każdy nowy lub zmodyfikowany element. Usuń elementy z indeksu, którego już nie ma w repozytorium źródłowym.

Metoda getDoc() akceptuje element z indeksowania Cloud Search Kolejka. W przypadku każdego elementu w kolejce wykonaj te czynności Metoda getDoc():

  1. Sprawdź, czy identyfikator elementu znajduje się w kolejce indeksowania w Cloud Search z repozytorium. Jeśli nie, usuń ten element z indeksu. Jeśli element istnieje, przejdź do następnego kroku.

  2. Zmieniony indeks lub nowe elementy:

    1. Ustaw uprawnienia.
    2. Ustaw metadane zindeksowanego elementu.
    3. Połącz metadane i element w jeden możliwy do zindeksowania RepositoryDoc
    4. Umieść identyfikatory podrzędne w kolejce indeksowania w Cloud Search w celu dalszego przetworzenia.
    5. Zwrot RepositoryDoc.

Obsługa usuniętych elementów

Ten fragment kodu pokazuje, jak sprawdzić, czy element znajduje się w indeksie a nie usuwa.

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

Ustawianie uprawnień elementu

Twoje repozytorium używa listy kontroli dostępu (ACL) do identyfikowania użytkowników lub grupy, które mają dostęp do elementu. Lista kontroli dostępu (ACL) to lista identyfikatorów grup lub użytkowników którzy mają dostęp do danego elementu.

Musisz zduplikować listę kontroli dostępu (ACL) używaną przez Twoje repozytorium, aby mieć pewność, że tylko tych użytkowników użytkownik z dostępem do elementu może zobaczyć go w wynikach wyszukiwania. Podczas indeksowania elementu musi być uwzględniona lista kontroli dostępu (ACL), aby usługa Google Cloud Search miała informacje potrzebne do zapewnienia odpowiedniego poziomu dostępu. elementu.

Content Connector SDK udostępnia bogaty zestaw klas i metod ACL, aby modelowanie list kontroli dostępu w większości repozytoriów. Musisz przeanalizować listę ACL dla każdego elementu w i utworzyć odpowiednią listę kontroli dostępu dla Google Cloud Search, indeksuj element. Jeśli lista kontroli dostępu repozytorium obejmuje takie elementy jak lista kontroli dostępu (ACL) dziedziczenie, modelowanie, że ACL może być trudne. Więcej informacji o Google Listy ACL Cloud Search: patrz Listy kontroli dostępu (ACL) w Google Cloud Search

Uwaga: interfejs Cloud Search Indexing API obsługuje listy kontroli dostępu (ACL) w jednej domenie. Nie obsługi list ACL dla wielu domen. Użyj Acl.Builder klasy dostępu do poszczególnych elementów za pomocą list kontroli dostępu. Poniższy fragment kodu został pobrany z pełnej próby przemierzania, umożliwia wszyscy użytkownicy lub „podmioty zabezpieczeń” (getCustomerPrincipal()) być „czytelnikami” wszystkich elementów (.setReaders()) podczas wyszukiwania.

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

Aby prawidłowo modelować listy kontroli dostępu w repozytorium, musisz znać listy kontroli dostępu. Dla: możesz na przykład indeksować pliki w systemie plików, Wykorzystuje model dziedziczenia, w którym foldery podrzędne dziedziczą uprawnienia. z folderów nadrzędnych. Dziedziczenie ACL w modelowaniu wymaga dodatkowych informacji poruszone w Listy kontroli dostępu (ACL) w Google Cloud Search

Ustawianie metadanych elementu

Metadane są przechowywane w obiekcie Item. Aby utworzyć Item, potrzebujesz musi zawierać co najmniej identyfikator unikalnego ciągu znaków, typ elementu, listę kontroli dostępu, adres URL i wersję elementu. Poniższy fragment kodu pokazuje, jak utworzyć Item za pomocą IndexingItemBuilder klasę pomocniczą.

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

Tworzenie elementu możliwego do indeksowania

Po ustawieniu metadanych elementu możesz utworzyć plik za pomocą atrybutu RepositoryDoc.Builder Przykład poniżej pokazuje, jak utworzyć pojedynczy element możliwy do zindeksowania.

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 to typ funkcji ApiOperation, który wykonuje działanie Prośba o IndexingService.indexItem().

Możesz też użyć usługi setRequestMode() funkcji RepositoryDoc.Builder klasa identyfikująca żądanie indeksowania jako ASYNCHRONOUS lub SYNCHRONOUS:

ASYNCHRONOUS
Tryb asynchroniczny wydłuża czas oczekiwania na indeksowanie i udostępnia obsługuje duży limit przepustowości żądań indeksowania. Obecny tryb asynchroniczny zalecane w przypadku początkowego indeksowania (zapełniania) całego repozytorium.
SYNCHRONOUS
Tryb synchroniczny skraca czas oczekiwania na indeksowanie i wyświetla, uwzględnia ograniczony limit przepustowości. Obecny tryb synchroniczny: jest zalecany w przypadku indeksowania aktualizacji i zmian w repozytorium. Jeśli nieokreślona, domyślny tryb żądania to SYNCHRONOUS.

Umieść identyfikatory podrzędne w kolejce indeksowania w Cloud Search

Fragment kodu poniżej pokazuje, jak dołączyć identyfikatory podrzędne dla parametru obecnie przetwarza element nadrzędny, do kolejki przetwarzania. Te identyfikatory są przetwarzane po zindeksowaniu elementu nadrzędnego.

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

Dalsze kroki

Oto kilka kolejnych kroków, które możesz podjąć:

Tworzenie oprogramowania sprzęgającego treści za pomocą interfejsu API REST

W poniższych sekcjach dowiesz się, jak utworzyć oprogramowanie sprzęgające treści za pomocą API typu REST.

Określ strategię przemierzania

Główną funkcją łącznika treści jest przemierzanie repozytorium indeksowanie jej danych. Musisz wdrożyć strategię przemierzania opartą na układ danych w repozytorium. Poniżej podano 3 typowe opcje przemierzania strategie:

Strategia pełnego przemierzania

Strategia pełnego przemierzania skanuje całe repozytorium i ślepo wykonuje indeksowanie każdego elementu. Ta strategia jest często stosowana, gdy masz małe repozytorium i możesz sobie pozwolić na koszty związane z pełnym przemierzaniem przy każdym indeksowaniu.

Ta strategia przemierzania jest odpowiednia dla małych repozytoriów zawierających głównie statyczne, niehierarchiczne. Możesz też użyć tej strategii przemierzania gdy wykrywanie zmian jest trudne lub nieobsługiwane przez repozytorium.

Strategia przemierzania listy

Strategia przemierzania listy skanuje całe repozytorium, w tym wszystkie obiekty podrzędne węzłów, które określają stan każdego elementu. Następnie łączy się przez chwilę i indeksuje tylko te elementy, które są nowe lub zostały zaktualizowane od ostatniego indeksowanie. Strategia ta jest zwykle wykorzystywana do zwiększania przyrostu wartości aktualizacji istniejącego indeksu (bez konieczności wykonywania pełnego przemierzania podczas aktualizowania indeksu).

Ta strategia przemierzania jest odpowiednia, gdy wykrywanie zmian jest trudne lub nie jest obsługiwane przez repozytorium, masz dane niehierarchiczne i jesteś pracy z bardzo dużymi zbiorami danych.

Omijanie wykresu

Strategia przemierzania wykresu skanuje cały węzeł nadrzędny, określając stan każdego elementu. Następnie oprogramowanie sprzęgające korzysta z drugiego przebiegu i przeprowadza indeksowanie tylko elementy w węźle głównym są nowe lub zostały zaktualizowane od ostatniego indeksowania. Na koniec oprogramowanie sprzęgające przekazuje wszelkie identyfikatory podrzędne, a następnie indeksuje elementy w węzłach podrzędnych. nowe lub zaktualizowane. Łącznik rekurencyjnie we wszystkich węzłach podrzędnych, dopóki nie zareagujesz na wszystkie elementy. Takie przemierzanie jest zwykle używany w repozytoriach hierarchicznych, w których lista wszystkich identyfikatorów nie jest praktyczny.

Ta strategia jest odpowiednia, jeśli masz dane hierarchiczne, które muszą np. katalogów serii lub stron internetowych.

Wdróż strategię przemierzania i indeksuj elementy

W Cloud Search każdy możliwy do zindeksowania element jest nazywany elementem za pomocą Cloud Search API. Elementem może być plik, folder, wiersz w pliku CSV lub rekordzie bazy danych.

Po zarejestrowaniu schematu możesz wypełnić indeks według:

  1. (Opcjonalnie) Przy użyciu: items.upload aby przesyłać do indeksowania pliki większe niż 100 KiB. W przypadku mniejszych plików umieść treść jako inlineContent za pomocą items.index.

  2. (Opcjonalnie) Przy użyciu: media.upload aby przesłać pliki multimedialne do zindeksowania.

  3. Użycie tagu items.index do zindeksowania elementu. Jeśli na przykład schemat wykorzystuje definicję obiektu z filmu , czyli żądanie indeksowania pojedynczego elementu element będzie wyglądał tak:

    {
      "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. (Opcjonalnie) Przy użyciu items.get. umożliwia weryfikację produktu został zindeksowany.

Aby wykonać pełne przemierzanie, konieczne było okresowe ponowne indeksowanie całej z repozytorium. Aby wykonać przemierzanie listy lub wykresu, musisz zaimplementować funkcję w którym możesz obsługiwać zmiany w repozytorium.

Obsługa zmian w repozytorium

Możesz okresowo gromadzić i indeksować każdy element z repozytorium, aby wykonać pełnego indeksowania. Chociaż skutecznie dba o aktualność indeksu, pełny indeksowanie może być kosztowne w przypadku większych lub hierarchicznych repozytoriów.

Zamiast co określony czas korzystać z wywołań indeksu do indeksowania całego repozytorium, można też używać kolejki indeksowania w Google Cloud jako mechanizm śledzenia zmian i indeksowania tylko tych elementów, została zmieniona. Za pomocą items.push żądań przesłania elementów do kolejki na potrzeby późniejszego odpytywania i aktualizowania. Więcej informacji na temat kolejki indeksowania w Google Cloud znajdziesz na stronie Kolejka indeksowania Google Cloud.

Więcej informacji o interfejsie Google Cloud Search API znajdziesz tutaj: Cloud Search API.