Sdílet prostřednictvím


SearchClient Třída

Klient pro interakci s existujícím indexem služby Azure Search.

Dědičnost
azure.search.documents._headers_mixin.HeadersMixin
SearchClient

Konstruktor

SearchClient(endpoint: str, index_name: str, credential: AzureKeyCredential | TokenCredential, **kwargs: Any)

Parametry

endpoint
str
Vyžadováno

Koncový bod adresy URL služby Azure Search

index_name
str
Vyžadováno

Název indexu, ke kterému se chcete připojit

credential
AzureKeyCredential nebo TokenCredential
Vyžadováno

Přihlašovací údaje pro autorizaci žádostí klientů vyhledávání

api_version
str

Verze rozhraní API pro vyhledávání, která se má použít pro požadavky.

audience
str

nastaví cílovou skupinu pro ověřování pomocí Azure Active Directory (AAD). Při použití sdíleného klíče se nezohlední cílová skupina. Pokud cílová skupina není k dispozici, předpokládá se cílová skupina veřejného cloudu.

Příklady

Vytvoření SearchClient s klíčem rozhraní API


   from azure.core.credentials import AzureKeyCredential
   from azure.search.documents import SearchClient

   service_endpoint = os.environ["AZURE_SEARCH_SERVICE_ENDPOINT"]
   index_name = os.environ["AZURE_SEARCH_INDEX_NAME"]
   key = os.environ["AZURE_SEARCH_API_KEY"]

   search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))

Metody

autocomplete

Získejte výsledky automatického dokončování hledání z indexu služby Azure Search.

kolekce, která je součástí definice indexu. :keyword mode: Určuje režim automatického dokončování. Výchozí hodnota je "oneTerm". Použití

TwoTerms pro získání šindelů a "oneTermWithContext" pro použití aktuálního kontextu při vytváření automaticky dokončených termínů. Mezi možné hodnoty patří: "oneTerm", "twoTerms", "oneTermWithContext".

close

Zavřete SearchClient relaci.

delete_documents

Odstranění dokumentů z indexu Služby Azure Search

Odstranění odebere zadaný dokument z indexu. Jakékoli pole, které zadáte v operaci odstranění, kromě pole s klíčem, bude ignorováno. Pokud chcete z dokumentu odebrat jednotlivá pole, použijte místo toho merge_documents a nastavte pole explicitně na Žádné.

Operace odstranění jsou idempotentní. To znamená, že i když klíč dokumentu v indexu neexistuje, výsledkem pokusu o operaci odstranění s tímto klíčem bude stavový kód 200.

get_document

Načtěte dokument z indexu Azure Search podle jeho klíče.

get_document_count

Vrátí počet dokumentů v indexu Služby Azure Search.

index_documents

Zadejte operace s dokumentem, které se mají provést jako dávka.

:Vyvolává RequestEntityTooLargeError

merge_documents

Sloučit dokumenty do existující dokumenty v indexu Služby Azure Search.

Sloučení aktualizuje existující dokument pomocí zadaných polí. Pokud dokument neexistuje, sloučení se nezdaří. Každé pole zadané ve sloučení nahradí stávající pole v dokumentu. To platí i pro kolekce primitivních a složitých typů.

merge_or_upload_documents

Sloučit dokumenty do existujících dokumentů v indexu Azure Search nebo je nahrát, pokud ještě neexistují.

Tato akce se chová jako merge_documents , pokud už v indexu existuje dokument s daným klíčem. Pokud dokument neexistuje, chová se jako upload_documents s novým dokumentem.

search

Vyhledejte dokumenty ve vyhledávacím indexu Azure.

suggest

Získejte výsledky návrhů hledání z indexu služby Azure Search.

a maximálně 100 znaků. :p aram str suggester_name: Povinné. Název návrhu zadaný v kolekci návrhy, která je součástí definice indexu. :keyword str filter: Výraz OData, který filtruje dokumenty uvažované pro návrhy. :keyword bool use_fuzzy_matching: Hodnota označující, jestli se má pro návrhy použít přibližné párování

Dotazu. Výchozí hodnota je false. Pokud je nastavená hodnota true, dotaz vyhledá termíny, i když je ve hledaném textu nahrazený nebo chybí znak. I když to v některých scénářích poskytuje lepší prostředí, má to náklady na výkon, protože dotazy na přibližné návrhy jsou pomalejší a spotřebovávají více prostředků.

