Skip to content

Commit

Permalink
[Synonyms UI] Synonyms UI base plugin (#203284)
Browse files Browse the repository at this point in the history
## Summary

Creates a plugin for Synonyms UI implementation. It is hidden under the
UI flag and config option which is off by default.
```
POST kbn:/internal/kibana/settings/searchSynonyms:synonymsEnabled
{"value": true}
```

Serverless Search:
<img width="379" alt="Screenshot 2024-12-17 at 13 18 02"
src="https://github.com/user-attachments/assets/8c2cb6f0-ce2a-4be6-8605-4f994adeefd7"
/>

Stack Search
<img width="293" alt="Screenshot 2024-12-17 at 13 21 43"
src="https://github.com/user-attachments/assets/0d61de0e-2cd3-46a6-990f-1f1a70843324"
/>

### Checklist

Check the PR satisfies following conditions.

Reviewers should verify this PR satisfies this list as well.

- [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)
- [ ]
[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)
was added for features that require explanation or tutorials
- [ ] [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
- [x] This was checked for breaking HTTP API changes, and any breaking
changes have been approved by the breaking-change committee. The
`release_note:breaking` label should be applied in these situations.
- [ ] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
- [x] The PR description includes the appropriate Release Notes section,
and the correct `release_note:*` label is applied per the
[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)

---------

Co-authored-by: Elastic Machine <[email protected]>
Co-authored-by: kibanamachine <[email protected]>
(cherry picked from commit e542fd2)

# Conflicts:
#	.github/CODEOWNERS
  • Loading branch information
efegurkan committed Jan 8, 2025
1 parent a6b07b9 commit 77eda8f
Show file tree
Hide file tree
Showing 32 changed files with 2,809 additions and 1,048 deletions.
3,425 changes: 2,378 additions & 1,047 deletions .github/CODEOWNERS

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions config/serverless.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ xpack.fleet.internal.activeAgentsSoftLimit: 25000
xpack.fleet.internal.onlyAllowAgentUpgradeToKnownVersions: true
xpack.fleet.internal.retrySetupOnBoot: true
xpack.fleet.internal.useMeteringApi: true
xpack.searchSynonyms.enabled: false

## Fine-tune the feature privileges.
xpack.features.overrides:
Expand Down
4 changes: 4 additions & 0 deletions docs/developer/plugin-list.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -856,6 +856,10 @@ detailed information on how Elasticsearch executed the search request. People us
to understand why a search request might be slow.
|{kib-repo}blob/{branch}/x-pack/solutions/search/plugins/search_synonyms/README.md[searchSynonyms]
|A plugin to manage synonyms in Elasticsearch through Synonyms APIs through Kibana.
|{kib-repo}blob/{branch}/x-pack/platform/plugins/shared/security/README.md[security]
|See Configuring security in
Kibana.
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,7 @@
"@kbn/search-playground": "link:x-pack/solutions/search/plugins/search_playground",
"@kbn/search-response-warnings": "link:src/platform/packages/shared/kbn-search-response-warnings",
"@kbn/search-shared-ui": "link:x-pack/solutions/search/packages/search/shared_ui",
"@kbn/search-synonyms": "link:x-pack/solutions/search/plugins/search_synonyms",
"@kbn/search-types": "link:src/platform/packages/shared/kbn-search-types",
"@kbn/searchprofiler-plugin": "link:x-pack/platform/plugins/shared/searchprofiler",
"@kbn/security-api-key-management": "link:x-pack/platform/packages/shared/security/api_key_management",
Expand Down
1 change: 1 addition & 0 deletions packages/kbn-optimizer/limits.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ pageLoadAssetSize:
searchNotebooks: 18942
searchPlayground: 19325
searchprofiler: 67080
searchSynonyms: 20262
security: 81771
securitySolution: 98429
securitySolutionEss: 31781
Expand Down
1 change: 1 addition & 0 deletions src/platform/packages/shared/deeplinks/search/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export const SERVERLESS_ES_APP_ID = 'serverlessElasticsearch';
export const SERVERLESS_ES_CONNECTORS_ID = 'serverlessConnectors';
export const ES_SEARCH_PLAYGROUND_ID = 'searchPlayground';
export const SERVERLESS_ES_SEARCH_INFERENCE_ENDPOINTS_ID = 'searchInferenceEndpoints';
export const ES_SEARCH_SYNONYMS_ID = 'searchSynonyms';
export const SEARCH_HOMEPAGE = 'searchHomepage';
export const SEARCH_INDICES_START = 'elasticsearchStart';
export const SEARCH_INDICES = 'elasticsearchIndices';
Expand Down
6 changes: 6 additions & 0 deletions src/platform/packages/shared/deeplinks/search/deep_links.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
SEARCH_VECTOR_SEARCH,
SEARCH_SEMANTIC_SEARCH,
SEARCH_AI_SEARCH,
ES_SEARCH_SYNONYMS_ID,
} from './constants';

export type EnterpriseSearchApp = typeof ENTERPRISE_SEARCH_APP_ID;
Expand All @@ -38,6 +39,7 @@ export type ServerlessSearchApp = typeof SERVERLESS_ES_APP_ID;
export type ConnectorsId = typeof SERVERLESS_ES_CONNECTORS_ID;
export type SearchPlaygroundId = typeof ES_SEARCH_PLAYGROUND_ID;
export type SearchInferenceEndpointsId = typeof SERVERLESS_ES_SEARCH_INFERENCE_ENDPOINTS_ID;
export type SearchSynonymsId = typeof ES_SEARCH_SYNONYMS_ID;
export type SearchHomepage = typeof SEARCH_HOMEPAGE;
export type SearchStart = typeof SEARCH_INDICES_START;
export type SearchIndices = typeof SEARCH_INDICES;
Expand All @@ -54,6 +56,8 @@ export type AppsearchLinkId = 'engines';

export type SearchInferenceEndpointsLinkId = 'inferenceEndpoints';

export type SynonymsLinkId = 'synonyms';

export type SearchIndicesLinkId = typeof SEARCH_INDICES_CREATE_INDEX;

export type DeepLinkId =
Expand All @@ -67,11 +71,13 @@ export type DeepLinkId =
| ConnectorsId
| SearchPlaygroundId
| SearchInferenceEndpointsId
| SearchSynonymsId
| SearchHomepage
| `${EnterpriseSearchContentApp}:${ContentLinkId}`
| `${EnterpriseSearchApplicationsApp}:${ApplicationsLinkId}`
| `${EnterpriseSearchAppsearchApp}:${AppsearchLinkId}`
| `${SearchInferenceEndpointsId}:${SearchInferenceEndpointsLinkId}`
| `${SearchSynonymsId}:${SynonymsLinkId}`
| SearchStart
| SearchIndices
| SearchElasticsearch
Expand Down
2 changes: 2 additions & 0 deletions tsconfig.base.json
Original file line number Diff line number Diff line change
Expand Up @@ -1602,6 +1602,8 @@
"@kbn/search-response-warnings/*": ["src/platform/packages/shared/kbn-search-response-warnings/*"],
"@kbn/search-shared-ui": ["x-pack/solutions/search/packages/search/shared_ui"],
"@kbn/search-shared-ui/*": ["x-pack/solutions/search/packages/search/shared_ui/*"],
"@kbn/search-synonyms": ["x-pack/solutions/search/plugins/search_synonyms"],
"@kbn/search-synonyms/*": ["x-pack/solutions/search/plugins/search_synonyms/*"],
"@kbn/search-types": ["src/platform/packages/shared/kbn-search-types"],
"@kbn/search-types/*": ["src/platform/packages/shared/kbn-search-types/*"],
"@kbn/searchprofiler-plugin": ["x-pack/platform/plugins/shared/searchprofiler"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,14 @@ export const buildBaseClassicNavItems = ({
},
id: 'inference_endpoints',
},
{
'data-test-subj': 'searchSideNav-Synonyms',
deepLink: {
link: 'searchSynonyms:synonyms',
shouldShowActiveForSubroutes: true,
},
id: 'synonyms',
},
],
name: i18n.translate('xpack.enterpriseSearch.nav.relevanceTitle', {
defaultMessage: 'Relevance',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,10 @@ export const getNavigationTreeDefinition = ({
}),
},
{
children: [{ link: 'searchInferenceEndpoints:inferenceEndpoints' }],
children: [
{ link: 'searchInferenceEndpoints:inferenceEndpoints' },
{ link: 'searchSynonyms:synonyms' },
],
id: 'relevance',
title: i18n.translate('xpack.enterpriseSearch.searchNav.relevance', {
defaultMessage: 'Relevance',
Expand Down
3 changes: 3 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Search Synonyms

A plugin to manage synonyms in Elasticsearch through Synonyms APIs through Kibana.
15 changes: 15 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/common/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* 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 { i18n } from '@kbn/i18n';

export const PLUGIN_ID = 'searchSynonyms';
export const PLUGIN_NAME = 'Synonyms';

export const PLUGIN_TITLE = i18n.translate('xpack.searchSynonyms.pluginTitle', {
defaultMessage: 'Synonyms',
});
19 changes: 19 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/common/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* 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.
*/

// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface SearchSynonymsPluginSetup {}

// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface SearchSynonymsPluginStart {}

// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface AppPluginSetupDependencies {}

export interface SearchSynonymsConfigType {
enabled: boolean;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* 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.
*/

export const SYNONYMS_UI_FLAG = 'searchSynonyms:synonymsEnabled';
17 changes: 17 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* 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.
*/

module.exports = {
preset: '@kbn/test',
rootDir: '../../../../..',
roots: ['<rootDir>/x-pack/solutions/search/plugins/search_synonyms'],
coverageDirectory: '<rootDir>/target/kibana-coverage/jest/x-pack/plugins/search_synonyms',
coverageReporters: ['text', 'html'],
collectCoverageFrom: [
'<rootDir>/x-pack/solutions/search/plugins/search_synonyms/{public,server}/**/*.{ts,tsx}',
],
};
26 changes: 26 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/kibana.jsonc
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"type": "plugin",
"id": "@kbn/search-synonyms",
"owner": "@elastic/search-kibana",
"group": "search",
"visibility": "private",
"plugin": {
"id": "searchSynonyms",
"server": true,
"browser": true,
"configPath": [
"xpack",
"searchSynonyms"
],
"requiredPlugins": [
"features",
],
"optionalPlugins": [
"console",
"searchNavigation",
],
"requiredBundles": [
"kibanaReact",
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* 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 from 'react';
import ReactDOM from 'react-dom';
import { CoreStart } from '@kbn/core/public';
import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
import { I18nProvider } from '@kbn/i18n-react';
import { Router } from '@kbn/shared-ux-router';
import { AppPluginStartDependencies } from './types';

export const renderApp = async (
core: CoreStart,
services: AppPluginStartDependencies,
element: HTMLElement
) => {
ReactDOM.render(
<KibanaRenderContextProvider {...core}>
<KibanaContextProvider services={{ ...core, ...services }}>
<I18nProvider>
<Router history={services.history}>
<div>Synonyms</div>
</Router>
</I18nProvider>
</KibanaContextProvider>
</KibanaRenderContextProvider>,
element
);
return () => ReactDOM.unmountComponentAtNode(element);
};
12 changes: 12 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/public/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/*
* 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 { SearchSynonymsPlugin } from './plugin';

export function plugin() {
return new SearchSynonymsPlugin();
}
68 changes: 68 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/public/plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* 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 type { CoreSetup, Plugin, AppMountParameters } from '@kbn/core/public';
import { PLUGIN_ID, PLUGIN_NAME, PLUGIN_TITLE } from '../common';
import {
AppPluginSetupDependencies,
AppPluginStartDependencies,
SearchSynonymsPluginSetup,
SearchSynonymsPluginStart,
} from './types';
import { SYNONYMS_UI_FLAG } from '../common/ui_flags';

export class SearchSynonymsPlugin
implements Plugin<SearchSynonymsPluginSetup, SearchSynonymsPluginStart>
{
constructor() {}

public setup(
core: CoreSetup<AppPluginStartDependencies, SearchSynonymsPluginStart>,
_: AppPluginSetupDependencies
): SearchSynonymsPluginSetup {
if (!core.settings.client.get<boolean>(SYNONYMS_UI_FLAG, false)) {
return {};
}
core.application.register({
id: PLUGIN_ID,
appRoute: '/app/elasticsearch/synonyms',
title: PLUGIN_TITLE,
deepLinks: [
{
id: 'synonyms',
path: '/',
title: PLUGIN_TITLE,
visibleIn: ['globalSearch'],
},
],
async mount({ element, history }: AppMountParameters) {
const { renderApp } = await import('./application');
const [coreStart, depsStart] = await core.getStartServices();

coreStart.chrome.docTitle.change(PLUGIN_NAME);

const startDeps: AppPluginStartDependencies = {
...depsStart,
history,
};

depsStart.searchNavigation?.handleOnAppMount();

return renderApp(coreStart, startDeps, element);
},
visibleIn: [],
});

return {};
}

public start(): SearchSynonymsPluginStart {
return {};
}

public stop() {}
}
17 changes: 17 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/public/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* 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 { SearchNavigationPluginStart } from '@kbn/search-navigation/public';
import { AppMountParameters } from '@kbn/core/public';
import type { ConsolePluginStart } from '@kbn/console-plugin/public';

export * from '../common/types';
export interface AppPluginStartDependencies {
history: AppMountParameters['history'];
console?: ConsolePluginStart;
searchNavigation?: SearchNavigationPluginStart;
}
19 changes: 19 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/server/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* 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 { schema, TypeOf } from '@kbn/config-schema';
import { PluginConfigDescriptor } from '@kbn/core/server';

const configSchema = schema.object({
enabled: schema.boolean({ defaultValue: false }),
});

export type SearchPlaygroundConfig = TypeOf<typeof configSchema>;

export const config: PluginConfigDescriptor<SearchPlaygroundConfig> = {
schema: configSchema,
};
17 changes: 17 additions & 0 deletions x-pack/solutions/search/plugins/search_synonyms/server/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* 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 { PluginInitializerContext } from '@kbn/core/server';

export { config } from './config';

export async function plugin(initializerContext: PluginInitializerContext) {
const { SearchSynonymsPlugin } = await import('./plugin');
return new SearchSynonymsPlugin(initializerContext);
}

export type { SearchSynonymsPluginSetup, SearchSynonymsPluginStart } from './types';
Loading

0 comments on commit 77eda8f

Please sign in to comment.