[Enterprise Search][Search Application] Update engines to be search application (#155299)

## Summary

* Update 'engines' to be 'Search Application' in UI 
* Navigate to Search application from indices page rather than app search engine
* Pre-select index and open Create Search Application Flyout when navigated from Index page




https://user-images.githubusercontent.com/55930906/233170965-318cdc63-2953-45f8-89d3-b3f15f11ab11.mov





### Checklist

Delete any items that are not applicable to this PR.

- [x] Any text added follows [EUI's writing
guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses
sentence case text and includes [i18n
support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md)
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
This commit is contained in:
Saarika Bhasi 2023-04-21 09:24:02 -04:00 committed by GitHub
parent b97b18eecd
commit d32c867417
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 205 additions and 406 deletions

View file

@ -119,8 +119,8 @@ export const SEARCH_EXPERIENCES_PLUGIN = {
};
export const ENGINES_PLUGIN = {
NAV_TITLE: i18n.translate('xpack.enterpriseSearch.engines.navTitle', {
defaultMessage: 'Engines',
NAV_TITLE: i18n.translate('xpack.enterpriseSearch.applications.navTitle', {
defaultMessage: 'Applications',
}),
};

View file

@ -45,10 +45,13 @@ export const AddIndicesFlyout: React.FC<AddIndicesFlyoutProps> = ({ onClose }) =
const { selectedIndices, updateEngineStatus, updateEngineError } = useValues(AddIndicesLogic);
const { setSelectedIndices, submitSelectedIndices } = useActions(AddIndicesLogic);
const selectedOptions = useMemo(() => selectedIndices.map(indexToOption), [selectedIndices]);
const selectedOptions = useMemo(
() => selectedIndices.map((index) => indexToOption(index)),
[selectedIndices]
);
const onIndicesChange = useCallback(
(options: IndicesSelectComboBoxOption[]) => {
setSelectedIndices(options.map(({ value }) => value).filter(isNotNullish));
setSelectedIndices(options.map(({ label }) => label).filter(isNotNullish));
},
[setSelectedIndices]
);

View file

@ -8,7 +8,6 @@
import { LogicMounter } from '../../../__mocks__/kea_logic';
import { Status } from '../../../../../common/types/api';
import { ElasticsearchIndexWithIngestion } from '../../../../../common/types/indices';
import { AddIndicesLogic, AddIndicesLogicValues } from './add_indices_logic';
@ -18,16 +17,6 @@ const DEFAULT_VALUES: AddIndicesLogicValues = {
updateEngineStatus: Status.IDLE,
};
const makeIndexData = (name: string): ElasticsearchIndexWithIngestion => ({
count: 0,
hidden: false,
name,
total: {
docs: { count: 0, deleted: 0 },
store: { size_in_bytes: 'n/a' },
},
});
describe('AddIndicesLogic', () => {
const { mount: mountAddIndicesLogic } = new LogicMounter(AddIndicesLogic);
const { mount: mountEngineIndicesLogic } = new LogicMounter(AddIndicesLogic);
@ -47,31 +36,16 @@ describe('AddIndicesLogic', () => {
describe('actions', () => {
describe('setSelectedIndices', () => {
it('adds the indices to selectedIndices', () => {
AddIndicesLogic.actions.setSelectedIndices([
makeIndexData('index-001'),
makeIndexData('index-002'),
]);
AddIndicesLogic.actions.setSelectedIndices(['index-001', 'index-002']);
expect(AddIndicesLogic.values.selectedIndices).toEqual([
makeIndexData('index-001'),
makeIndexData('index-002'),
]);
expect(AddIndicesLogic.values.selectedIndices).toEqual(['index-001', 'index-002']);
});
it('replaces any existing indices', () => {
AddIndicesLogic.actions.setSelectedIndices([
makeIndexData('index-001'),
makeIndexData('index-002'),
]);
AddIndicesLogic.actions.setSelectedIndices([
makeIndexData('index-003'),
makeIndexData('index-004'),
]);
AddIndicesLogic.actions.setSelectedIndices(['index-001', 'index-002']);
AddIndicesLogic.actions.setSelectedIndices(['index-003', 'index-004']);
expect(AddIndicesLogic.values.selectedIndices).toEqual([
makeIndexData('index-003'),
makeIndexData('index-004'),
]);
expect(AddIndicesLogic.values.selectedIndices).toEqual(['index-003', 'index-004']);
});
});
});
@ -103,10 +77,7 @@ describe('AddIndicesLogic', () => {
it('calls addIndicesToEngine when there are selectedIndices', () => {
jest.spyOn(AddIndicesLogic.actions, 'addIndicesToEngine');
AddIndicesLogic.actions.setSelectedIndices([
makeIndexData('index-001'),
makeIndexData('index-002'),
]);
AddIndicesLogic.actions.setSelectedIndices(['index-001', 'index-002']);
AddIndicesLogic.actions.submitSelectedIndices();
expect(AddIndicesLogic.actions.addIndicesToEngine).toHaveBeenCalledTimes(1);

View file

@ -7,8 +7,6 @@
import { kea, MakeLogicType } from 'kea';
import { ElasticsearchIndexWithIngestion } from '../../../../../common/types/indices';
import { UpdateEngineApiLogic } from '../../api/engines/update_engine_api_logic';
import { EngineIndicesLogic, EngineIndicesLogicActions } from './engine_indices_logic';
@ -17,21 +15,21 @@ export interface AddIndicesLogicActions {
addIndicesToEngine: EngineIndicesLogicActions['addIndicesToEngine'];
closeAddIndicesFlyout: EngineIndicesLogicActions['closeAddIndicesFlyout'];
engineUpdated: EngineIndicesLogicActions['engineUpdated'];
setSelectedIndices: (indices: ElasticsearchIndexWithIngestion[]) => {
indices: ElasticsearchIndexWithIngestion[];
setSelectedIndices: (indices: string[]) => {
indices: string[];
};
submitSelectedIndices: () => void;
}
export interface AddIndicesLogicValues {
selectedIndices: ElasticsearchIndexWithIngestion[];
selectedIndices: string[];
updateEngineError: typeof UpdateEngineApiLogic.values.error | undefined;
updateEngineStatus: typeof UpdateEngineApiLogic.values.status;
}
export const AddIndicesLogic = kea<MakeLogicType<AddIndicesLogicValues, AddIndicesLogicActions>>({
actions: {
setSelectedIndices: (indices: ElasticsearchIndexWithIngestion[]) => ({ indices }),
setSelectedIndices: (indices: string[]) => ({ indices }),
submitSelectedIndices: () => true,
},
connect: {
@ -46,7 +44,7 @@ export const AddIndicesLogic = kea<MakeLogicType<AddIndicesLogicValues, AddIndic
const { selectedIndices } = values;
if (selectedIndices.length === 0) return;
actions.addIndicesToEngine(selectedIndices.map(({ name }) => name));
actions.addIndicesToEngine(selectedIndices);
},
}),
path: ['enterprise_search', 'content', 'add_indices_logic'],

View file

@ -73,7 +73,7 @@ export const EngineApiIntegrationStage: React.FC = () => {
<p>
{i18n.translate('xpack.enterpriseSearch.content.engine.api.step3.intro', {
defaultMessage:
'Learn how to integrate with your engine with the language clients maintained by Elastic to help build your search experience.',
'Learn how to integrate with your search application with the language clients maintained by Elastic to help build your search experience.',
})}
</p>
</EuiText>

View file

@ -59,7 +59,7 @@ export const GenerateEngineApiKeyModal: React.FC<GenerateEngineApiKeyModalProps>
{i18n.translate(
'xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.title',
{
defaultMessage: 'Create Engine read-only API Key',
defaultMessage: 'Create Search application read-only API Key',
}
)}
</EuiModalHeaderTitle>

View file

@ -43,26 +43,32 @@ export const SearchApplicationAPI = () => {
const steps = [
{
title: i18n.translate('xpack.enterpriseSearch.content.engine.api.step1.title', {
title: i18n.translate('xpack.enterpriseSearch.content.searchApplication.api.step1.title', {
defaultMessage: 'Generate and save API key',
}),
children: (
<>
<EuiText>
<p>
{i18n.translate('xpack.enterpriseSearch.content.engine.api.step1.apiKeyWarning', {
defaultMessage:
"Elastic does not store API keys. Once generated, you'll only be able to view the key one time. Make sure you save it somewhere secure. If you lose access to it you'll need to generate a new API key from this screen.",
})}{' '}
{i18n.translate(
'xpack.enterpriseSearch.content.searchApplication.api.step1.apiKeyWarning',
{
defaultMessage:
"Elastic does not store API keys. Once generated, you'll only be able to view the key one time. Make sure you save it somewhere secure. If you lose access to it you'll need to generate a new API key from this screen.",
}
)}{' '}
<EuiLink
href={docLinks.apiKeys}
data-telemetry-id="entSearchContent-engines-api-step1-learnMoreLink"
data-telemetry-id="entSearchContent-searchApplications-api-step1-learnMoreLink"
external
target="_blank"
>
{i18n.translate('xpack.enterpriseSearch.content.engine.api.step1.learnMoreLink', {
defaultMessage: 'Learn more about API keys.',
})}
{i18n.translate(
'xpack.enterpriseSearch.content.searchApplication.api.step1.learnMoreLink',
{
defaultMessage: 'Learn more about API keys.',
}
)}
</EuiLink>
</p>
</EuiText>
@ -73,10 +79,10 @@ export const SearchApplicationAPI = () => {
iconSide="left"
iconType="plusInCircleFilled"
onClick={openGenerateModal}
data-telemetry-id="entSearchContent-engines-api-step1-createApiKeyButton"
data-telemetry-id="entSearchContent-searchApplications-api-step1-createApiKeyButton"
>
{i18n.translate(
'xpack.enterpriseSearch.content.engine.api.step1.createAPIKeyButton',
'xpack.enterpriseSearch.content.searchApplication.api.step1.createAPIKeyButton',
{
defaultMessage: 'Create API Key',
}
@ -87,16 +93,19 @@ export const SearchApplicationAPI = () => {
<EuiButton
iconSide="left"
iconType="popout"
data-telemetry-id="entSearchContent-engines-api-step1-viewKeysButton"
data-telemetry-id="entSearchContent-searchApplications-api-step1-viewKeysButton"
onClick={() =>
KibanaLogic.values.navigateToUrl('/app/management/security/api_keys', {
shouldNotCreateHref: true,
})
}
>
{i18n.translate('xpack.enterpriseSearch.content.engine.api.step1.viewKeysButton', {
defaultMessage: 'View Keys',
})}
{i18n.translate(
'xpack.enterpriseSearch.content.searchApplication.api.step1.viewKeysButton',
{
defaultMessage: 'View Keys',
}
)}
</EuiButton>
</EuiFlexItem>
</EuiFlexGroup>
@ -104,17 +113,17 @@ export const SearchApplicationAPI = () => {
),
},
{
title: i18n.translate('xpack.enterpriseSearch.content.engine.api.step2.title', {
defaultMessage: "Copy your engine's endpoint",
title: i18n.translate('xpack.enterpriseSearch.content.searchApplication.api.step2.title', {
defaultMessage: "Copy your search application's endpoint",
}),
children: (
<>
<EuiText>
<p>
{i18n.translate(
'xpack.enterpriseSearch.content.engine.api.step2.copyEndpointDescription',
'xpack.enterpriseSearch.content.searchApplication.api.step2.copyEndpointDescription',
{
defaultMessage: "Use this URL to access your engine's API endpoints.",
defaultMessage: "Use this URL to access your search application's API endpoints.",
}
)}
</p>
@ -131,22 +140,22 @@ export const SearchApplicationAPI = () => {
),
},
{
title: i18n.translate('xpack.enterpriseSearch.content.engine.api.step3.title', {
title: i18n.translate('xpack.enterpriseSearch.content.searchApplication.api.step3.title', {
defaultMessage: 'Learn how to call your endpoints',
}),
children: <EngineApiIntegrationStage />,
},
{
title: i18n.translate('xpack.enterpriseSearch.content.engine.api.step4.title', {
title: i18n.translate('xpack.enterpriseSearch.content.searchApplication.api.step4.title', {
defaultMessage: '(Optional) Power up your analytics',
}),
children: (
<>
<EuiText>
<p>
{i18n.translate('xpack.enterpriseSearch.content.engine.api.step4.copy', {
{i18n.translate('xpack.enterpriseSearch.content.searchApplication.api.step4.copy', {
defaultMessage:
'Your engine provides basic analytics data as part of this installation. To receive more granular and custom metrics, integrate our Behavioral Analytics script on your platform.',
'Your search application provides basic analytics data as part of this installation. To receive more granular and custom metrics, integrate our Behavioral Analytics script on your platform.',
})}
</p>
</EuiText>
@ -154,7 +163,7 @@ export const SearchApplicationAPI = () => {
<EuiFlexGroup>
<EuiFlexItem grow={false}>
<EuiButton
data-telemetry-id="entSearchContent-engines-api-step4-learnHowLink"
data-telemetry-id="entSearchContent-searchApplications-api-step4-learnHowLink"
onClick={() =>
navigateToUrl(
generateEncodedPath(`${ANALYTICS_PLUGIN.URL}${COLLECTION_INTEGRATE_PATH}`, {
@ -166,9 +175,12 @@ export const SearchApplicationAPI = () => {
iconSide="left"
iconType="popout"
>
{i18n.translate('xpack.enterpriseSearch.content.engine.api.step4.learnHowLink', {
defaultMessage: 'Learn how',
})}
{i18n.translate(
'xpack.enterpriseSearch.content.searchApplication.api.step4.learnHowLink',
{
defaultMessage: 'Learn how',
}
)}
</EuiButton>
</EuiFlexItem>
</EuiFlexGroup>

View file

@ -40,7 +40,7 @@ describe('EngineError', () => {
const notFound = wrapper.find(NotFoundPrompt);
expect(notFound.prop('backToLink')).toEqual('/engines');
expect(notFound.prop('backToContent')).toEqual('Back to Engines');
expect(notFound.prop('backToContent')).toEqual('Back to Search Applications');
const telemetry = wrapper.find(SendEnterpriseSearchTelemetry);
expect(telemetry.prop('action')).toEqual('error');

View file

@ -27,9 +27,12 @@ export const EngineError: React.FC<{ error?: HttpError; notFound?: boolean }> =
<>
<SendEnterpriseSearchTelemetry action="error" metric="not_found" />
<NotFoundPrompt
backToContent={i18n.translate('xpack.enterpriseSearch.engines.engine.notFound.action1', {
defaultMessage: 'Back to Engines',
})}
backToContent={i18n.translate(
'xpack.enterpriseSearch.searchApplications.engine.notFound.action1',
{
defaultMessage: 'Back to Search Applications',
}
)}
backToLink={ENGINES_PATH}
productSupportUrl={ENTERPRISE_SEARCH_CONTENT_PLUGIN.SUPPORT_URL}
/>

View file

@ -64,7 +64,7 @@ export const EngineIndices: React.FC = () => {
description: i18n.translate(
'xpack.enterpriseSearch.content.engine.indices.actions.removeIndex.title',
{
defaultMessage: 'Remove this index from engine',
defaultMessage: 'Remove this index from search application',
}
),
icon: 'minusInCircle',
@ -215,7 +215,7 @@ export const EngineIndices: React.FC = () => {
'xpack.enterpriseSearch.content.engine.indices.unknownIndicesCallout.description',
{
defaultMessage:
'Some data might be unreachable from this engine. Check for any pending operations or errors on affected indices, or remove those that should no longer be used by this engine.',
'Some data might be unreachable from this search application. Check for any pending operations or errors on affected indices, or remove those that should no longer be used by this search application.',
}
)}
</p>
@ -259,7 +259,7 @@ export const EngineIndices: React.FC = () => {
}}
title={i18n.translate(
'xpack.enterpriseSearch.content.engine.indices.removeIndexConfirm.title',
{ defaultMessage: 'Remove this index from the engine' }
{ defaultMessage: 'Remove this index from the Search Application' }
)}
buttonColor="danger"
cancelButtonText={CANCEL_BUTTON_LABEL}
@ -278,7 +278,7 @@ export const EngineIndices: React.FC = () => {
'xpack.enterpriseSearch.content.engine.indices.removeIndexConfirm.description',
{
defaultMessage:
"This won't delete the index. You may add it back to this engine at a later time.",
"This won't delete the index. You may add it back to this search application at a later time.",
}
)}
</p>

View file

@ -1,87 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import React, { useState } from 'react';
import { useValues, useActions } from 'kea';
import { EuiPopover, EuiButtonIcon, EuiText, EuiContextMenu, EuiIcon } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { TelemetryLogic } from '../../../shared/telemetry/telemetry_logic';
import { EngineViewLogic } from './engine_view_logic';
export const EngineViewHeaderActions: React.FC = () => {
const { engineData } = useValues(EngineViewLogic);
const { openDeleteEngineModal } = useActions(EngineViewLogic);
const { sendEnterpriseSearchTelemetry } = useActions(TelemetryLogic);
const [isActionsPopoverOpen, setIsActionsPopoverOpen] = useState(false);
const toggleActionsPopover = () => setIsActionsPopoverOpen((isPopoverOpen) => !isPopoverOpen);
const closePopover = () => setIsActionsPopoverOpen(false);
return (
<>
<EuiPopover
anchorPosition="downRight"
button={
<EuiButtonIcon
aria-label={i18n.translate(
'xpack.enterpriseSearch.content.engine.headerActions.actionsButton.ariaLabel',
{
defaultMessage: 'Engine actions menu button',
}
)}
onClick={toggleActionsPopover}
size="m"
iconSize="m"
iconType="boxesVertical"
/>
}
isOpen={isActionsPopoverOpen}
panelPaddingSize="xs"
closePopover={closePopover}
display="block"
>
<EuiContextMenu
size="s"
initialPanelId={0}
panels={[
{
id: 0,
items: [
{
icon: <EuiIcon type="trash" size="m" color="danger" />,
name: (
<EuiText color="danger">
{i18n.translate(
'xpack.enterpriseSearch.content.engine.headerActions.delete',
{ defaultMessage: 'Delete this engine' }
)}
</EuiText>
),
onClick: () => {
if (engineData) {
openDeleteEngineModal();
sendEnterpriseSearchTelemetry({
action: 'clicked',
metric: 'entSearchContent-engines-engineView-deleteEngine',
});
}
},
size: 's',
},
],
},
]}
/>
</EuiPopover>
</>
);
};

View file

@ -21,7 +21,7 @@ export const EngineHeaderDocsAction: React.FC = () => (
target="_blank"
iconType="documents"
>
Engine Docs
Search Application Docs
</EuiButtonEmpty>
</EuiFlexItem>
</EuiFlexGroup>

View file

@ -47,7 +47,7 @@ export const IndicesSelectComboBox = (props: IndicesSelectComboBoxProps) => {
}, [searchQuery]);
const options: Array<EuiComboBoxOptionOption<ElasticsearchIndexWithIngestion>> =
data?.indices?.map(indexToOption) ?? [];
data?.indices?.map((index) => indexToOption(index.name, index)) ?? [];
const renderOption = (option: EuiComboBoxOptionOption<ElasticsearchIndexWithIngestion>) => (
<EuiFlexGroup>
@ -84,8 +84,9 @@ export const IndicesSelectComboBox = (props: IndicesSelectComboBoxProps) => {
};
export const indexToOption = (
index: ElasticsearchIndexWithIngestion
indexName: string,
index?: ElasticsearchIndexWithIngestion
): IndicesSelectComboBoxOption => ({
label: index.name,
label: indexName,
value: index,
});

View file

@ -56,7 +56,7 @@ export const EnginesListTable: React.FC<EnginesListTableProps> = ({
{
field: 'name',
name: i18n.translate('xpack.enterpriseSearch.content.enginesList.table.column.name', {
defaultMessage: 'Engine Name',
defaultMessage: 'Search Application Name',
}),
mobileOptions: {
header: true,
@ -117,7 +117,7 @@ export const EnginesListTable: React.FC<EnginesListTableProps> = ({
description: i18n.translate(
'xpack.enterpriseSearch.content.enginesList.table.column.actions.view.buttonDescription',
{
defaultMessage: 'View this engine',
defaultMessage: 'View this search application',
}
),
type: 'icon',
@ -134,7 +134,7 @@ export const EnginesListTable: React.FC<EnginesListTableProps> = ({
description: i18n.translate(
'xpack.enterpriseSearch.content.enginesList.table.column.action.delete.buttonDescription',
{
defaultMessage: 'Delete this engine',
defaultMessage: 'Delete this search application',
}
),
type: 'icon',
@ -144,7 +144,7 @@ export const EnginesListTable: React.FC<EnginesListTableProps> = ({
i18n.translate(
'xpack.enterpriseSearch.content.engineList.table.column.actions.deleteEngineLabel',
{
defaultMessage: 'Delete this engine',
defaultMessage: 'Delete this search application',
}
),
onClick: (engine) => {

View file

@ -5,13 +5,13 @@
* 2.0.
*/
import React from 'react';
import React, { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import { useActions, useValues } from 'kea';
import {
EuiButton,
EuiButtonEmpty,
EuiFlexGroup,
EuiFlexItem,
EuiFieldText,
@ -26,6 +26,8 @@ import {
EuiTitle,
EuiComboBoxOptionOption,
EuiCallOut,
EuiButton,
EuiButtonEmpty,
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
@ -33,14 +35,14 @@ import { FormattedMessage } from '@kbn/i18n-react';
import { Status } from '../../../../../common/types/api';
import { ElasticsearchIndexWithIngestion } from '../../../../../common/types/indices';
import { isNotNullish } from '../../../../../common/utils/is_not_nullish';
import { CANCEL_BUTTON_LABEL } from '../../../shared/constants';
import { CANCEL_BUTTON_LABEL, ESINDEX_QUERY_PARAMETER } from '../../../shared/constants';
import { docLinks } from '../../../shared/doc_links';
import { getErrorsFromHttpResponse } from '../../../shared/flash_messages/handle_api_errors';
import { indexToOption, IndicesSelectComboBox } from './components/indices_select_combobox';
import { parseQueryParams } from '../../../shared/query_params';
import { indexToOption, IndicesSelectComboBox } from './components/indices_select_combobox';
import { CreateEngineLogic } from './create_engine_logic';
export interface CreateEngineFlyoutProps {
@ -60,11 +62,18 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
selectedIndices,
} = useValues(CreateEngineLogic);
const { search } = useLocation() as unknown as Location;
const { ...params } = parseQueryParams(search);
const indexName = params[ESINDEX_QUERY_PARAMETER];
const onIndicesChange = (
selectedOptions: Array<EuiComboBoxOptionOption<ElasticsearchIndexWithIngestion>>
) => {
setSelectedIndices(selectedOptions.map((option) => option.value).filter(isNotNullish));
setSelectedIndices(selectedOptions.map((option) => option.label));
};
useEffect(() => {
if (indexName && typeof indexName === 'string') setSelectedIndices([indexName]);
}, []);
return (
<EuiFlyout onClose={onClose} size="m">
@ -72,7 +81,7 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
<EuiTitle size="m">
<h3>
{i18n.translate('xpack.enterpriseSearch.content.engines.createEngine.headerTitle', {
defaultMessage: 'Create an engine',
defaultMessage: 'Create a Search Application',
})}
</h3>
</EuiTitle>
@ -81,7 +90,7 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
<p>
<FormattedMessage
id="xpack.enterpriseSearch.content.engines.createEngine.headerSubTitle"
defaultMessage="An engine allows your users to query data in your indices. Explore our {enginesDocsLink} to learn more!"
defaultMessage="A Search Application allows your users to query data in your indices. Explore our {enginesDocsLink} to learn more!"
values={{
enginesDocsLink: (
<EuiLink
@ -92,7 +101,7 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
>
{i18n.translate(
'xpack.enterpriseSearch.content.engines.createEngine.header.docsLink',
{ defaultMessage: 'Engines documentation' }
{ defaultMessage: 'Search Application documentation' }
)}
</EuiLink>
),
@ -107,7 +116,7 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
color="danger"
title={i18n.translate(
'xpack.enterpriseSearch.content.engines.createEngine.header.createError.title',
{ defaultMessage: 'Error creating engine' }
{ defaultMessage: 'Error creating search application' }
)}
>
{getErrorsFromHttpResponse(createEngineError).map((errMessage, i) => (
@ -126,7 +135,7 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
fullWidth
isDisabled={formDisabled}
onChange={onIndicesChange}
selectedOptions={selectedIndices.map(indexToOption)}
selectedOptions={selectedIndices.map((index: string) => indexToOption(index))}
/>
),
status: indicesStatus,
@ -142,7 +151,7 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
disabled={formDisabled}
placeholder={i18n.translate(
'xpack.enterpriseSearch.content.engines.createEngine.nameEngine.placeholder',
{ defaultMessage: 'Engine name' }
{ defaultMessage: 'Search Application name' }
)}
value={engineName}
onChange={(e) => setEngineName(e.target.value)}
@ -151,7 +160,7 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
status: engineNameStatus,
title: i18n.translate(
'xpack.enterpriseSearch.content.engines.createEngine.nameEngine.title',
{ defaultMessage: 'Name your engine' }
{ defaultMessage: 'Name your Search Application' }
),
},
]}
@ -171,7 +180,7 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
<EuiFlexItem />
<EuiFlexItem grow={false}>
<EuiButton
disabled={createDisabled || formDisabled}
isDisabled={createDisabled || formDisabled}
data-telemetry-id="entSearchContent-engines-createEngine-submit"
fill
iconType="plusInCircle"
@ -180,7 +189,7 @@ export const CreateEngineFlyout = ({ onClose }: CreateEngineFlyoutProps) => {
}}
>
{i18n.translate('xpack.enterpriseSearch.content.engines.createEngine.submit', {
defaultMessage: 'Create this engine',
defaultMessage: 'Create this Search Application',
})}
</EuiButton>
</EuiFlexItem>

View file

@ -8,10 +8,12 @@
import { LogicMounter } from '../../../__mocks__/kea_logic';
import { Status } from '../../../../../common/types/api';
import { ElasticsearchIndexWithIngestion } from '../../../../../common/types/indices';
import { KibanaLogic } from '../../../shared/kibana';
import { CreateEngineApiLogic } from '../../api/engines/create_engine_api_logic';
import { ENGINES_PATH } from '../../routes';
import { CreateEngineLogic, CreateEngineLogicValues } from './create_engine_logic';
const DEFAULT_VALUES: CreateEngineLogicValues = {
@ -27,7 +29,7 @@ const DEFAULT_VALUES: CreateEngineLogicValues = {
const VALID_ENGINE_NAME = 'unit-test-001';
const INVALID_ENGINE_NAME = 'TEST';
const VALID_INDICES_DATA = [{ name: 'search-index-01' }] as ElasticsearchIndexWithIngestion[];
const VALID_INDICES_DATA = ['search-index-01'];
describe('CreateEngineLogic', () => {
const { mount: apiLogicMount } = new LogicMounter(CreateEngineApiLogic);
@ -59,16 +61,17 @@ describe('CreateEngineLogic', () => {
indices: ['search-index-01'],
});
});
it('engineCreated is handled', () => {
it('engineCreated is handled and is navigated to Search application list page', () => {
jest.spyOn(CreateEngineLogic.actions, 'fetchEngines');
jest.spyOn(CreateEngineLogic.actions, 'closeEngineCreate');
jest
.spyOn(KibanaLogic.values, 'navigateToUrl')
.mockImplementationOnce(() => Promise.resolve());
CreateEngineApiLogic.actions.apiSuccess({
result: 'created',
});
expect(KibanaLogic.values.navigateToUrl).toHaveBeenCalledWith(ENGINES_PATH);
expect(CreateEngineLogic.actions.fetchEngines).toHaveBeenCalledTimes(1);
expect(CreateEngineLogic.actions.closeEngineCreate).toHaveBeenCalledTimes(1);
});
});
describe('selectors', () => {
@ -114,7 +117,7 @@ describe('CreateEngineLogic', () => {
it('returns true while create request in progress', () => {
CreateEngineApiLogic.actions.makeRequest({
engineName: VALID_ENGINE_NAME,
indices: [VALID_INDICES_DATA[0].name],
indices: [VALID_INDICES_DATA[0]],
});
expect(CreateEngineLogic.values.formDisabled).toEqual(true);

View file

@ -8,27 +8,27 @@
import { kea, MakeLogicType } from 'kea';
import { Status } from '../../../../../common/types/api';
import { ElasticsearchIndexWithIngestion } from '../../../../../common/types/indices';
import { KibanaLogic } from '../../../shared/kibana';
import {
CreateEngineApiLogic,
CreateEngineApiLogicActions,
} from '../../api/engines/create_engine_api_logic';
import { ENGINES_PATH } from '../../routes';
import { EnginesListLogic } from './engines_list_logic';
const NAME_VALIDATION = new RegExp(/^[a-z0-9\-]+$/);
export interface CreateEngineLogicActions {
closeEngineCreate: () => void;
createEngine: () => void;
createEngineRequest: CreateEngineApiLogicActions['makeRequest'];
engineCreateError: CreateEngineApiLogicActions['apiError'];
engineCreated: CreateEngineApiLogicActions['apiSuccess'];
fetchEngines: () => void;
setEngineName: (engineName: string) => { engineName: string };
setSelectedIndices: (indices: ElasticsearchIndexWithIngestion[]) => {
indices: ElasticsearchIndexWithIngestion[];
setSelectedIndices: (indices: string[]) => {
indices: string[];
};
}
@ -40,7 +40,7 @@ export interface CreateEngineLogicValues {
engineNameStatus: 'complete' | 'incomplete' | 'warning';
formDisabled: boolean;
indicesStatus: 'complete' | 'incomplete';
selectedIndices: ElasticsearchIndexWithIngestion[];
selectedIndices: string[];
}
export const CreateEngineLogic = kea<
@ -49,12 +49,12 @@ export const CreateEngineLogic = kea<
actions: {
createEngine: true,
setEngineName: (engineName: string) => ({ engineName }),
setSelectedIndices: (indices: ElasticsearchIndexWithIngestion[]) => ({ indices }),
setSelectedIndices: (indices: string[]) => ({ indices }),
},
connect: {
actions: [
EnginesListLogic,
['closeEngineCreate', 'fetchEngines'],
['fetchEngines'],
CreateEngineApiLogic,
[
'makeRequest as createEngineRequest',
@ -68,12 +68,12 @@ export const CreateEngineLogic = kea<
createEngine: () => {
actions.createEngineRequest({
engineName: values.engineName,
indices: values.selectedIndices.map((index) => index.name),
indices: values.selectedIndices,
});
},
engineCreated: () => {
actions.fetchEngines();
actions.closeEngineCreate();
KibanaLogic.values.navigateToUrl(ENGINES_PATH);
},
}),
path: ['enterprise_search', 'content', 'create_engine_logic'],

View file

@ -28,7 +28,7 @@ export const DeleteEngineModal: React.FC<DeleteEngineModalProps> = ({ engineName
return (
<EuiConfirmModal
title={i18n.translate('xpack.enterpriseSearch.content.engineList.deleteEngineModal.title', {
defaultMessage: 'Permanently delete this engine?',
defaultMessage: 'Permanently delete this search application?',
})}
onCancel={onClose}
onConfirm={() => {
@ -42,7 +42,7 @@ export const DeleteEngineModal: React.FC<DeleteEngineModalProps> = ({ engineName
confirmButtonText={i18n.translate(
'xpack.enterpriseSearch.content.engineList.deleteEngineModal.confirmButton.title',
{
defaultMessage: 'Yes, delete this engine ',
defaultMessage: 'Yes, delete this search application',
}
)}
buttonColor="danger"
@ -53,7 +53,7 @@ export const DeleteEngineModal: React.FC<DeleteEngineModalProps> = ({ engineName
'xpack.enterpriseSearch.content.engineList.deleteEngineModal.delete.description',
{
defaultMessage:
'Deleting your engine is not a reversible action. Your indices will not be affected. ',
'Deleting your search application is not a reversible action. Your indices will not be affected. ',
}
)}
</p>

View file

@ -31,6 +31,7 @@ import { docLinks } from '../../../shared/doc_links';
import { KibanaLogic } from '../../../shared/kibana';
import { LicensingLogic } from '../../../shared/licensing';
import { EXPLORE_PLATINUM_FEATURES_LINK } from '../../../workplace_search/constants';
import { ENGINES_PATH, ENGINE_CREATION_PATH } from '../../routes';
import { EnterpriseSearchEnginesPageTemplate } from '../layout/engines_page_template';
import { LicensingCallout, LICENSING_FEATURE } from '../shared/licensing_callout/licensing_callout';
@ -43,9 +44,12 @@ import { EngineListIndicesFlyout } from './engines_list_flyout';
import { EnginesListFlyoutLogic } from './engines_list_flyout_logic';
import { EnginesListLogic } from './engines_list_logic';
export const CreateEngineButton: React.FC<{ disabled: boolean }> = ({ disabled }) => {
interface CreateEngineButtonProps {
disabled: boolean;
}
export const CreateEngineButton: React.FC<CreateEngineButtonProps> = ({ disabled }) => {
const [showPopover, setShowPopover] = useState<boolean>(false);
const { openEngineCreate } = useActions(EnginesListLogic);
return (
<EuiPopover
isOpen={disabled && showPopover}
@ -62,19 +66,22 @@ export const CreateEngineButton: React.FC<{ disabled: boolean }> = ({ disabled }
iconType="plusInCircle"
data-test-subj="enterprise-search-content-engines-creation-button"
data-telemetry-id="entSearchContent-engines-list-createEngine"
disabled={disabled}
onClick={openEngineCreate}
isDisabled={disabled}
onClick={() => KibanaLogic.values.navigateToUrl(ENGINE_CREATION_PATH)}
>
{i18n.translate('xpack.enterpriseSearch.content.engines.createEngineButtonLabel', {
defaultMessage: 'Create Search Application',
})}
{i18n.translate(
'xpack.enterpriseSearch.content.searchApplications.createEngineButtonLabel',
{
defaultMessage: 'Create Search Application',
}
)}
</EuiButton>
</div>
}
>
<EuiPopoverTitle>
<FormattedMessage
id="xpack.enterpriseSearch.content.engines.createEngineDisabledPopover.title"
id="xpack.enterpriseSearch.content.searchApplications.createEngineDisabledPopover.title"
defaultMessage="Platinum only feature"
/>
</EuiPopoverTitle>
@ -82,7 +89,7 @@ export const CreateEngineButton: React.FC<{ disabled: boolean }> = ({ disabled }
<EuiFlexGroup direction="column" gutterSize="m">
<EuiText size="s">
<FormattedMessage
id="xpack.enterpriseSearch.content.engines.createEngineDisabledPopover.body"
id="xpack.enterpriseSearch.content.searchApplications.createEngineDisabledPopover.body"
defaultMessage="Search Applications require a Platinum license or higher and are not available to Standard license self-managed deployments."
/>
</EuiText>
@ -94,27 +101,27 @@ export const CreateEngineButton: React.FC<{ disabled: boolean }> = ({ disabled }
</EuiPopover>
);
};
interface ListProps {
createEngineFlyoutOpen?: boolean;
}
export const EnginesList: React.FC = () => {
export const EnginesList: React.FC<ListProps> = ({ createEngineFlyoutOpen }) => {
const {
closeDeleteEngineModal,
closeEngineCreate,
fetchEngines,
onPaginate,
openDeleteEngineModal,
setSearchQuery,
setIsFirstRequest,
} = useActions(EnginesListLogic);
const { openFetchEngineFlyout } = useActions(EnginesListFlyoutLogic);
const { isCloud } = useValues(KibanaLogic);
const { isCloud, navigateToUrl } = useValues(KibanaLogic);
const { hasPlatinumLicense } = useValues(LicensingLogic);
const isGated = !isCloud && !hasPlatinumLicense;
const {
createEngineFlyoutOpen,
deleteModalEngineName,
hasNoEngines,
isDeleteModalVisible,
@ -127,7 +134,7 @@ export const EnginesList: React.FC = () => {
const throttledSearchQuery = useThrottle(searchQuery, INPUT_THROTTLE_DELAY_MS);
useEffect(() => {
// Don't fetch engines if we don't have a valid license
// Don't fetch search applications if we don't have a valid license
if (!isGated) {
fetchEngines();
}
@ -148,18 +155,18 @@ export const EnginesList: React.FC = () => {
) : null}
<EngineListIndicesFlyout />
{createEngineFlyoutOpen && <CreateEngineFlyout onClose={closeEngineCreate} />}
{createEngineFlyoutOpen && <CreateEngineFlyout onClose={() => navigateToUrl(ENGINES_PATH)} />}
<EnterpriseSearchEnginesPageTemplate
pageChrome={[
i18n.translate('xpack.enterpriseSearch.content.engines.breadcrumb', {
i18n.translate('xpack.enterpriseSearch.content.searchApplications.breadcrumb', {
defaultMessage: 'Search Applications',
}),
]}
pageHeader={{
description: (
<FormattedMessage
id="xpack.enterpriseSearch.content.engines.description"
defaultMessage="Search Applications allow you to query indexed data with a complete set of relevance, analytics and personalization tools. To learn more about how engines work in Enterprise search {documentationUrl}"
id="xpack.enterpriseSearch.content.searchApplications.description"
defaultMessage="Search Applications allow you to query indexed data with a complete set of relevance, analytics and personalization tools. To learn more about how Search applications work in Enterprise search {documentationUrl}"
values={{
documentationUrl: (
<EuiLink
@ -168,15 +175,18 @@ export const EnginesList: React.FC = () => {
target="_blank"
data-telemetry-id="entSearchContent-engines-documentation-viewDocumentaion"
>
{i18n.translate('xpack.enterpriseSearch.content.engines.documentation', {
defaultMessage: 'explore our Search Applications documentation',
})}
{i18n.translate(
'xpack.enterpriseSearch.content.searchApplications.documentation',
{
defaultMessage: 'explore our Search Applications documentation',
}
)}
</EuiLink>
),
}}
/>
),
pageTitle: i18n.translate('xpack.enterpriseSearch.content.engines.title', {
pageTitle: i18n.translate('xpack.enterpriseSearch.content.searchApplications.title', {
defaultMessage: 'Search Applications',
}),
rightSideItems: isLoading
@ -185,7 +195,7 @@ export const EnginesList: React.FC = () => {
? [<CreateEngineButton disabled={isGated} />]
: [],
}}
pageViewTelemetry="Engines"
pageViewTelemetry="Search Applications"
isLoading={isLoading && !isGated}
>
{isGated && (
@ -200,15 +210,15 @@ export const EnginesList: React.FC = () => {
<EuiFieldSearch
value={searchQuery}
placeholder={i18n.translate(
'xpack.enterpriseSearch.content.engines.searchPlaceholder',
'xpack.enterpriseSearch.content.searchApplications.searchPlaceholder',
{
defaultMessage: 'Search engines',
defaultMessage: 'Search Applications',
}
)}
aria-label={i18n.translate(
'xpack.enterpriseSearch.content.engines.searchBar.ariaLabel',
'xpack.enterpriseSearch.content.searchApplications.searchBar.ariaLabel',
{
defaultMessage: 'Search engines',
defaultMessage: 'Search Applications',
}
)}
fullWidth
@ -220,9 +230,10 @@ export const EnginesList: React.FC = () => {
<EuiSpacer size="s" />
<EuiText color="subdued" size="s">
{i18n.translate(
'xpack.enterpriseSearch.content.engines.searchPlaceholder.description',
'xpack.enterpriseSearch.content.searchApplications.searchPlaceholder.description',
{
defaultMessage: 'Locate an engine via name or by its included indices.',
defaultMessage:
'Locate a search application via name or by its included indices.',
}
)}
</EuiText>
@ -230,7 +241,7 @@ export const EnginesList: React.FC = () => {
<EuiSpacer />
<EuiText size="s">
<FormattedMessage
id="xpack.enterpriseSearch.content.engines.enginesList.description"
id="xpack.enterpriseSearch.content.searchApplications.enginesList.description"
defaultMessage="Showing {from}-{to} of {total}"
values={{
from: (

View file

@ -18,7 +18,6 @@ import { EnginesListLogic } from './engines_list_logic';
import { DEFAULT_META } from './types';
const DEFAULT_VALUES = {
createEngineFlyoutOpen: false,
data: undefined,
deleteModalEngine: null,
deleteModalEngineName: '',
@ -156,24 +155,7 @@ describe('EnginesListLogic', () => {
});
});
});
describe('openEngineCreate', () => {
it('set createEngineFlyoutOpen to true', () => {
EnginesListLogic.actions.openEngineCreate();
expect(EnginesListLogic.values).toEqual({
...DEFAULT_VALUES,
createEngineFlyoutOpen: true,
});
});
});
describe('closeEngineCreate', () => {
it('set createEngineFlyoutOpen to false', () => {
EnginesListLogic.actions.closeEngineCreate();
expect(EnginesListLogic.values).toEqual({
...DEFAULT_VALUES,
createEngineFlyoutOpen: false,
});
});
});
describe('setSearchQuery', () => {
it('set setSearchQuery to search value', () => {
EnginesListLogic.actions.setSearchQuery('my-search-query');

View file

@ -39,7 +39,7 @@ export type EnginesListActions = Pick<
'apiError' | 'apiSuccess' | 'makeRequest'
> & {
closeDeleteEngineModal(): void;
closeEngineCreate(): void;
deleteEngine: DeleteEnginesApiLogicActions['makeRequest'];
deleteError: DeleteEnginesApiLogicActions['apiError'];
deleteSuccess: DeleteEnginesApiLogicActions['apiSuccess'];
@ -50,13 +50,11 @@ export type EnginesListActions = Pick<
openDeleteEngineModal: (engine: EnterpriseSearchEngine | EnterpriseSearchEngineDetails) => {
engine: EnterpriseSearchEngine;
};
openEngineCreate(): void;
setIsFirstRequest(): void;
setSearchQuery(searchQuery: string): { searchQuery: string };
};
interface EngineListValues {
createEngineFlyoutOpen: boolean;
data: typeof FetchEnginesAPILogic.values.data;
deleteModalEngine: EnterpriseSearchEngine | null;
deleteModalEngineName: string;
@ -76,11 +74,9 @@ interface EngineListValues {
export const EnginesListLogic = kea<MakeLogicType<EngineListValues, EnginesListActions>>({
actions: {
closeDeleteEngineModal: true,
closeEngineCreate: true,
fetchEngines: true,
onPaginate: (args: EuiBasicTableOnChange) => ({ pageNumber: args.page.index }),
openDeleteEngineModal: (engine) => ({ engine }),
openEngineCreate: true,
setIsFirstRequest: true,
setSearchQuery: (searchQuery: string) => ({ searchQuery }),
},
@ -111,13 +107,6 @@ export const EnginesListLogic = kea<MakeLogicType<EngineListValues, EnginesListA
path: ['enterprise_search', 'content', 'engine_list_logic'],
reducers: ({}) => ({
createEngineFlyoutOpen: [
false,
{
closeEngineCreate: () => false,
openEngineCreate: () => true,
},
],
deleteModalEngine: [
null,
{

View file

@ -10,7 +10,7 @@ import { Switch } from 'react-router-dom';
import { Route } from '@kbn/shared-ux-router';
import { ENGINES_PATH, ENGINE_PATH } from '../../routes';
import { ENGINES_PATH, ENGINE_CREATION_PATH, ENGINE_PATH } from '../../routes';
import { EngineRouter } from '../engine/engine_router';
import { NotFound } from '../not_found';
@ -23,6 +23,9 @@ export const EnginesRouter: React.FC = () => {
<Route exact path={ENGINES_PATH}>
<EnginesList />
</Route>
<Route path={ENGINE_CREATION_PATH}>
<EnginesList createEngineFlyoutOpen />
</Route>
<Route path={ENGINE_PATH}>
<EngineRouter />
</Route>

View file

@ -5,37 +5,9 @@
* 2.0.
*/
import React from 'react';
import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { APP_SEARCH_URL } from '../../../../../common/constants';
import { flashSuccessToast } from '../../../shared/flash_messages';
import { EuiButtonTo } from '../../../shared/react_router_helpers';
const SuccessToast = (
<>
<EuiText size="s">
{i18n.translate('xpack.enterpriseSearch.content.new_index.successToast.description', {
defaultMessage:
'You can use App Search engines to build a search experience for your new Elasticsearch index.',
})}
</EuiText>
<EuiSpacer size="s" />
<EuiFlexGroup justifyContent="flexEnd" gutterSize="xs">
<EuiFlexItem grow={false}>
<EuiButtonTo to={`${APP_SEARCH_URL}/engines`} shouldNotCreateHref color="success">
{i18n.translate('xpack.enterpriseSearch.content.new_index.successToast.button.label', {
defaultMessage: 'Create an engine',
})}
</EuiButtonTo>
</EuiFlexItem>
</EuiFlexGroup>
</>
);
export function flashIndexCreatedToast(): void {
flashSuccessToast(
@ -44,7 +16,6 @@ export function flashIndexCreatedToast(): void {
}),
{
iconType: 'cheer',
text: SuccessToast,
}
);
}

View file

@ -11,11 +11,11 @@ import { EuiContextMenuItem, EuiText, EuiFlexGroup, EuiFlexItem } from '@elastic
import { i18n } from '@kbn/i18n';
import { APP_SEARCH_PLUGIN } from '../../../../../../../common/constants';
import { ENGINE_CREATION_PATH } from '../../../../../app_search/routes';
import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../../../../common/constants';
import { ESINDEX_QUERY_PARAMETER } from '../../../../../shared/constants';
import { generateEncodedPath } from '../../../../../shared/encode_path_params';
import { KibanaLogic } from '../../../../../shared/kibana';
import { ENGINE_CREATION_PATH } from '../../../../routes';
export interface CreateEngineMenuItemProps {
indexName?: string;
@ -28,12 +28,15 @@ export const CreateEngineMenuItem: React.FC<CreateEngineMenuItemProps> = ({
ingestionMethod,
isHiddenIndex,
}) => {
const engineCreationPath = !indexName
? `${APP_SEARCH_PLUGIN.URL}${ENGINE_CREATION_PATH}`
: generateEncodedPath(`${APP_SEARCH_PLUGIN.URL}${ENGINE_CREATION_PATH}?:indexKey=:indexName`, {
indexKey: ESINDEX_QUERY_PARAMETER,
indexName,
});
const searchApplicationCreationPath = !indexName
? `${ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL}${ENGINE_CREATION_PATH}`
: generateEncodedPath(
`${ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL}${ENGINE_CREATION_PATH}?:indexKey=:indexName`,
{
indexKey: ESINDEX_QUERY_PARAMETER,
indexName,
}
);
return (
<EuiFlexGroup alignItems="center" gutterSize="xs">
@ -43,7 +46,7 @@ export const CreateEngineMenuItem: React.FC<CreateEngineMenuItemProps> = ({
size="s"
icon="plusInCircle"
onClick={() => {
KibanaLogic.values.navigateToUrl(engineCreationPath, {
KibanaLogic.values.navigateToUrl(searchApplicationCreationPath, {
shouldNotCreateHref: true,
});
}}
@ -51,9 +54,12 @@ export const CreateEngineMenuItem: React.FC<CreateEngineMenuItemProps> = ({
>
<EuiText>
<p>
{i18n.translate('xpack.enterpriseSearch.content.index.searchEngines.createEngine', {
defaultMessage: 'Create an App Search engine',
})}
{i18n.translate(
'xpack.enterpriseSearch.content.index.searchApplication.createSearchApplication',
{
defaultMessage: 'Create a Search Application',
}
)}
</p>
</EuiText>
</EuiContextMenuItem>

View file

@ -20,9 +20,11 @@ import {
import { i18n } from '@kbn/i18n';
import { APP_SEARCH_PLUGIN } from '../../../../../../../common/constants';
import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../../../../common/constants';
import { KibanaLogic } from '../../../../../shared/kibana';
import { ENGINES_PATH } from '../../../../routes';
import { CreateEngineMenuItem } from './create_engine_menu_item';
import { SearchEnginesPopoverLogic } from './search_engines_popover_logic';
@ -52,7 +54,7 @@ export const SearchEnginesPopover: React.FC<SearchEnginesPopoverProps> = ({
onClick={toggleSearchEnginesPopover}
>
{i18n.translate('xpack.enterpriseSearch.content.index.searchEngines.label', {
defaultMessage: 'Search engines',
defaultMessage: 'Search Applications',
})}
</EuiButton>
}
@ -64,15 +66,18 @@ export const SearchEnginesPopover: React.FC<SearchEnginesPopoverProps> = ({
data-telemetry-id={`entSearchContent-${ingestionMethod}-header-searchEngines-viewEngines`}
icon="eye"
onClick={() => {
KibanaLogic.values.navigateToUrl(APP_SEARCH_PLUGIN.URL, {
shouldNotCreateHref: true,
});
KibanaLogic.values.navigateToUrl(
ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL + ENGINES_PATH,
{
shouldNotCreateHref: true,
}
);
}}
>
<EuiText>
<p>
{i18n.translate('xpack.enterpriseSearch.content.index.searchEngines.viewEngines', {
defaultMessage: 'View App Search engines',
defaultMessage: 'View Search Applications',
})}
</p>
</EuiText>
@ -82,7 +87,7 @@ export const SearchEnginesPopover: React.FC<SearchEnginesPopoverProps> = ({
content={i18n.translate(
'xpack.enterpriseSearch.content.index.searchEngines.createEngineDisabledTooltip',
{
defaultMessage: 'You cannot create engines from hidden indices.',
defaultMessage: 'You cannot create search applications from hidden indices.',
}
)}
>

View file

@ -80,7 +80,7 @@ export const DeleteIndexModal: React.FC = () => {
'xpack.enterpriseSearch.content.searchIndices.deleteModal.delete.description',
{
defaultMessage:
'Deleting this index will also delete all of its data and its {ingestionMethod} configuration. Any associated search engines will no longer be able to access any data stored in this index.',
'Deleting this index will also delete all of its data and its {ingestionMethod} configuration. Any associated search applications will no longer be able to access any data stored in this index.',
values: {
ingestionMethod: ingestionMethodToText(ingestionMethod),
},

View file

@ -11131,8 +11131,6 @@
"xpack.enterpriseSearch.content.engine.indices.actions.viewIndex.caption": "Afficher l'index {indexName}",
"xpack.enterpriseSearch.content.engineList.deleteEngine.successToast.title": "{engineName} a été supprimé",
"xpack.enterpriseSearch.content.engines.createEngine.headerSubTitle": "Un moteur permet à vos utilisateurs d'interroger les données de vos index. Pour en savoir plus, explorez notre {enginesDocsLink} !",
"xpack.enterpriseSearch.content.engines.description": "Les moteurs vous permettent d'interroger les données indexées avec un ensemble complet d'outils de pertinence, d'analyse et de personnalisation. Pour en savoir plus sur le fonctionnement des moteurs dans Enterprise Search, {documentationUrl}",
"xpack.enterpriseSearch.content.engines.enginesList.description": "Affichage de {from}-{to} sur {total}",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.subTitle": "Afficher les index associés à {engineName}",
"xpack.enterpriseSearch.content.enginesList.table.column.view.indices": "{indicesCount, number} {indicesCount, plural, other {index}}",
"xpack.enterpriseSearch.content.index.connector.syncRules.description": "Ajoutez une règle de synchronisation pour personnaliser les données qui sont synchronisées à partir de {indexName}. Tout est inclus par défaut, et les documents sont validés par rapport à l'ensemble des règles d'indexation configurées, en commençant par le haut de la liste.",
@ -12225,22 +12223,9 @@
"xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.done": "Terminé",
"xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.generateButton": "Générer une clé en lecture seule",
"xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.title": "Créer une clé d'API en lecture seule pour le moteur",
"xpack.enterpriseSearch.content.engine.api.step1.apiKeyWarning": "Elastic ne stocke pas les clés dAPI. Une fois la clé générée, vous ne pourrez la visualiser qu'une seule fois. Veillez à l'enregistrer dans un endroit sûr. Si vous n'y avez plus accès, vous devrez générer une nouvelle clé dAPI à partir de cet écran.",
"xpack.enterpriseSearch.content.engine.api.step1.createAPIKeyButton": "Créer une clé d'API",
"xpack.enterpriseSearch.content.engine.api.step1.learnMoreLink": "Découvrez plus d'informations sur les clés d'API.",
"xpack.enterpriseSearch.content.engine.api.step1.title": "Générer et enregistrer la clé d'API",
"xpack.enterpriseSearch.content.engine.api.step1.viewKeysButton": "Afficher les clés",
"xpack.enterpriseSearch.content.engine.api.step2.copyEndpointDescription": "Utilisez cette URL pour accéder aux points de terminaison d'API de votre moteur.",
"xpack.enterpriseSearch.content.engine.api.step2.title": "Copier le point de terminaison de votre moteur",
"xpack.enterpriseSearch.content.engine.api.step3.curlTitle": "cURL",
"xpack.enterpriseSearch.content.engine.api.step3.intro": "Découvrez comment effectuer l'intégration avec votre moteur à l'aide des clients de langage gérés par Elastic pour vous aider à créer votre expérience de recherche.",
"xpack.enterpriseSearch.content.engine.api.step3.searchUITitle": "Search UI",
"xpack.enterpriseSearch.content.engine.api.step3.title": "Découvrir comment appeler vos points de terminaison",
"xpack.enterpriseSearch.content.engine.api.step4.copy": "Votre moteur fournit des données d'analyse de base dans le cadre de cette installation. Pour recevoir des indicateurs plus granulaires et personnalisés, intégrez notre script Behavioral Analytics dans votre plateforme.",
"xpack.enterpriseSearch.content.engine.api.step4.learnHowLink": "Découvrez comment faire",
"xpack.enterpriseSearch.content.engine.api.step4.title": "(Facultatif) Booster vos analyses",
"xpack.enterpriseSearch.content.engine.headerActions.actionsButton.ariaLabel": "Bouton de menu d'actions du moteur",
"xpack.enterpriseSearch.content.engine.headerActions.delete": "Supprimer ce moteur",
"xpack.enterpriseSearch.content.engine.indices.actions.columnTitle": "Actions",
"xpack.enterpriseSearch.content.engine.indices.actions.removeIndex.title": "Retirer cet index du moteur",
"xpack.enterpriseSearch.content.engine.indices.actions.viewIndex.title": "Afficher cet index",
@ -12265,7 +12250,6 @@
"xpack.enterpriseSearch.content.engineList.deleteEngineModal.delete.description": "La suppression de votre moteur ne pourra pas être annulée. Vos index ne seront pas affectés. ",
"xpack.enterpriseSearch.content.engineList.deleteEngineModal.title": "Supprimer définitivement ce moteur ?",
"xpack.enterpriseSearch.content.engineList.table.column.actions.deleteEngineLabel": "Supprimer ce moteur",
"xpack.enterpriseSearch.content.engines.breadcrumb": "Moteurs",
"xpack.enterpriseSearch.content.engines.createEngine.header.createError.title": "Erreur lors de la création du moteur",
"xpack.enterpriseSearch.content.engines.createEngine.header.docsLink": "Documentation sur les moteurs",
"xpack.enterpriseSearch.content.engines.createEngine.headerTitle": "Créer un moteur",
@ -12273,15 +12257,9 @@
"xpack.enterpriseSearch.content.engines.createEngine.nameEngine.title": "Nommer votre moteur",
"xpack.enterpriseSearch.content.engines.createEngine.selectIndices.title": "Sélectionner les index",
"xpack.enterpriseSearch.content.engines.createEngine.submit": "Créer ce moteur",
"xpack.enterpriseSearch.content.engines.createEngineButtonLabel": "Créer un moteur",
"xpack.enterpriseSearch.content.engines.documentation": "explorer notre documentation sur les moteurs",
"xpack.enterpriseSearch.content.engines.enginesList.empty.description": "Lançons-nous dans la création de votre premier moteur.",
"xpack.enterpriseSearch.content.engines.enginesList.empty.title": "Créer votre premier moteur",
"xpack.enterpriseSearch.content.engines.indices.addIndicesFlyout.updateError.title": "Erreur lors de la mise à jour du moteur",
"xpack.enterpriseSearch.content.engines.searchBar.ariaLabel": "Moteurs de recherche",
"xpack.enterpriseSearch.content.engines.searchPlaceholder": "Moteurs de recherche",
"xpack.enterpriseSearch.content.engines.searchPlaceholder.description": "Localisez un moteur en fonction de son nom ou de ses index inclus.",
"xpack.enterpriseSearch.content.engines.title": "Moteurs",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.table.docsCount.columnTitle": "Nombre de documents",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.table.health.columnTitle": "Intégrité des index",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.table.name.columnTitle": "Nom de l'index",
@ -12338,7 +12316,6 @@
"xpack.enterpriseSearch.content.index.pipelines.settings.reduceWhitespaceDescription": "Supprimer automatiquement l'espace supplémentaire de vos documents",
"xpack.enterpriseSearch.content.index.pipelines.settings.reduceWhitespaceLabel": "Réduire l'espace",
"xpack.enterpriseSearch.content.index.pipelines.settings.runMlInferenceDescrition": "Améliorer vos données à l'aide de modèles de ML entraînés compatibles",
"xpack.enterpriseSearch.content.index.searchEngines.createEngine": "Créer un moteur App Search",
"xpack.enterpriseSearch.content.index.searchEngines.createEngineDisabledTooltip": "Vous ne pouvez pas créer de moteurs à partir d'index masqués.",
"xpack.enterpriseSearch.content.index.searchEngines.label": "Moteurs de recherche",
"xpack.enterpriseSearch.content.index.searchEngines.viewEngines": "Afficher les moteurs App Search",
@ -12617,8 +12594,6 @@
"xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB",
"xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL",
"xpack.enterpriseSearch.content.navTitle": "Contenu",
"xpack.enterpriseSearch.content.new_index.successToast.button.label": "Créer un moteur",
"xpack.enterpriseSearch.content.new_index.successToast.description": "Vous pouvez utiliser des moteurs App Search pour créer une expérience de recherche pour votre nouvel index Elasticsearch.",
"xpack.enterpriseSearch.content.new_index.successToast.title": "Index créé avec succès",
"xpack.enterpriseSearch.content.newIndex.breadcrumb": "Nouvel index de recherche",
"xpack.enterpriseSearch.content.newIndex.emptyState.description": "Les données que vous ajoutez dans Enterprise Search sont appelées \"index de recherche\", et vous pouvez effectuer des recherches à l'intérieur à la fois dans App Search et dans Workplace Search. Maintenant, vous pouvez utiliser vos connecteurs dans App Search et vos robots d'indexation dans Workplace Search.",
@ -13039,8 +13014,6 @@
"xpack.enterpriseSearch.emailLabel": "E-mail",
"xpack.enterpriseSearch.emptyState.description": "Votre contenu est stocké dans un index Elasticsearch. Commencez par créer un index Elasticsearch et sélectionnez une méthode d'ingestion. Les options comprennent le robot d'indexation Elastic, les intégrations de données tierces ou l'utilisation des points de terminaison d'API Elasticsearch.",
"xpack.enterpriseSearch.emptyState.description.line2": "Quil sagisse de créer une expérience de recherche avec App Search ou Elasticsearch, vous pouvez commencer ici.",
"xpack.enterpriseSearch.engines.engine.notFound.action1": "Retour aux moteurs",
"xpack.enterpriseSearch.engines.navTitle": "Moteurs",
"xpack.enterpriseSearch.enterpriseSearch.setupGuide.description": "Effectuez des recherches sur tout, partout. Offrez à vos équipes débordées une expérience de recherche innovante et puissante facilement mise en œuvre. Intégrez rapidement une fonction de recherche préréglée à votre site web, à votre application ou à votre lieu de travail. Effectuez des recherches simples sur tout.",
"xpack.enterpriseSearch.enterpriseSearch.setupGuide.notConfigured": "Enterprise Search n'est pas encore configuré dans votre instance Kibana.",
"xpack.enterpriseSearch.enterpriseSearch.setupGuide.videoAlt": "Premiers pas avec Enterprise Search",

View file

@ -11130,8 +11130,6 @@
"xpack.enterpriseSearch.content.engine.indices.actions.viewIndex.caption": "インデックス{indexName}を表示",
"xpack.enterpriseSearch.content.engineList.deleteEngine.successToast.title": "{engineName}が削除されました。",
"xpack.enterpriseSearch.content.engines.createEngine.headerSubTitle": "エンジンは、ユーザーがインデックス内のデータを照会することを可能にします。詳細については、{enginesDocsLink}を探索してください。",
"xpack.enterpriseSearch.content.engines.description": "エンジンは、関連性、分析、パーソナライゼーションツールの完全なセットで、インデックスされたデータを照会することを可能にします。エンタープライズサーチにおけるエンジンの仕組みについて詳しく知るには{documentationUrl}",
"xpack.enterpriseSearch.content.engines.enginesList.description": "{total}件中{from}-{to}件を表示中",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.subTitle": "{engineName}に関連付けられたインデックスを表示",
"xpack.enterpriseSearch.content.enginesList.table.column.view.indices": "{indicesCount, number} {indicesCount, plural, other {インデックス}}",
"xpack.enterpriseSearch.content.index.connector.syncRules.description": "同期ルールを追加して、{indexName}から同期されるデータをカスタマイズします。デフォルトではすべてが含まれます。ドキュメントは、リストの最上位から下に向かって、構成されたインデックスルールのセットに対して検証されます。",
@ -12224,22 +12222,9 @@
"xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.done": "完了",
"xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.generateButton": "読み取り専用キーを生成",
"xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.title": "エンジン読み取り専用APIキーを作成",
"xpack.enterpriseSearch.content.engine.api.step1.apiKeyWarning": "ElasticはAPIキーを保存しません。生成後は、1回だけキーを表示できます。必ず安全に保管してください。アクセスできなくなった場合は、この画面から新しいAPIキーを生成する必要があります。",
"xpack.enterpriseSearch.content.engine.api.step1.createAPIKeyButton": "APIキーを作成",
"xpack.enterpriseSearch.content.engine.api.step1.learnMoreLink": "APIキーの詳細をご覧ください。",
"xpack.enterpriseSearch.content.engine.api.step1.title": "APIキーを生成して保存",
"xpack.enterpriseSearch.content.engine.api.step1.viewKeysButton": "キーを表示",
"xpack.enterpriseSearch.content.engine.api.step2.copyEndpointDescription": "このURLを使用して、エンジンのAPIエンドポイントにアクセスします。",
"xpack.enterpriseSearch.content.engine.api.step2.title": "エンジンのエンドポイントをコピー",
"xpack.enterpriseSearch.content.engine.api.step3.curlTitle": "cURL",
"xpack.enterpriseSearch.content.engine.api.step3.intro": "Elasticで管理されている言語クライアントが使用されたエンジンと統合し、検索エクスペリエンスを構築する方法をご覧ください。",
"xpack.enterpriseSearch.content.engine.api.step3.searchUITitle": "Search UI",
"xpack.enterpriseSearch.content.engine.api.step3.title": "エンドポイントを呼び出す方法をご覧ください",
"xpack.enterpriseSearch.content.engine.api.step4.copy": "エンジンは、このインストールの一部として、基本分析データを提供します。さらに粒度の高いカスタムメトリックを利用するには、ご使用のプラットフォームで当社の行動分析を統合してください。",
"xpack.enterpriseSearch.content.engine.api.step4.learnHowLink": "方法を学習",
"xpack.enterpriseSearch.content.engine.api.step4.title": "(任意)分析を強化",
"xpack.enterpriseSearch.content.engine.headerActions.actionsButton.ariaLabel": "エンジンアクションメニューボタン",
"xpack.enterpriseSearch.content.engine.headerActions.delete": "このエンジンを削除",
"xpack.enterpriseSearch.content.engine.indices.actions.columnTitle": "アクション",
"xpack.enterpriseSearch.content.engine.indices.actions.removeIndex.title": "このインデックスをエンジンから削除",
"xpack.enterpriseSearch.content.engine.indices.actions.viewIndex.title": "このインデックスを表示",
@ -12264,7 +12249,6 @@
"xpack.enterpriseSearch.content.engineList.deleteEngineModal.delete.description": "エンジンを削除すると、元に戻せません。インデックスには影響しません。",
"xpack.enterpriseSearch.content.engineList.deleteEngineModal.title": "このエンジンを完全に削除しますか?",
"xpack.enterpriseSearch.content.engineList.table.column.actions.deleteEngineLabel": "このエンジンを削除",
"xpack.enterpriseSearch.content.engines.breadcrumb": "エンジン",
"xpack.enterpriseSearch.content.engines.createEngine.header.createError.title": "エンジンの作成エラー",
"xpack.enterpriseSearch.content.engines.createEngine.header.docsLink": "エンジンドキュメント",
"xpack.enterpriseSearch.content.engines.createEngine.headerTitle": "エンジンを作成",
@ -12272,15 +12256,9 @@
"xpack.enterpriseSearch.content.engines.createEngine.nameEngine.title": "<u>エンジン名を指定</u>",
"xpack.enterpriseSearch.content.engines.createEngine.selectIndices.title": "インデックスを選択",
"xpack.enterpriseSearch.content.engines.createEngine.submit": "このエンジンを削除",
"xpack.enterpriseSearch.content.engines.createEngineButtonLabel": "エンジンを作成",
"xpack.enterpriseSearch.content.engines.documentation": "エンジンドキュメントを読む",
"xpack.enterpriseSearch.content.engines.enginesList.empty.description": "最初のエンジンの作成を説明します。",
"xpack.enterpriseSearch.content.engines.enginesList.empty.title": "初めてのエンジンの作成",
"xpack.enterpriseSearch.content.engines.indices.addIndicesFlyout.updateError.title": "エンジンの更新エラー",
"xpack.enterpriseSearch.content.engines.searchBar.ariaLabel": "検索エンジン",
"xpack.enterpriseSearch.content.engines.searchPlaceholder": "検索エンジン",
"xpack.enterpriseSearch.content.engines.searchPlaceholder.description": "名前または含まれているインデックスでエンジンを検索します。",
"xpack.enterpriseSearch.content.engines.title": "エンジン",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.table.docsCount.columnTitle": "ドキュメント数",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.table.health.columnTitle": "インデックス正常性",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.table.name.columnTitle": "インデックス名",
@ -12337,7 +12315,6 @@
"xpack.enterpriseSearch.content.index.pipelines.settings.reduceWhitespaceDescription": "ドキュメントの不要な空白を自動的に削除",
"xpack.enterpriseSearch.content.index.pipelines.settings.reduceWhitespaceLabel": "空白の削除",
"xpack.enterpriseSearch.content.index.pipelines.settings.runMlInferenceDescrition": "互換性がある学習済みMLモデルを使用してデータを強化",
"xpack.enterpriseSearch.content.index.searchEngines.createEngine": "App Searchエンジンの作成",
"xpack.enterpriseSearch.content.index.searchEngines.createEngineDisabledTooltip": "非表示のインデックスからエンジンを作成することはできません。",
"xpack.enterpriseSearch.content.index.searchEngines.label": "検索エンジン",
"xpack.enterpriseSearch.content.index.searchEngines.viewEngines": "App Searchエンジンを表示",
@ -12616,8 +12593,6 @@
"xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB",
"xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL",
"xpack.enterpriseSearch.content.navTitle": "コンテンツ",
"xpack.enterpriseSearch.content.new_index.successToast.button.label": "エンジンを作成",
"xpack.enterpriseSearch.content.new_index.successToast.description": "App Searchエンジンを使用して、新しいElasticsearchインデックスの検索エクスペリエンスを構築できます。",
"xpack.enterpriseSearch.content.new_index.successToast.title": "インデックスが正常に作成されました",
"xpack.enterpriseSearch.content.newIndex.breadcrumb": "新しい検索インデックス",
"xpack.enterpriseSearch.content.newIndex.emptyState.description": "エンタープライズ サーチで追加したデータは検索インデックスと呼ばれ、App SearchとWorkplace Searchの両方で検索可能です。App SearchのコネクターとWorkplace SearchのWebクローラーを使用できます。",
@ -13038,8 +13013,6 @@
"xpack.enterpriseSearch.emailLabel": "メール",
"xpack.enterpriseSearch.emptyState.description": "コンテンツはElasticsearchインデックスに保存されます。まず、Elasticsearchインデックスを作成し、インジェスチョン方法を選択します。オプションには、Elastic Webクローラー、サードパーティデータ統合、Elasticsearch APIエンドポイントの使用があります。",
"xpack.enterpriseSearch.emptyState.description.line2": "App SearchまたはElasticsearchのどちらで検索エクスペリエンスを構築しても、これが最初のステップです。",
"xpack.enterpriseSearch.engines.engine.notFound.action1": "エンジンに戻る",
"xpack.enterpriseSearch.engines.navTitle": "エンジン",
"xpack.enterpriseSearch.enterpriseSearch.setupGuide.description": "場所を問わず、何でも検索。組織を支える多忙なチームのために、パワフルでモダンな検索エクスペリエンスを簡単に導入できます。Webサイトやアプリ、ワークプレイスに事前調整済みの検索をすばやく追加しましょう。何でもシンプルに検索できます。",
"xpack.enterpriseSearch.enterpriseSearch.setupGuide.notConfigured": "エンタープライズサーチはまだKibanaインスタンスで構成されていません。",
"xpack.enterpriseSearch.enterpriseSearch.setupGuide.videoAlt": "エンタープライズ サーチの基本操作",

View file

@ -11131,8 +11131,6 @@
"xpack.enterpriseSearch.content.engine.indices.actions.viewIndex.caption": "查看索引 {indexName}",
"xpack.enterpriseSearch.content.engineList.deleteEngine.successToast.title": "{engineName} 已删除",
"xpack.enterpriseSearch.content.engines.createEngine.headerSubTitle": "引擎允许您的用户在索引中查询数据。请浏览我们的 {enginesDocsLink} 了解详情!",
"xpack.enterpriseSearch.content.engines.description": "引擎允许您通过一整套相关性、分析和个性化工具查询索引数据。有关引擎在 Enterprise Search 中的工作机制的详情,{documentationUrl}",
"xpack.enterpriseSearch.content.engines.enginesList.description": "正在显示第 {from}-{to} 个(共 {total} 个)",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.subTitle": "查看与 {engineName} 关联的索引",
"xpack.enterpriseSearch.content.enginesList.table.column.view.indices": "{indicesCount, number} 个{indicesCount, plural, other {索引}}",
"xpack.enterpriseSearch.content.index.connector.syncRules.description": "添加同步规则以定制要从 {indexName} 同步哪些数据。默认包括所有内容,并根据从上到下列出的已配置索引规则集验证文档。",
@ -12225,22 +12223,9 @@
"xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.done": "完成",
"xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.generateButton": "生成只读密钥",
"xpack.enterpriseSearch.content.engine.api.generateEngineApiKeyModal.title": "创建引擎只读 API 密钥",
"xpack.enterpriseSearch.content.engine.api.step1.apiKeyWarning": "Elastic 不会存储 API 密钥。一旦生成,您只能查看密钥一次。请确保将其保存在某个安全位置。如果失去它的访问权限,您需要从此屏幕生成新的 API 密钥。",
"xpack.enterpriseSearch.content.engine.api.step1.createAPIKeyButton": "创建 API 密钥",
"xpack.enterpriseSearch.content.engine.api.step1.learnMoreLink": "详细了解 API 密钥。",
"xpack.enterpriseSearch.content.engine.api.step1.title": "生成并保存 API 密钥",
"xpack.enterpriseSearch.content.engine.api.step1.viewKeysButton": "查看密钥",
"xpack.enterpriseSearch.content.engine.api.step2.copyEndpointDescription": "使用此 URL 访问您引擎的 API 终端。",
"xpack.enterpriseSearch.content.engine.api.step2.title": "复制您引擎的终端",
"xpack.enterpriseSearch.content.engine.api.step3.curlTitle": "cURL",
"xpack.enterpriseSearch.content.engine.api.step3.intro": "了解如何将您的引擎与由 Elastic 维护的语言客户端进行集成,以帮助构建搜索体验。",
"xpack.enterpriseSearch.content.engine.api.step3.searchUITitle": "搜索 UI",
"xpack.enterpriseSearch.content.engine.api.step3.title": "了解如何调用终端",
"xpack.enterpriseSearch.content.engine.api.step4.copy": "您的引擎作为此安装的一部分提供了基本分析数据。要接收更多粒度化的定制指标,请在您的平台上集成我们的行为分析脚本。",
"xpack.enterpriseSearch.content.engine.api.step4.learnHowLink": "了解操作方法",
"xpack.enterpriseSearch.content.engine.api.step4.title": "(可选)强化分析",
"xpack.enterpriseSearch.content.engine.headerActions.actionsButton.ariaLabel": "引擎操作菜单按钮",
"xpack.enterpriseSearch.content.engine.headerActions.delete": "删除此引擎",
"xpack.enterpriseSearch.content.engine.indices.actions.columnTitle": "操作",
"xpack.enterpriseSearch.content.engine.indices.actions.removeIndex.title": "从引擎中移除此索引",
"xpack.enterpriseSearch.content.engine.indices.actions.viewIndex.title": "查看此索引",
@ -12265,7 +12250,6 @@
"xpack.enterpriseSearch.content.engineList.deleteEngineModal.delete.description": "删除引擎是不可逆操作。您的索引不会受到影响。",
"xpack.enterpriseSearch.content.engineList.deleteEngineModal.title": "永久删除此引擎?",
"xpack.enterpriseSearch.content.engineList.table.column.actions.deleteEngineLabel": "删除此引擎",
"xpack.enterpriseSearch.content.engines.breadcrumb": "引擎",
"xpack.enterpriseSearch.content.engines.createEngine.header.createError.title": "创建引擎时出错",
"xpack.enterpriseSearch.content.engines.createEngine.header.docsLink": "引擎文档",
"xpack.enterpriseSearch.content.engines.createEngine.headerTitle": "创建引擎",
@ -12273,15 +12257,9 @@
"xpack.enterpriseSearch.content.engines.createEngine.nameEngine.title": "命名您的引擎",
"xpack.enterpriseSearch.content.engines.createEngine.selectIndices.title": "选择索引",
"xpack.enterpriseSearch.content.engines.createEngine.submit": "创建此引擎",
"xpack.enterpriseSearch.content.engines.createEngineButtonLabel": "创建引擎",
"xpack.enterpriseSearch.content.engines.documentation": "浏览我们的引擎文档",
"xpack.enterpriseSearch.content.engines.enginesList.empty.description": "下面我们指导您创建首个引擎。",
"xpack.enterpriseSearch.content.engines.enginesList.empty.title": "创建您的首个引擎",
"xpack.enterpriseSearch.content.engines.indices.addIndicesFlyout.updateError.title": "更新引擎时出错",
"xpack.enterpriseSearch.content.engines.searchBar.ariaLabel": "搜索引擎",
"xpack.enterpriseSearch.content.engines.searchPlaceholder": "搜索引擎",
"xpack.enterpriseSearch.content.engines.searchPlaceholder.description": "通过名称或根据其包含的索引查找引擎。",
"xpack.enterpriseSearch.content.engines.title": "引擎",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.table.docsCount.columnTitle": "文档计数",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.table.health.columnTitle": "索引运行状况",
"xpack.enterpriseSearch.content.enginesList.indicesFlyout.table.name.columnTitle": "索引名称",
@ -12338,7 +12316,6 @@
"xpack.enterpriseSearch.content.index.pipelines.settings.reduceWhitespaceDescription": "自动剪裁文档中的额外空白",
"xpack.enterpriseSearch.content.index.pipelines.settings.reduceWhitespaceLabel": "减少空白",
"xpack.enterpriseSearch.content.index.pipelines.settings.runMlInferenceDescrition": "使用兼容的已训练 ML 模型增强您的数据",
"xpack.enterpriseSearch.content.index.searchEngines.createEngine": "创建 App Search 引擎",
"xpack.enterpriseSearch.content.index.searchEngines.createEngineDisabledTooltip": "无法从隐藏的索引中创建引擎。",
"xpack.enterpriseSearch.content.index.searchEngines.label": "搜索引擎",
"xpack.enterpriseSearch.content.index.searchEngines.viewEngines": "查看 App Search 引擎",
@ -12617,8 +12594,6 @@
"xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB",
"xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL",
"xpack.enterpriseSearch.content.navTitle": "内容",
"xpack.enterpriseSearch.content.new_index.successToast.button.label": "创建引擎",
"xpack.enterpriseSearch.content.new_index.successToast.description": "您可以使用 App Search 引擎为您的新 Elasticsearch 索引构建搜索体验。",
"xpack.enterpriseSearch.content.new_index.successToast.title": "已成功创建索引",
"xpack.enterpriseSearch.content.newIndex.breadcrumb": "新搜索索引",
"xpack.enterpriseSearch.content.newIndex.emptyState.description": "您在 Enterprise Search 中添加的数据称为搜索索引,您可在 App Search 和 Workplace Search 中搜索这些数据。现在,您可以在 App Search 中使用连接器,在 Workplace Search 中使用网络爬虫。",
@ -13039,8 +13014,6 @@
"xpack.enterpriseSearch.emailLabel": "电子邮件",
"xpack.enterpriseSearch.emptyState.description": "您的内容存储在 Elasticsearch 索引中。通过创建 Elasticsearch 索引并选择采集方法开始使用。选项包括 Elastic 网络爬虫、第三方数据集成或使用 Elasticsearch API 终端。",
"xpack.enterpriseSearch.emptyState.description.line2": "无论是使用 App Search 还是 Elasticsearch 构建搜索体验,您都可以从此处立即开始。",
"xpack.enterpriseSearch.engines.engine.notFound.action1": "返回到引擎",
"xpack.enterpriseSearch.engines.navTitle": "引擎",
"xpack.enterpriseSearch.enterpriseSearch.setupGuide.description": "随时随地进行全面搜索。为工作繁忙的团队轻松实现强大的现代搜索体验。将预先调整的搜索功能快速添加到您的网站、应用或工作区。全面搜索就是这么简单。",
"xpack.enterpriseSearch.enterpriseSearch.setupGuide.notConfigured": "企业搜索尚未在您的 Kibana 实例中配置。",
"xpack.enterpriseSearch.enterpriseSearch.setupGuide.videoAlt": "企业搜索入门",