upload_documents

Nahrajte dokumenty do indexu Azure Search.

Akce nahrání se podobá akci upsert, do které se dokument vloží, pokud je nový, a pokud existuje, aktualizuje nebo nahradí. Všechna pole jsou v případě aktualizace nahrazena.

autocomplete

Získejte výsledky automatického dokončování hledání z indexu služby Azure Search.

kolekce, která je součástí definice indexu. :keyword mode: Určuje režim automatického dokončování. Výchozí hodnota je "oneTerm". Použití

TwoTerms pro získání šindelů a "oneTermWithContext" pro použití aktuálního kontextu při vytváření automaticky dokončených termínů. Mezi možné hodnoty patří: "oneTerm", "twoTerms", "oneTermWithContext".

autocomplete(search_text: str, suggester_name: str, *, mode: str | AutocompleteMode | None = None, use_fuzzy_matching: bool | None = None, highlight_post_tag: str | None = None, highlight_pre_tag: str | None = None, minimum_coverage: float | None = None, search_fields: List[str] | None = None, top: int | None = None, **kwargs) -> List[Dict]

Parametry

filter
str

Výraz OData, který filtruje dokumenty použité k vytvoření dokončených termínů pro výsledek automatického dokončování.

use_fuzzy_matching
bool

Hodnota označující, jestli se má pro dotaz automatického dokončování použít přibližné párování. Výchozí hodnota je false. Pokud je nastavená hodnota true, dotaz vyhledá termíny, i když je ve hledaném textu nahrazený nebo chybí znak. I když to v některých scénářích poskytuje lepší prostředí, má to náklady na výkon, protože dotazy s přibližným automatickým dokončováním jsou pomalejší a spotřebovávají více prostředků.

highlight_post_tag
str

Značka řetězce, která je připojena k dosažení zvýraznění. Musí být nastaven pomocí highlightPreTag. Pokud je vynechán, zvýraznění kláves je zakázané.

highlight_pre_tag
str

Značka řetězce, která je předem připravená k dosažení zvýraznění. Musí být nastaven pomocí highlightPostTag. Pokud je vynechán, zvýraznění kláves je zakázané.

minimum_coverage
float

Číslo mezi 0 a 100 označující procento indexu, které musí být pokryto dotazem automatického dokončování, aby byl dotaz nahlášen jako úspěšný. Tento parametr může být užitečný pro zajištění dostupnosti vyhledávání i pro služby, které mají jenom jednu repliku. Výchozí hodnota je 80.

search_fields
list[str]

Seznam názvů polí, které je potřeba vzít v úvahu při dotazování na automaticky dokončené termíny. Cílová pole musí být zahrnuta v zadaném návrhu.

top
int

Počet automaticky dokončených termínů, které se mají načíst. Musí se jednat o hodnotu mezi 1 a 100. Výchozí hodnota je 5.

Návratový typ

Příklady

Získejte automatické dokončování.


   from azure.core.credentials import AzureKeyCredential
   from azure.search.documents import SearchClient

   search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))

   results = search_client.autocomplete(search_text="bo", suggester_name="sg")

   print("Autocomplete suggestions for 'bo'")
   for result in results:
       print("    Completion: {}".format(result["text"]))

close

Zavřete SearchClient relaci.

close() -> None

delete_documents

Odstranění dokumentů z indexu Služby Azure Search

Odstranění odebere zadaný dokument z indexu. Jakékoli pole, které zadáte v operaci odstranění, kromě pole s klíčem, bude ignorováno. Pokud chcete z dokumentu odebrat jednotlivá pole, použijte místo toho merge_documents a nastavte pole explicitně na Žádné.

Operace odstranění jsou idempotentní. To znamená, že i když klíč dokumentu v indexu neexistuje, výsledkem pokusu o operaci odstranění s tímto klíčem bude stavový kód 200.

delete_documents(documents: List[Dict], **kwargs: Any) -> List[IndexingResult]

Parametry

documents
list[dict]
Vyžadováno

Seznam dokumentů, které chcete odstranit.

Návraty

Seznam indexováníResult

Návratový typ

Příklady

Odstranění existujících dokumentů do indexu


   result = search_client.delete_documents(documents=[{"hotelId": "1000"}])

   print("Delete new document succeeded: {}".format(result[0].succeeded))

get_document

Načtěte dokument z indexu Azure Search podle jeho klíče.

get_document(key: str, selected_fields: List[str] | None = None, **kwargs: Any) -> Dict

Parametry

key
str
Vyžadováno

Hodnota primárního klíče pro načtení dokumentu

selected_fields
list[str]
Vyžadováno

seznam povolených polí, která se mají zahrnout do výsledků

Návraty

Dokument uložený v indexu Služby Azure Search

Návratový typ

Příklady

Získejte konkrétní dokument z indexu vyhledávání.


   from azure.core.credentials import AzureKeyCredential
   from azure.search.documents import SearchClient

   search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))

   result = search_client.get_document(key="23")

   print("Details for hotel '23' are:")
   print("        Name: {}".format(result["hotelName"]))
   print("      Rating: {}".format(result["rating"]))
   print("    Category: {}".format(result["category"]))

get_document_count

Vrátí počet dokumentů v indexu Služby Azure Search.

get_document_count(**kwargs: Any) -> int

Návraty

Počet dokumentů v indexu

Návratový typ

int

index_documents

Zadejte operace s dokumentem, které se mají provést jako dávka.

:Vyvolává RequestEntityTooLargeError

index_documents(batch: IndexDocumentsBatch, **kwargs: Any) -> List[IndexingResult]

Parametry

batch
IndexDocumentsBatch
Vyžadováno

Dávka operací s dokumentem, které se mají provést.

Návraty

Seznam indexováníResult

Návratový typ

merge_documents

Sloučit dokumenty do existující dokumenty v indexu Služby Azure Search.

Sloučení aktualizuje existující dokument pomocí zadaných polí. Pokud dokument neexistuje, sloučení se nezdaří. Každé pole zadané ve sloučení nahradí stávající pole v dokumentu. To platí i pro kolekce primitivních a složitých typů.

merge_documents(documents: List[Dict], **kwargs: Any) -> List[IndexingResult]

Parametry

documents
list[dict]
Vyžadováno

Seznam dokumentů, které se mají sloučit.

Návraty

Seznam indexováníResult

Návratový typ

Příklady

Sloučení polí do existujících dokumentů do indexu


   result = search_client.merge_documents(documents=[{"hotelId": "1000", "rating": 4.5}])

   print("Merge into new document succeeded: {}".format(result[0].succeeded))

merge_or_upload_documents

Sloučit dokumenty do existujících dokumentů v indexu Azure Search nebo je nahrát, pokud ještě neexistují.

Tato akce se chová jako merge_documents , pokud už v indexu existuje dokument s daným klíčem. Pokud dokument neexistuje, chová se jako upload_documents s novým dokumentem.

merge_or_upload_documents(documents: List[Dict], **kwargs: Any) -> List[IndexingResult]

Parametry

documents
list[dict]
Vyžadováno

Seznam dokumentů ke sloučení nebo nahrání

Návraty

Seznam indexováníResult

Návratový typ

Vyhledejte dokumenty ve vyhledávacím indexu Azure.

search(search_text: str | None = None, *, include_total_count: bool | None = None, facets: List[str] | None = None, filter: str | None = None, highlight_fields: str | None = None, highlight_post_tag: str | None = None, highlight_pre_tag: str | None = None, minimum_coverage: float | None = None, order_by: List[str] | None = None, query_type: str | QueryType | None = None, scoring_parameters: List[str] | None = None, scoring_profile: str | None = None, search_fields: List[str] | None = None, search_mode: str | SearchMode | None = None, query_answer: str | QueryAnswerType | None = None, query_answer_count: int | None = None, query_answer_threshold: float | None = None, query_caption: str | QueryCaptionType | None = None, query_caption_highlight_enabled: bool | None = None, semantic_configuration_name: str | None = None, select: List[str] | None = None, skip: int | None = None, top: int | None = None, scoring_statistics: str | ScoringStatistics | None = None, session_id: str | None = None, vector_queries: List[VectorQuery] | None = None, vector_filter_mode: str | VectorFilterMode | None = None, semantic_error_mode: str | SemanticErrorMode | None = None, semantic_max_wait_in_milliseconds: int | None = None, **kwargs: Any) -> SearchItemPaged[Dict]

Parametry

search_text
str
Vyžadováno

Výraz fulltextového vyhledávacího dotazu; Pokud chcete spárovat všechny dokumenty, použijte "*" nebo tento parametr vyněžte.

include_total_count
bool

Hodnota, která určuje, zda se má načíst celkový počet výsledků. Výchozí hodnota je false. Nastavení této hodnoty na true může mít vliv na výkon. Všimněte si, že vrácený počet je přibližný.

facets
list[str]

Seznam výrazů omezujících vlastností, které se mají použít u vyhledávacího dotazu. Každý výraz omezující vlastnosti obsahuje název pole, za kterým volitelně následuje čárkami oddělený seznam párů název:hodnota.

filter
str

OData $filter výraz, který se má použít u vyhledávacího dotazu.

highlight_fields
str

Seznam názvů polí oddělených čárkami, který se má použít pro zvýraznění přístupů. Ke zvýraznění přístupů je možné použít pouze prohledávatelná pole.

highlight_post_tag
str

Značka řetězce, která je připojena k dosažení zvýraznění. Musí být nastaven pomocí highlightPreTag. Výchozí je .

highlight_pre_tag
str

Značka řetězce, která je předem připravená k dosažení zvýraznění. Musí být nastaven pomocí highlightPostTag. Výchozí je .

minimum_coverage
float

Číslo mezi 0 a 100 označující procento indexu, které musí být pokryto vyhledávacím dotazem, aby byl dotaz nahlášen jako úspěšný. Tento parametr může být užitečný pro zajištění dostupnosti vyhledávání i pro služby, které mají jenom jednu repliku. Výchozí hodnota je 100.

order_by
list[str]

Seznam OData $orderby výrazy, podle kterých se mají výsledky seřadit. Každý výraz může být buď názvem pole, nebo voláním funkcí geo.distance() nebo search.score(). Za každým výrazem může následovat asc, který označuje vzestupně, a desc pro označení sestupného. Výchozí hodnota je vzestupné pořadí. Vazby budou přerušeny skóre shody dokumentů. Pokud není zadán žádný OrderBy, výchozí pořadí řazení je sestupné podle skóre shody dokumentu. Může existovat maximálně 32 $orderby klauzulí.

query_type
str nebo QueryType

Hodnota, která určuje syntaxi vyhledávacího dotazu. Výchozí hodnota je "jednoduchá". Pokud dotaz používá syntaxi dotazu Lucene, použijte "full". Mezi možné hodnoty patří: 'simple', 'full', "sémantic".

scoring_parameters
list[str]

Seznam hodnot parametrů, které se mají použít v bodovacích funkcích (například referencePointParameter) s použitím formátu name-values. Pokud například bodovací profil definuje funkci s parametrem s názvem mylocation, řetězec parametru bude "mylocation–122.2;44.8" (bez uvozovek).

scoring_profile
str

Název profilu bodování, který má vyhodnotit skóre shody pro odpovídající dokumenty, aby bylo možné výsledky seřadit.

search_fields
list[str]

Seznam názvů polí, na které se má nastavit rozsah fulltextového vyhledávání. Při použití hledání v polích (fieldName:searchExpression) v úplném dotazu Lucene mají názvy polí jednotlivých výrazů hledání v polích přednost před názvy polí uvedených v tomto parametru.

search_mode
str nebo SearchMode

Hodnota, která určuje, jestli se musí některé nebo všechny hledané termíny shodovat, aby bylo možné dokument spočítat jako shodu. Mezi možné hodnoty patří: "any", "all".

query_answer
str nebo QueryAnswerType

Tento parametr je platný pouze v případě, že je typ dotazu sémantický. Pokud je tato možnost nastavená, dotaz vrátí odpovědi extrahované z klíčových pasáží v nejvýše hodnocených dokumentech. Mezi možné hodnoty patří: "none", "extractive".

query_answer_count
int

Tento parametr je platný pouze v případě, že je typ dotazu "sémantický" a odpověď na dotaz je "extractive". Konfiguruje počet vrácených odpovědí. Výchozí počet je 1.

query_answer_threshold
float

Tento parametr je platný pouze v případě, že je typ dotazu "sémantický" a odpověď na dotaz je "extractive". Konfiguruje počet prahových hodnot spolehlivosti. Výchozí počet je 0,7.

query_caption
str nebo QueryCaptionType

Tento parametr je platný pouze v případě, že je typ dotazu sémantický. Pokud je tato možnost nastavená, dotaz vrátí titulky extrahované z klíčových pasáží v dokumentech s nejvyšším pořadím. Výchozí hodnota je Žádná. Mezi možné hodnoty patří: "none", "extractive".

query_caption_highlight_enabled
bool

Tento parametr je platný pouze v případě, že je typ dotazu "sémantický", pokud je popis dotazu nastaven na "extractive". Určuje, jestli je povolené zvýrazňování. Výchozí hodnota je true.

semantic_configuration_name
str

Název sémantické konfigurace, která se použije při zpracování dokumentů pro sémantické dotazy typu.

select
list[str]

Seznam polí, která se mají načíst. Pokud není zadáno, budou zahrnuta všechna pole označená jako načístelná ve schématu.

skip
int

Počet výsledků hledání, které se mají přeskočit. Tato hodnota nesmí být větší než 100 000. Pokud potřebujete skenovat dokumenty v posloupnosti, ale nemůžete kvůli tomuto omezení použít $skip, zvažte použití $orderby u zcela seřazeného klíče a $filter s dotazem na rozsah.

top
int

Počet výsledků hledání, které se mají načíst. To se dá použít ve spojení s $skip k implementaci stránkování výsledků hledání na straně klienta. Pokud jsou výsledky zkráceny kvůli stránkování na straně serveru, odpověď bude obsahovat pokračovací token, který lze použít k vydání dalšího požadavku hledání na další stránku výsledků.

scoring_statistics
str nebo ScoringStatistics

Hodnota, která určuje, jestli chceme vypočítat statistiku bodování (například četnost dokumentů) globálně pro konzistentnější bodování, nebo místně pro nižší latenci. Výchozí hodnota je "local". Globální použijte k globální agregaci statistik bodování po celém světě před bodováním. Použití statistik globálního bodování může zvýšit latenci vyhledávacích dotazů. Mezi možné hodnoty patří: "local", "global".

session_id
str

Hodnota, která se má použít k vytvoření rychlé relace, což může pomoct získat konzistentnější výsledky. Pokud se použije stejné id relace, provede se pokus o cílení na stejnou sadu replik. Buďte opatrní, že opakované opakované použití stejných hodnot sessionID může narušovat vyrovnávání zatížení požadavků napříč replikami a nepříznivě ovlivnit výkon vyhledávací služby. Hodnota použitá jako sessionId nemůže začínat znakem _.

semantic_error_mode
str nebo SemanticErrorMode

Umožňuje uživateli zvolit, jestli má sémantické volání zcela selhat (výchozí nebo aktuální chování), nebo vrátit částečné výsledky. Známé hodnoty jsou: "partial" a "fail".

semantic_max_wait_in_milliseconds
int

Umožňuje uživateli nastavit horní mez na dobu potřebnou k dokončení zpracování sémantického obohacení, než požadavek selže.

vector_queries
list[VectorQuery]

Parametry dotazu pro vektorové a hybridní vyhledávací dotazy.

vector_filter_mode
str nebo VectorFilterMode

Určuje, zda jsou filtry použity před nebo po provedení vektorového vyhledávání. Výchozí hodnota je preFilter. Známé hodnoty jsou: "postFilter" a "preFilter".

Návratový typ

Příklady

Získejte omezující vlastnosti výsledků hledání.


   from azure.core.credentials import AzureKeyCredential
   from azure.search.documents import SearchClient

   search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))

   results = search_client.search(search_text="WiFi", facets=["category,count:3", "parkingIncluded"])

   facets: Dict[str, List[str]] = cast(Dict[str, List[str]], results.get_facets())

   print("Catgory facet counts for hotels:")
   for facet in facets["category"]:
       print("    {}".format(facet))

suggest

Získejte výsledky návrhů hledání z indexu služby Azure Search.

a maximálně 100 znaků. :p aram str suggester_name: Povinné. Název návrhu zadaný v kolekci návrhy, která je součástí definice indexu. :keyword str filter: Výraz OData, který filtruje dokumenty uvažované pro návrhy. :keyword bool use_fuzzy_matching: Hodnota označující, jestli se má pro návrhy použít přibližné párování

Dotazu. Výchozí hodnota je false. Pokud je nastavená hodnota true, dotaz vyhledá termíny, i když je ve hledaném textu nahrazený nebo chybí znak. I když to v některých scénářích poskytuje lepší prostředí, má to náklady na výkon, protože dotazy na přibližné návrhy jsou pomalejší a spotřebovávají více prostředků.

suggest(search_text: str, suggester_name: str, *, use_fuzzy_matching: bool | None = None, highlight_post_tag: str | None = None, highlight_pre_tag: str | None = None, minimum_coverage: float | None = None, order_by: List[str] | None = None, search_fields: List[str] | None = None, select: List[str] | None = None, top: int | None = None, **kwargs) -> List[Dict]

Parametry

highlight_post_tag
str

Značka řetězce, která je připojena k dosažení zvýraznění. Musí být nastaven pomocí highlightPreTag. Pokud ho vynecháte, je zvýraznění návrhů zakázané.

highlight_pre_tag
str

Značka řetězce, která je předem připravená k dosažení zvýraznění. Musí být nastaven pomocí highlightPostTag. Pokud ho vynecháte, je zvýraznění návrhů zakázané.

minimum_coverage
float

Číslo mezi 0 a 100 označující procento indexu, které musí být pokryto návrhovým dotazem, aby se dotaz ohlásil jako úspěšný. Tento parametr může být užitečný pro zajištění dostupnosti vyhledávání i pro služby, které mají jenom jednu repliku. Výchozí hodnota je 80.

order_by
list[str]

Seznam OData $orderby výrazy, podle kterých se mají výsledky seřadit. Každý výraz může být buď názvem pole, nebo voláním funkcí geo.distance() nebo search.score(). Za každým výrazem může následovat asc, který označuje vzestupně, nebo desc pro označení sestupně. Výchozí hodnota je vzestupné pořadí. Vazby budou přerušeny skóre shody dokumentů. Pokud není zadána žádná $orderby, výchozí pořadí řazení je sestupné podle skóre shody dokumentu. Může existovat maximálně 32 $orderby klauzulí.

search_fields
list[str]

Seznam názvů polí pro vyhledání zadaného hledaného textu. Cílová pole musí být zahrnuta v zadaném návrhu.

select
list[str]

Seznam polí, která se mají načíst. Pokud není zadáno, bude do výsledků zahrnuto pouze pole s klíčem.

top
int

Počet návrhů, které se mají načíst. Hodnota musí být číslo mezi 1 a 100. Výchozí hodnota je 5.

Návraty

Seznam dokumentů.

Návratový typ

Příklady

Získejte návrhy hledání.


   from azure.core.credentials import AzureKeyCredential
   from azure.search.documents import SearchClient

   search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))

   results = search_client.suggest(search_text="coffee", suggester_name="sg")

   print("Search suggestions for 'coffee'")
   for result in results:
       hotel = search_client.get_document(key=result["hotelId"])
       print("    Text: {} for Hotel: {}".format(repr(result["text"]), hotel["hotelName"]))

upload_documents

Nahrajte dokumenty do indexu Azure Search.

Akce nahrání se podobá akci upsert, do které se dokument vloží, pokud je nový, a pokud existuje, aktualizuje nebo nahradí. Všechna pole jsou v případě aktualizace nahrazena.

upload_documents(documents: List[Dict], **kwargs: Any) -> List[IndexingResult]

Parametry

documents
list[dict]
Vyžadováno

Seznam dokumentů k nahrání.

Návraty

Seznam indexováníResult

Návratový typ

Příklady

Nahrání nových dokumentů do indexu


   DOCUMENT = {
       "category": "Hotel",
       "hotelId": "1000",
       "rating": 4.0,
       "rooms": [],
       "hotelName": "Azure Inn",
   }

   result = search_client.upload_documents(documents=[DOCUMENT])

   print("Upload of new document succeeded: {}".format(result[0].succeeded))