From 2c77d162c0001594e0404f64c6131d806adabfe4 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Date: Thu, 4 Apr 2024 11:30:17 -0700 Subject: [PATCH 01/69] [Cloud Security] Handle empty cloud.account.id field (#180018) ## Summary This PR fixes #179305 by adding checks for the existence of `cloud.account.id` field in the `getIdentifierRuntimeMapping` function. It also removes the `getBelongsToRuntimeMapping` that is no longer used. ## Screenshots Empty cloud.account.name ![image](https://github.com/elastic/kibana/assets/19270322/2ccd354e-fa8c-4523-90d4-d75cca053e57) Kibana logs ![image](https://github.com/elastic/kibana/assets/19270322/5eac4c7d-3f86-439b-b15c-66954ebf7c18) Dashboard ![image](https://github.com/elastic/kibana/assets/19270322/ead8c475-a322-4d41-9533-d0e0a5f5a87e) Telemetry ![image](https://github.com/elastic/kibana/assets/19270322/a2d3c2b0-5aad-4d6b-a0fd-a2ee993dbbf3) --- .../get_belongs_to_runtime_mapping.ts | 48 ------------------- .../get_identifier_runtime_mapping.ts | 10 +++- 2 files changed, 9 insertions(+), 49 deletions(-) delete mode 100644 x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_belongs_to_runtime_mapping.ts diff --git a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_belongs_to_runtime_mapping.ts b/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_belongs_to_runtime_mapping.ts deleted file mode 100644 index a3b81fa0a5e16..0000000000000 --- a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_belongs_to_runtime_mapping.ts +++ /dev/null @@ -1,48 +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 { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/types'; - -/** - * Creates the `belongs_to` runtime field with the value of either - * `account.cloud.name` or `cluster.id` based on the value of `rule.benchmark.posture_type` - */ -export const getBelongsToRuntimeMapping = (): MappingRuntimeFields => ({ - belongs_to: { - type: 'keyword', - script: { - source: ` - def postureTypeAvailable = doc.containsKey("rule.benchmark.posture_type") && - !doc["rule.benchmark.posture_type"].empty; - def orchestratorIdAvailable = doc.containsKey("orchestrator.cluster.id") && - !doc["orchestrator.cluster.id"].empty; - - if (!postureTypeAvailable) { - def belongs_to = orchestratorIdAvailable ? - doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; - emit(belongs_to); - } else { - def policy_template_type = doc["rule.benchmark.posture_type"].value; - - if (policy_template_type == "cspm") { - def belongs_to = doc["cloud.account.name"].value; - emit(belongs_to); - } else if (policy_template_type == "kspm") { - def belongs_to = orchestratorIdAvailable ? - doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; - emit(belongs_to); - } else { - // Default behaviour when policy_template_type is unknown - def belongs_to = orchestratorIdAvailable ? - doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; - emit(belongs_to); - } - } - `, - }, - }, -}); diff --git a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts b/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts index e077574d449ec..82137a3dafffb 100644 --- a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts +++ b/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts @@ -20,6 +20,8 @@ export const getIdentifierRuntimeMapping = (): MappingRuntimeFields => ({ !doc["rule.benchmark.posture_type"].empty; def orchestratorIdAvailable = doc.containsKey("orchestrator.cluster.id") && !doc["orchestrator.cluster.id"].empty; + def cloudAccountIdAvailable = doc.containsKey("cloud.account.id") && !doc["cloud.account.id"].empty && + doc["cloud.account.id"].value != ""; if (!postureTypeAvailable) { def identifier = orchestratorIdAvailable ? doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; @@ -28,7 +30,13 @@ export const getIdentifierRuntimeMapping = (): MappingRuntimeFields => ({ def policy_template_type = doc["rule.benchmark.posture_type"].value; if (policy_template_type == "cspm") { - emit(doc["cloud.account.id"].value); + // Checking for emptiness due to backwards compatibility with 8.13 + // where cloud.account.id was not available and no field was eligible for asset identifier + if (cloudAccountIdAvailable) { + emit(doc["cloud.account.id"].value); + } else { + return; + } } else if (policy_template_type == "kspm") { def identifier = orchestratorIdAvailable ? doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; From d96552a108bbcc49dd82db07d1c95cb148847232 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 4 Apr 2024 19:39:33 +0100 Subject: [PATCH 02/69] skip flaky suite (#171600) --- .../case_view/components/suggest_users_popover.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx index 479b8e39d232d..7861d02e7f385 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx @@ -18,7 +18,8 @@ import type { AssigneeWithProfile } from '../../user_profiles/types'; jest.mock('../../../containers/user_profiles/api'); -describe('SuggestUsersPopover', () => { +// FLAKY: https://github.com/elastic/kibana/issues/171600 +describe.skip('SuggestUsersPopover', () => { let appMockRender: AppMockRenderer; let defaultProps: SuggestUsersPopoverProps; From b87b1da1cf7ee8a4de1804a6d5a6d5c7c1d72a34 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 4 Apr 2024 19:41:06 +0100 Subject: [PATCH 03/69] skip flaky suite (#171601) --- .../case_view/components/suggest_users_popover.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx index 7861d02e7f385..d84675d8e7883 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx @@ -19,6 +19,7 @@ import type { AssigneeWithProfile } from '../../user_profiles/types'; jest.mock('../../../containers/user_profiles/api'); // FLAKY: https://github.com/elastic/kibana/issues/171600 +// FLAKY: https://github.com/elastic/kibana/issues/171601 describe.skip('SuggestUsersPopover', () => { let appMockRender: AppMockRenderer; let defaultProps: SuggestUsersPopoverProps; From ede6a53caa56c69cc157ec30bb5d9873612b11dd Mon Sep 17 00:00:00 2001 From: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Thu, 4 Apr 2024 20:50:08 +0200 Subject: [PATCH 04/69] [Lens] Allow users to choose a layer type when adding a new layer (#179532) ## Summary Fixes https://github.com/elastic/kibana/issues/179135 The PR is ready to be reviewed, but I have to wait for @MichaelMarcialis input. Adds options for layer type when adding a new layer: Screenshot 2024-03-28 at 13 30 00 Screenshot 2024-03-28 at 13 29 49 --------- Co-authored-by: Marco Vettorello --- .../config_panel/config_panel.tsx | 6 +- .../public/state_management/lens_slice.ts | 7 +- x-pack/plugins/lens/public/types.ts | 19 ++- .../visualizations/xy/add_layer.test.tsx | 123 ++++++++++++++++++ .../public/visualizations/xy/add_layer.tsx | 65 ++++++++- .../visualizations/xy/visualization.tsx | 11 +- .../apps/lens/group1/smokescreen.ts | 4 +- .../test/functional/page_objects/lens_page.ts | 6 +- .../localization/tests/lens/smokescreen.ts | 3 +- .../visualizations/group1/smokescreen.ts | 3 +- 10 files changed, 222 insertions(+), 25 deletions(-) create mode 100644 x-pack/plugins/lens/public/visualizations/xy/add_layer.test.tsx diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx index e67a6feda2e09..5f66bd2e838c0 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx @@ -238,10 +238,9 @@ export function LayerPanels( [dispatchLens, props.framePublicAPI.dataViews.indexPatterns, props.indexPatternService] ); - const addLayer: AddLayerFunction = (layerType, extraArg, ignoreInitialValues) => { + const addLayer: AddLayerFunction = (layerType, extraArg, ignoreInitialValues, seriesType) => { const layerId = generateId(); - - dispatchLens(addLayerAction({ layerId, layerType, extraArg, ignoreInitialValues })); + dispatchLens(addLayerAction({ layerId, layerType, extraArg, ignoreInitialValues, seriesType })); setNextFocusedLayerId(layerId); }; @@ -335,6 +334,7 @@ export function LayerPanels( })} {!hideAddLayerButton && activeVisualization?.getAddLayerButtonComponent?.({ + state: visualization.state, supportedLayers: activeVisualization.getSupportedLayers( visualization.state, props.framePublicAPI diff --git a/x-pack/plugins/lens/public/state_management/lens_slice.ts b/x-pack/plugins/lens/public/state_management/lens_slice.ts index dc59192c2d195..3146f61d3c5d0 100644 --- a/x-pack/plugins/lens/public/state_management/lens_slice.ts +++ b/x-pack/plugins/lens/public/state_management/lens_slice.ts @@ -13,6 +13,7 @@ import { History } from 'history'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import { EventAnnotationGroupConfig } from '@kbn/event-annotation-common'; import { DragDropIdentifier, DropType } from '@kbn/dom-drag-drop'; +import { SeriesType } from '@kbn/visualizations-plugin/common'; import { LensEmbeddableInput } from '..'; import { TableInspectorAdapter } from '../editor_frame_service/types'; import type { @@ -244,6 +245,7 @@ export const addLayer = createAction<{ layerType: LayerType; extraArg: unknown; ignoreInitialValues?: boolean; + seriesType?: SeriesType; }>('lens/addLayer'); export const onDropToDimension = createAction<{ source: DragDropIdentifier; @@ -908,7 +910,7 @@ export const makeLensReducer = (storeDeps: LensStoreDeps) => { .addCase( addLayer, - (state, { payload: { layerId, layerType, extraArg, ignoreInitialValues } }) => { + (state, { payload: { layerId, layerType, extraArg, seriesType, ignoreInitialValues } }) => { if (!state.activeDatasourceId || !state.visualization.activeId) { return state; } @@ -924,7 +926,8 @@ export const makeLensReducer = (storeDeps: LensStoreDeps) => { layerId, layerType, currentDataViewsId, - extraArg + extraArg, + seriesType ); const framePublicAPI = selectFramePublicAPI({ lens: current(state) }, datasourceMap); diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 1f189f80c14b2..c1c7be77b9608 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -17,7 +17,11 @@ import type { Datatable, ExpressionRendererEvent, } from '@kbn/expressions-plugin/public'; -import type { Configuration, NavigateToLensContext } from '@kbn/visualizations-plugin/common'; +import type { + Configuration, + NavigateToLensContext, + SeriesType, +} from '@kbn/visualizations-plugin/common'; import type { Query } from '@kbn/es-query'; import type { UiActionsStart, @@ -1000,7 +1004,8 @@ interface VisualizationStateFromContextChangeProps { export type AddLayerFunction = ( layerType: LayerType, extraArg?: T, - ignoreInitialValues?: boolean + ignoreInitialValues?: boolean, + seriesType?: SeriesType ) => void; export type AnnotationGroups = Record; @@ -1024,7 +1029,8 @@ export type RegisterLibraryAnnotationGroupFunction = (groupInfo: { id: string; group: EventAnnotationGroupConfig; }) => void; -interface AddLayerButtonProps { +interface AddLayerButtonProps { + state: T; supportedLayers: VisualizationLayerDescription[]; addLayer: AddLayerFunction; ensureIndexPattern: (specOrId: DataViewSpec | string) => Promise; @@ -1110,7 +1116,8 @@ export interface Visualization T; /** Retrieve a list of supported layer types with initialization data */ @@ -1254,8 +1261,8 @@ export interface Visualization null | ReactElement<{ columnId: string; label: string }>; getAddLayerButtonComponent?: ( - props: AddLayerButtonProps - ) => null | ReactElement; + props: AddLayerButtonProps + ) => null | ReactElement>; /** * Creates map of columns ids and unique lables. Used only for noDatasource layers */ diff --git a/x-pack/plugins/lens/public/visualizations/xy/add_layer.test.tsx b/x-pack/plugins/lens/public/visualizations/xy/add_layer.test.tsx new file mode 100644 index 0000000000000..5ecef7e45eebe --- /dev/null +++ b/x-pack/plugins/lens/public/visualizations/xy/add_layer.test.tsx @@ -0,0 +1,123 @@ +/* + * 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 { fireEvent, render, screen, waitFor, within } from '@testing-library/react'; +import { AddLayerButton } from './add_layer'; +import { XYState } from './types'; +import { Position } from '@elastic/charts'; +import { LayerTypes } from '@kbn/visualizations-plugin/common'; +import { eventAnnotationServiceMock } from '@kbn/event-annotation-plugin/public/mocks'; +import { IconChartBarAnnotations } from '@kbn/chart-icons'; + +describe('AddLayerButton', () => { + const addLayer = jest.fn(); + + const renderAddLayerButton = () => { + const state: XYState = { + legend: { position: Position.Bottom, isVisible: true }, + valueLabels: 'show', + preferredSeriesType: 'bar', + layers: [ + { + layerId: 'first', + layerType: LayerTypes.DATA, + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], + }, + ], + }; + const supportedLayers = [ + { + type: LayerTypes.DATA, + label: 'Visualization', + }, + { + type: LayerTypes.REFERENCELINE, + label: LayerTypes.REFERENCELINE, + }, + { + type: LayerTypes.ANNOTATIONS, + label: 'Annotations', + icon: IconChartBarAnnotations, + disabled: true, + }, + ]; + + const rtlRender = render( + + ); + return { + ...rtlRender, + clickAddLayer: () => { + fireEvent.click(screen.getByLabelText('Add layer')); + }, + clickVisualizationButton: () => { + fireEvent.click(screen.getByRole('button', { name: 'Visualization' })); + }, + clickSeriesOptionsButton: (seriesType = 'line') => { + const lineOption = screen.getByTestId(`lnsXY_seriesType-${seriesType}`); + fireEvent.click(lineOption); + }, + waitForSeriesOptions: async () => { + await waitFor(() => { + expect(screen.queryByTestId('lnsXY_seriesType-area')).toBeInTheDocument(); + }); + }, + getSeriesTypeOptions: () => { + return within( + screen.getByTestId('contextMenuPanelTitleButton').parentElement as HTMLElement + ) + .getAllByRole('button') + .map((el) => el.textContent); + }, + }; + }; + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('renders all compatible series types', async () => { + const { clickAddLayer, clickVisualizationButton, waitForSeriesOptions, getSeriesTypeOptions } = + renderAddLayerButton(); + clickAddLayer(); + clickVisualizationButton(); + await waitForSeriesOptions(); + + expect(getSeriesTypeOptions()).toEqual([ + 'Select visualization type', + 'Bar vertical', + 'Bar vertical stacked', + 'Bar vertical percentage', + 'Area', + 'Area stacked', + 'Area percentage', + 'Line', + ]); + }); + it('calls addLayer with a proper series type when button is clicked', async () => { + const { + clickAddLayer, + clickVisualizationButton, + waitForSeriesOptions, + clickSeriesOptionsButton, + } = renderAddLayerButton(); + clickAddLayer(); + clickVisualizationButton(); + await waitForSeriesOptions(); + clickSeriesOptionsButton('line'); + expect(addLayer).toHaveBeenCalledWith(LayerTypes.DATA, undefined, undefined, 'line'); + }); +}); diff --git a/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx b/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx index 93cfd1a48e628..933aaca9f3915 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx @@ -20,16 +20,27 @@ import { EventAnnotationServiceType } from '@kbn/event-annotation-plugin/public' import { AddLayerFunction, VisualizationLayerDescription } from '../../types'; import { LoadAnnotationLibraryFlyout } from './load_annotation_library_flyout'; import type { ExtraAppendLayerArg } from './visualization'; +import { SeriesType, XYState, visualizationTypes } from './types'; +import { isHorizontalChart, isHorizontalSeries } from './state_helpers'; +import { getDataLayers } from './visualization_helpers'; import { ExperimentalBadge } from '../../shared_components'; interface AddLayerButtonProps { + state: XYState; supportedLayers: VisualizationLayerDescription[]; addLayer: AddLayerFunction; eventAnnotationService: EventAnnotationServiceType; isInlineEditing?: boolean; } +export enum AddLayerPanelType { + main = 'main', + selectAnnotationMethod = 'selectAnnotationMethod', + selectVisualizationType = 'selectVisualizationType', +} + export function AddLayerButton({ + state, supportedLayers, addLayer, eventAnnotationService, @@ -47,7 +58,7 @@ export function AddLayerButton({ toolTipContent, }: typeof supportedLayers[0]) => { return { - panel: 1, + panel: AddLayerPanelType.selectAnnotationMethod, toolTipContent, disabled, name: ( @@ -66,6 +77,33 @@ export function AddLayerButton({ }; }; + const dataPanel = ({ + type, + label, + icon, + disabled, + toolTipContent, + }: typeof supportedLayers[0]) => { + return { + panel: AddLayerPanelType.selectVisualizationType, + toolTipContent, + disabled, + name: {label}, + className: 'lnsLayerAddButton', + icon: icon && , + ['data-test-subj']: `lnsLayerAddButton-${type}`, + }; + }; + + const horizontalOnly = isHorizontalChart(state.layers); + + const availableVisTypes = visualizationTypes.filter( + (t) => isHorizontalSeries(t.id as SeriesType) === horizontalOnly + ); + + const currentLayerVisType = + availableVisTypes.findIndex((t) => t.id === getDataLayers(state.layers)?.[0]?.seriesType) || 0; + return ( <> ({ + name: t.fullLabel || t.label, + icon: t.icon && , + onClick: () => { + addLayer(LayerTypes.DATA, undefined, undefined, t.id as SeriesType); + toggleLayersChoice(false); + }, + 'data-test-subj': `lnsXY_seriesType-${t.id}`, + })), + }, ]} /> diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index 1fc617ce91fe5..1d678ef902991 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -208,20 +208,20 @@ export const getXyVisualization = ({ return state; }, - appendLayer(state, layerId, layerType, indexPatternId, extraArg) { + appendLayer(state, layerId, layerType, indexPatternId, extraArg, seriesType) { if (layerType === 'metricTrendline') { return state; } - const firstUsedSeriesType = getDataLayers(state.layers)?.[0]?.seriesType; return { ...state, layers: [ ...state.layers, newLayerState({ - seriesType: firstUsedSeriesType || state.preferredSeriesType, layerId, layerType, + seriesType: + seriesType || getDataLayers(state.layers)?.[0]?.seriesType || state.preferredSeriesType, indexPatternId, extraArg, }), @@ -734,7 +734,7 @@ export const getXyVisualization = ({ { + addLayer={async (type, loadedGroupInfo, _, seriesType) => { if (type === LayerTypes.ANNOTATIONS && loadedGroupInfo) { await props.ensureIndexPattern( loadedGroupInfo.dataViewSpec ?? loadedGroupInfo.indexPatternId @@ -745,8 +745,7 @@ export const getXyVisualization = ({ group: loadedGroupInfo, }); } - - props.addLayer(type, loadedGroupInfo, !!loadedGroupInfo); + props.addLayer(type, loadedGroupInfo, !!loadedGroupInfo, seriesType); }} /> ); diff --git a/x-pack/test/functional/apps/lens/group1/smokescreen.ts b/x-pack/test/functional/apps/lens/group1/smokescreen.ts index a9b491ebe47fa..befed343f1295 100644 --- a/x-pack/test/functional/apps/lens/group1/smokescreen.ts +++ b/x-pack/test/functional/apps/lens/group1/smokescreen.ts @@ -164,7 +164,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { field: 'bytes', }); - await PageObjects.lens.createLayer(); + await PageObjects.lens.createLayer('data', undefined, 'bar'); + expect(await PageObjects.lens.getLayerType(1)).to.eql('Bar vertical'); + await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', operation: 'terms', diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 8fd1b6e604548..43e238acf6ecb 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -988,7 +988,8 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont */ async createLayer( layerType: 'data' | 'referenceLine' | 'annotations' = 'data', - annotationFromLibraryTitle?: string + annotationFromLibraryTitle?: string, + seriesType = 'bar_stacked' ) { await testSubjects.click('lnsLayerAddButton'); const layerCount = await this.getLayerCount(); @@ -1003,6 +1004,9 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont if (await testSubjects.exists(`lnsLayerAddButton-${layerType}`)) { await testSubjects.click(`lnsLayerAddButton-${layerType}`); + if (layerType === 'data') { + await testSubjects.click(`lnsXY_seriesType-${seriesType}`); + } if (layerType === 'annotations') { if (!annotationFromLibraryTitle) { await testSubjects.click('lnsAnnotationLayer_new'); diff --git a/x-pack/test/localization/tests/lens/smokescreen.ts b/x-pack/test/localization/tests/lens/smokescreen.ts index 85dd1e18d83ea..afd0822290f2c 100644 --- a/x-pack/test/localization/tests/lens/smokescreen.ts +++ b/x-pack/test/localization/tests/lens/smokescreen.ts @@ -336,7 +336,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { field: 'bytes', }); - await PageObjects.lens.createLayer(); + await PageObjects.lens.createLayer('data', undefined, 'bar'); + expect(await PageObjects.lens.getLayerType(1)).to.eql(termTranslator('bar')); await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', operation: 'terms', diff --git a/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts b/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts index 571a57e25f450..5dfeb08bbc5ad 100644 --- a/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts +++ b/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts @@ -302,7 +302,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { field: 'bytes', }); - await PageObjects.lens.createLayer(); + await PageObjects.lens.createLayer('data', undefined, 'bar'); + expect(await PageObjects.lens.getLayerType(1)).to.eql('Bar vertical'); await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', From aea8060ba69eb4370233957687805f0b5eed713a Mon Sep 17 00:00:00 2001 From: Jon Date: Thu, 4 Apr 2024 13:50:43 -0500 Subject: [PATCH 05/69] Upgrade Node.js to 20.12.1 (#180073) https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V20.md#20.12.1 --- .node-version | 2 +- .nvmrc | 2 +- WORKSPACE.bazel | 12 ++++++------ docs/developer/advanced/upgrading-nodejs.asciidoc | 4 ++-- package.json | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.node-version b/.node-version index 2dbbe00e679a2..bc78e9f2695ea 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -20.11.1 +20.12.1 diff --git a/.nvmrc b/.nvmrc index 2dbbe00e679a2..bc78e9f2695ea 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.11.1 +20.12.1 diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 35c8ec6bd0154..b004b39853292 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -22,13 +22,13 @@ load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "yarn_install # Setup the Node.js toolchain for the architectures we want to support node_repositories( node_repositories = { - "20.11.1-darwin_amd64": ("node-v20.11.1-darwin-x64.tar.gz", "node-v20.11.1-darwin-x64", "c52e7fb0709dbe63a4cbe08ac8af3479188692937a7bd8e776e0eedfa33bb848"), - "20.11.1-darwin_arm64": ("node-v20.11.1-darwin-arm64.tar.gz", "node-v20.11.1-darwin-arm64", "e0065c61f340e85106a99c4b54746c5cee09d59b08c5712f67f99e92aa44995d"), - "20.11.1-linux_arm64": ("node-v20.11.1-linux-arm64.tar.xz", "node-v20.11.1-linux-arm64", "36bac185164aa11940715425da1db2ec46e3354325bda9ee0b98b4a607aa0d8b"), - "20.11.1-linux_amd64": ("node-v20.11.1-linux-x64.tar.xz", "node-v20.11.1-linux-x64", "e2c39cb70b9ff79575a02747dd1e89917817cce05da21bef6b94eb9e92442024"), - "20.11.1-windows_amd64": ("node-v20.11.1-win-x64.zip", "node-v20.11.1-win-x64", "bc032628d77d206ffa7f133518a6225a9c5d6d9210ead30d67e294ff37044bda"), + "20.12.1-darwin_amd64": ("node-v20.12.1-darwin-x64.tar.gz", "node-v20.12.1-darwin-x64", "f5dc3c71c87c58c9b019d9f85302db3a6a6c47167c5a0480b697f153d02ac316"), + "20.12.1-darwin_arm64": ("node-v20.12.1-darwin-arm64.tar.gz", "node-v20.12.1-darwin-arm64", "65df8cb0724e3a58c7757b75a70cc1057e1f67ffc5e852bfe6241de0b37c70a0"), + "20.12.1-linux_arm64": ("node-v20.12.1-linux-arm64.tar.xz", "node-v20.12.1-linux-arm64", "903a0f94312ba819f16a133e9dc378db128804ff45ea69e11af7152c303e8a85"), + "20.12.1-linux_amd64": ("node-v20.12.1-linux-x64.tar.xz", "node-v20.12.1-linux-x64", "e43b54ecea97b4419a5526af57bcf4f22a3d5583e1b2cacf461da71b9ba2befe"), + "20.12.1-windows_amd64": ("node-v20.12.1-win-x64.zip", "node-v20.12.1-win-x64", "629e2619ef88c5a8ce9944201f00ca3124f079c43ceef7ab0826c6fd19e09d75"), }, - node_version = "20.11.1", + node_version = "20.12.1", node_urls = [ "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v{version}/{filename}", ], diff --git a/docs/developer/advanced/upgrading-nodejs.asciidoc b/docs/developer/advanced/upgrading-nodejs.asciidoc index dea7c55704299..546d5ae46f164 100644 --- a/docs/developer/advanced/upgrading-nodejs.asciidoc +++ b/docs/developer/advanced/upgrading-nodejs.asciidoc @@ -19,7 +19,7 @@ These files must be updated when upgrading Node.js: - {kib-repo}blob/{branch}/WORKSPACE.bazel[`WORKSPACE.bazel`] - The version is specified in the `node_version` property. Besides this property, the list of files under `node_repositories` must be updated along with their respective SHA256 hashes. These can be found in the `SHASUMS256.txt` file inside the public `kibana-custom-node-artifacts` GCP bucket. - Example for Node.js v20.11.1: https://storage.googleapis.com/kibana-custom-node-artifacts/node-glibc-217/dist/v20.11.1/SHASUMS256.txt[kibana-custom-node-artifacts/node-glibc-217/dist/v20.11.1/SHASUMS256.txt] + Example for Node.js v20.12.1: https://storage.googleapis.com/kibana-custom-node-artifacts/node-glibc-217/dist/v20.12.1/SHASUMS256.txt[kibana-custom-node-artifacts/node-glibc-217/dist/v20.12.1/SHASUMS256.txt] See PR {kib-repo}pull/128123[#128123] for an example of how the Node.js version has been upgraded previously. @@ -43,7 +43,7 @@ The only difference between the offical Node.js build and our custom build, is t ==== How to start a new build To generate a new custom Node.js build, https://buildkite.com/elastic/kibana-custom-node-dot-js-builds#new[start a new build] on our dedicated Buildkite pipeline (requires Elastic employee permissions). -Give it a clear name (e.g. `Node 20.11.1`) and remember so set the custom `OVERRIDE_TARGET_VERSION` environment variable to the desired Node.js version - e.g. `OVERRIDE_TARGET_VERSION=20.11.1`. +Give it a clear name (e.g. `Node 20.12.1`) and remember so set the custom `OVERRIDE_TARGET_VERSION` environment variable to the desired Node.js version - e.g. `OVERRIDE_TARGET_VERSION=20.12.1`. You find the "Environment Variables" field by expanding "Options >" in the "New Build" dialog. === Backporting diff --git a/package.json b/package.json index 4de6107e135e6..6d5c35cb129ed 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "url": "https://github.com/elastic/kibana.git" }, "engines": { - "node": "20.11.1", + "node": "20.12.1", "yarn": "^1.22.19" }, "resolutions": { From bad32f90f54f0d9637b6c3a869901fe25ff5b725 Mon Sep 17 00:00:00 2001 From: Sean Story Date: Thu, 4 Apr 2024 13:56:58 -0500 Subject: [PATCH 06/69] Relabel added->upserted, removed->deleted, removed total (#179755) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary closes https://github.com/elastic/connectors/issues/2315 This changes the displayed labels for a few connector metrics. "Added" -> "Upserted". This is intended to make more clear that the count doesn't necessarily mean "new documents" but is a union of new docs and doc updates. "Removed" -> "Deleted". This just aligns verbiage between our overview page and our event log flyout. "Total" -> "". This number was confusing to users because it wasn't clear that it was a total _from a specific point in time_ and may not still have any bearing on current state. It will remain in the backend for troubleshooting, but has been removed from the event log view. Screenshot 2024-04-01 at 11 32 44 AM Screenshot 2024-04-01 at 11 33 03 AM ### Checklist - [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 --- .../__snapshots__/documents_panel.test.tsx.snap | 8 ++------ .../components/sync_jobs/documents_panel.tsx | 11 ++--------- .../components/sync_jobs/sync_job_flyout.tsx | 1 - .../components/sync_jobs/sync_jobs_table.tsx | 2 +- x-pack/plugins/translations/translations/fr-FR.json | 1 - x-pack/plugins/translations/translations/ja-JP.json | 1 - x-pack/plugins/translations/translations/zh-CN.json | 1 - 7 files changed, 5 insertions(+), 20 deletions(-) diff --git a/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap b/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap index da48c7e846733..e29361b08a9c1 100644 --- a/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap +++ b/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap @@ -9,15 +9,11 @@ exports[`DocumentsPanel renders 1`] = ` Array [ Object { "field": "added", - "name": "Added", + "name": "Upserted", }, Object { "field": "removed", - "name": "Removed", - }, - Object { - "field": "total", - "name": "Total", + "name": "Deleted", }, Object { "field": "volume", diff --git a/packages/kbn-search-connectors/components/sync_jobs/documents_panel.tsx b/packages/kbn-search-connectors/components/sync_jobs/documents_panel.tsx index 92189ece90da9..0bfe917d3aa01 100644 --- a/packages/kbn-search-connectors/components/sync_jobs/documents_panel.tsx +++ b/packages/kbn-search-connectors/components/sync_jobs/documents_panel.tsx @@ -17,7 +17,6 @@ import { FlyoutPanel } from './flyout_panel'; interface SyncJobDocumentsPanelProps { added: number; removed: number; - total: number; volume: number; } @@ -26,19 +25,13 @@ export const SyncJobDocumentsPanel: React.FC = (sync { field: 'added', name: i18n.translate('searchConnectors.index.syncJobs.documents.added', { - defaultMessage: 'Added', + defaultMessage: 'Upserted', }), }, { field: 'removed', name: i18n.translate('searchConnectors.index.syncJobs.documents.removed', { - defaultMessage: 'Removed', - }), - }, - { - field: 'total', - name: i18n.translate('searchConnectors.index.syncJobs.documents.total', { - defaultMessage: 'Total', + defaultMessage: 'Deleted', }), }, { diff --git a/packages/kbn-search-connectors/components/sync_jobs/sync_job_flyout.tsx b/packages/kbn-search-connectors/components/sync_jobs/sync_job_flyout.tsx index 07d635adf5ec3..30101b55ec81f 100644 --- a/packages/kbn-search-connectors/components/sync_jobs/sync_job_flyout.tsx +++ b/packages/kbn-search-connectors/components/sync_jobs/sync_job_flyout.tsx @@ -76,7 +76,6 @@ export const SyncJobFlyout: React.FC = ({ onClose, syncJob } diff --git a/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx b/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx index e55c286f7b58b..7426d7dad3dec 100644 --- a/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx +++ b/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx @@ -63,7 +63,7 @@ export const SyncJobsTable: React.FC = ({ { field: 'indexed_document_count', name: i18n.translate('searchConnectors.searchIndices.addedDocs.columnTitle', { - defaultMessage: 'Docs added', + defaultMessage: 'Docs upserted', }), sortable: true, truncateText: true, diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 90104a4663582..58af3a0dbd9d9 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -5581,7 +5581,6 @@ "searchConnectors.index.syncJobs.documents.added": "Ajouté", "searchConnectors.index.syncJobs.documents.removed": "Retiré", "searchConnectors.index.syncJobs.documents.title": "Documents", - "searchConnectors.index.syncJobs.documents.total": "Total", "searchConnectors.index.syncJobs.documents.value": "Valeur", "searchConnectors.index.syncJobs.documents.volume": "Volume", "searchConnectors.index.syncJobs.documents.volume.lessThanOneMBLabel": "Inférieur à 1 Mo", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 01cd7275c866a..4918a1045616d 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -5574,7 +5574,6 @@ "searchConnectors.index.syncJobs.documents.added": "追加", "searchConnectors.index.syncJobs.documents.removed": "削除しました", "searchConnectors.index.syncJobs.documents.title": "ドキュメント", - "searchConnectors.index.syncJobs.documents.total": "合計", "searchConnectors.index.syncJobs.documents.value": "値", "searchConnectors.index.syncJobs.documents.volume": "量", "searchConnectors.index.syncJobs.documents.volume.lessThanOneMBLabel": "1mb未満", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index b29ac4795d310..673ab2ba535a4 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -5585,7 +5585,6 @@ "searchConnectors.index.syncJobs.documents.added": "已添加", "searchConnectors.index.syncJobs.documents.removed": "已移除", "searchConnectors.index.syncJobs.documents.title": "文档", - "searchConnectors.index.syncJobs.documents.total": "合计", "searchConnectors.index.syncJobs.documents.value": "值", "searchConnectors.index.syncJobs.documents.volume": "卷", "searchConnectors.index.syncJobs.documents.volume.lessThanOneMBLabel": "小于 1mb", From f385496a40e6cf283b5fdcf2d9be0ea512336198 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Thu, 4 Apr 2024 15:16:11 -0400 Subject: [PATCH 07/69] [Search] introduce notebooks plugin (#179870) ## Summary Introduced the search_notebooks plugin which has a set of default python notebooks that can be served to the frontend via API endpoints. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + docs/developer/plugin-list.asciidoc | 4 + package.json | 1 + tsconfig.base.json | 2 + x-pack/.i18nrc.json | 1 + x-pack/plugins/search_notebooks/README.mdx | 3 + .../plugins/search_notebooks/common/index.ts | 9 + .../plugins/search_notebooks/jest.config.js | 17 + x-pack/plugins/search_notebooks/kibana.jsonc | 19 + x-pack/plugins/search_notebooks/package.json | 11 + .../scripts/download_notebooks.sh | 40 + .../search_notebooks/scripts/notebooks.txt | 5 + .../plugins/search_notebooks/server/config.ts | 23 + .../server/data/00_quick_start.json | 599 ++++++++++++ .../data/01_keyword_querying_filtering.json | 912 ++++++++++++++++++ .../server/data/02_hybrid_search.json | 306 ++++++ .../server/data/03_elser.json | 552 +++++++++++ .../server/data/04_multilingual.json | 666 +++++++++++++ .../plugins/search_notebooks/server/index.ts | 18 + .../server/lib/notebook_catalog.test.ts | 53 + .../server/lib/notebook_catalog.ts | 115 +++ .../plugins/search_notebooks/server/plugin.ts | 48 + .../search_notebooks/server/routes/index.ts | 62 ++ .../plugins/search_notebooks/server/types.ts | 89 ++ x-pack/plugins/search_notebooks/tsconfig.json | 23 + yarn.lock | 4 + 26 files changed, 3583 insertions(+) create mode 100755 x-pack/plugins/search_notebooks/README.mdx create mode 100644 x-pack/plugins/search_notebooks/common/index.ts create mode 100644 x-pack/plugins/search_notebooks/jest.config.js create mode 100644 x-pack/plugins/search_notebooks/kibana.jsonc create mode 100644 x-pack/plugins/search_notebooks/package.json create mode 100755 x-pack/plugins/search_notebooks/scripts/download_notebooks.sh create mode 100644 x-pack/plugins/search_notebooks/scripts/notebooks.txt create mode 100644 x-pack/plugins/search_notebooks/server/config.ts create mode 100644 x-pack/plugins/search_notebooks/server/data/00_quick_start.json create mode 100644 x-pack/plugins/search_notebooks/server/data/01_keyword_querying_filtering.json create mode 100644 x-pack/plugins/search_notebooks/server/data/02_hybrid_search.json create mode 100644 x-pack/plugins/search_notebooks/server/data/03_elser.json create mode 100644 x-pack/plugins/search_notebooks/server/data/04_multilingual.json create mode 100644 x-pack/plugins/search_notebooks/server/index.ts create mode 100644 x-pack/plugins/search_notebooks/server/lib/notebook_catalog.test.ts create mode 100644 x-pack/plugins/search_notebooks/server/lib/notebook_catalog.ts create mode 100644 x-pack/plugins/search_notebooks/server/plugin.ts create mode 100644 x-pack/plugins/search_notebooks/server/routes/index.ts create mode 100644 x-pack/plugins/search_notebooks/server/types.ts create mode 100644 x-pack/plugins/search_notebooks/tsconfig.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 158c177c50761..9e6bca0b54433 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -692,6 +692,7 @@ x-pack/plugins/search_connectors @elastic/enterprise-search-frontend packages/kbn-search-errors @elastic/kibana-data-discovery examples/search_examples @elastic/kibana-data-discovery packages/kbn-search-index-documents @elastic/enterprise-search-frontend +x-pack/plugins/search_notebooks @elastic/enterprise-search-frontend x-pack/plugins/search_playground @elastic/enterprise-search-frontend packages/kbn-search-response-warnings @elastic/kibana-data-discovery x-pack/plugins/searchprofiler @elastic/kibana-management diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 472ad01dc9ce1..3bbc594a21c5a 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -757,6 +757,10 @@ It uses Chromium and Puppeteer underneath to run the browser in headless mode. |This plugin contains common assets and endpoints for the use of connectors in Kibana. Primarily used by the enterprise_search and serverless_search plugins. +|{kib-repo}blob/{branch}/x-pack/plugins/search_notebooks/README.mdx[searchNotebooks] +|This plugin contains endpoints and components for rendering search python notebooks in the persistent dev console. + + |{kib-repo}blob/{branch}/x-pack/plugins/search_playground/README.md[searchPlayground] |The Search Playground is a tool for developers to experiment with their own data using LLMs. diff --git a/package.json b/package.json index 6d5c35cb129ed..cc68dcb4c6601 100644 --- a/package.json +++ b/package.json @@ -696,6 +696,7 @@ "@kbn/search-errors": "link:packages/kbn-search-errors", "@kbn/search-examples-plugin": "link:examples/search_examples", "@kbn/search-index-documents": "link:packages/kbn-search-index-documents", + "@kbn/search-notebooks": "link:x-pack/plugins/search_notebooks", "@kbn/search-playground": "link:x-pack/plugins/search_playground", "@kbn/search-response-warnings": "link:packages/kbn-search-response-warnings", "@kbn/searchprofiler-plugin": "link:x-pack/plugins/searchprofiler", diff --git a/tsconfig.base.json b/tsconfig.base.json index 7ce776eaa9ac0..fef6173947031 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1378,6 +1378,8 @@ "@kbn/search-examples-plugin/*": ["examples/search_examples/*"], "@kbn/search-index-documents": ["packages/kbn-search-index-documents"], "@kbn/search-index-documents/*": ["packages/kbn-search-index-documents/*"], + "@kbn/search-notebooks": ["x-pack/plugins/search_notebooks"], + "@kbn/search-notebooks/*": ["x-pack/plugins/search_notebooks/*"], "@kbn/search-playground": ["x-pack/plugins/search_playground"], "@kbn/search-playground/*": ["x-pack/plugins/search_playground/*"], "@kbn/search-response-warnings": ["packages/kbn-search-response-warnings"], diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 04e968a7f9b5c..98a4912804d1e 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -107,6 +107,7 @@ ], "xpack.runtimeFields": "plugins/runtime_fields", "xpack.screenshotting": "plugins/screenshotting", + "xpack.searchNotebooks": "plugins/search_notebooks", "xpack.searchPlayground": "plugins/search_playground", "xpack.searchProfiler": "plugins/searchprofiler", "xpack.security": "plugins/security", diff --git a/x-pack/plugins/search_notebooks/README.mdx b/x-pack/plugins/search_notebooks/README.mdx new file mode 100755 index 0000000000000..c1429a0c598ab --- /dev/null +++ b/x-pack/plugins/search_notebooks/README.mdx @@ -0,0 +1,3 @@ +# Search Notebooks plugin + +This plugin contains endpoints and components for rendering search python notebooks in the persistent dev console. diff --git a/x-pack/plugins/search_notebooks/common/index.ts b/x-pack/plugins/search_notebooks/common/index.ts new file mode 100644 index 0000000000000..8a2a062f51aa0 --- /dev/null +++ b/x-pack/plugins/search_notebooks/common/index.ts @@ -0,0 +1,9 @@ +/* + * 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 PLUGIN_ID = 'searchNotebooks'; +export const PLUGIN_NAME = 'searchNotebooks'; diff --git a/x-pack/plugins/search_notebooks/jest.config.js b/x-pack/plugins/search_notebooks/jest.config.js new file mode 100644 index 0000000000000..ff4a9e41f1b1a --- /dev/null +++ b/x-pack/plugins/search_notebooks/jest.config.js @@ -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: ['/x-pack/plugins/search_notebooks'], + coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/search_notebooks', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/x-pack/plugins/search_notebooks/{common,public,server}/**/*.{ts,tsx}', + ], +}; diff --git a/x-pack/plugins/search_notebooks/kibana.jsonc b/x-pack/plugins/search_notebooks/kibana.jsonc new file mode 100644 index 0000000000000..d3f671c90e322 --- /dev/null +++ b/x-pack/plugins/search_notebooks/kibana.jsonc @@ -0,0 +1,19 @@ +{ + "type": "plugin", + "id": "@kbn/search-notebooks", + "owner": "@elastic/enterprise-search-frontend", + "description": "Plugin to provide access to and rendering of python notebooks for use in the persistent developer console.", + "plugin": { + "id": "searchNotebooks", + "server": true, + "browser": false, + "configPath": [ + "xpack", + "search", + "notebooks" + ], + "requiredPlugins": [], + "optionalPlugins": [], + "requiredBundles": [] + } +} diff --git a/x-pack/plugins/search_notebooks/package.json b/x-pack/plugins/search_notebooks/package.json new file mode 100644 index 0000000000000..a81945be3c7ad --- /dev/null +++ b/x-pack/plugins/search_notebooks/package.json @@ -0,0 +1,11 @@ +{ + "name": "@kbn/search-notebooks", + "version": "1.0.0", + "license": "Elastic License 2.0", + "private": true, + "scripts": { + "build": "yarn plugin-helpers build", + "plugin-helpers": "node ../../../scripts/plugin_helpers", + "kbn": "node ../../../scripts/kbn" + } +} diff --git a/x-pack/plugins/search_notebooks/scripts/download_notebooks.sh b/x-pack/plugins/search_notebooks/scripts/download_notebooks.sh new file mode 100755 index 0000000000000..11bf594695fc3 --- /dev/null +++ b/x-pack/plugins/search_notebooks/scripts/download_notebooks.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +SCRIPT_DIR="$(dirname -- "$0")" +URL_FILE="$SCRIPT_DIR/notebooks.txt" +DATA_DIR="$SCRIPT_DIR/../server/data" + +echo "Saving notebooks to $DATA_DIR" + +# Check if the DATA_DIR exists, if not, create it +if [ ! -d "$DATA_DIR" ]; then + echo "Creating directory $DATA_DIR" + mkdir -p "$DATA_DIR" +fi + +# Check if the URL file exists +if [ ! -f "$URL_FILE" ]; then + echo "URL file does not exist: $URL_FILE" + exit 1 +fi + +# Read each line from the URL file +while IFS= read -r url; do + if [ -z "$url" ]; then + # Skip empty lines + continue + fi + + echo "Downloading: $url" + # Extract the filename from the URL + full_filename=$(basename "$url") + filename="${full_filename%.*}" + # Convert filename to snake case + # This replaces non-alphanumeric characters with underscores and lowercases the result + snake_case_filename=$(echo "$filename" | sed -r 's/[^a-zA-Z0-9]+/_/g' | tr '[:upper:]' '[:lower:]') + + # Use curl to download the file. -L follows redirects, and -o specifies the output file path. + curl -L "$url" -o "$DATA_DIR/$snake_case_filename.json" +done < "$URL_FILE" + +echo "Download completed." diff --git a/x-pack/plugins/search_notebooks/scripts/notebooks.txt b/x-pack/plugins/search_notebooks/scripts/notebooks.txt new file mode 100644 index 0000000000000..889e18263dd3e --- /dev/null +++ b/x-pack/plugins/search_notebooks/scripts/notebooks.txt @@ -0,0 +1,5 @@ +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/00-quick-start.ipynb +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/01-keyword-querying-filtering.ipynb +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/02-hybrid-search.ipynb +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/03-ELSER.ipynb +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/04-multilingual.ipynb diff --git a/x-pack/plugins/search_notebooks/server/config.ts b/x-pack/plugins/search_notebooks/server/config.ts new file mode 100644 index 0000000000000..9e2651a1d76ae --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/config.ts @@ -0,0 +1,23 @@ +/* + * 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'; + +export * from './types'; + +const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: false }), +}); + +type SearchNotebooksSchema = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; + +export type SearchNotebooksConfig = TypeOf; diff --git a/x-pack/plugins/search_notebooks/server/data/00_quick_start.json b/x-pack/plugins/search_notebooks/server/data/00_quick_start.json new file mode 100644 index 0000000000000..3462ab9ff5f10 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/00_quick_start.json @@ -0,0 +1,599 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "87773ce7", + "metadata": { + "id": "87773ce7" + }, + "source": [ + "# Semantic search quick start\n", + "\n", + "\"Open\n", + "\n", + "This interactive notebook will introduce you to some basic operations with Elasticsearch, using the official [Elasticsearch Python client](https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html).\n", + "You'll perform semantic search using [Sentence Transformers](https://www.sbert.net) for text embedding. Learn how to integrate traditional text-based search with semantic search, for a hybrid search system." + ] + }, + { + "cell_type": "markdown", + "id": "a32202e2", + "metadata": { + "id": "a32202e2" + }, + "source": [ + "## Create Elastic Cloud deployment\n", + "\n", + "If you don't have an Elastic Cloud deployment, sign up [here](https://cloud.elastic.co/registration?utm_source=github&utm_content=elasticsearch-labs-notebook) for a free trial.\n", + "\n", + "Once logged in to your Elastic Cloud account, go to the [Create deployment](https://cloud.elastic.co/deployments/create) page and select **Create deployment**. Leave all settings with their default values." + ] + }, + { + "cell_type": "markdown", + "id": "52a6a607", + "metadata": { + "id": "52a6a607" + }, + "source": [ + "## Install packages and import modules\n", + "\n", + "To get started, we'll need to connect to our Elastic deployment using the Python client.\n", + "Because we're using an Elastic Cloud deployment, we'll use the **Cloud ID** to identify our deployment.\n", + "\n", + "First we need to install the `elasticsearch` Python client." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffc5fa6f", + "metadata": { + "id": "ffc5fa6f" + }, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch sentence-transformers" + ] + }, + { + "cell_type": "markdown", + "id": "28AH8LhI-0UD", + "metadata": { + "id": "28AH8LhI-0UD" + }, + "source": [ + "# Setup the Embedding Model\n", + "\n", + "For this example, we're using `all-MiniLM-L6-v2`, part of the `sentence_transformers` library. You can read more about this model on [Huggingface](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "WHC3hHGW-wbI", + "metadata": { + "id": "WHC3hHGW-wbI" + }, + "outputs": [], + "source": [ + "from sentence_transformers import SentenceTransformer\n", + "\n", + "model = SentenceTransformer(\"all-MiniLM-L6-v2\")" + ] + }, + { + "cell_type": "markdown", + "id": "0241694c", + "metadata": { + "id": "0241694c" + }, + "source": [ + "## Initialize the Elasticsearch client\n", + "\n", + "Now we can instantiate the [Elasticsearch python client](https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/index.html), providing the cloud id and password in your deployment." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f38e0397", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f38e0397", + "outputId": "ad6df489-d242-4229-a42a-39c5ca19d124" + }, + "outputs": [], + "source": [ + "from elasticsearch import Elasticsearch\n", + "from getpass import getpass\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id\n", + "ELASTIC_CLOUD_ID = getpass(\"Elastic Cloud ID: \")\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key\n", + "ELASTIC_API_KEY = getpass(\"Elastic Api Key: \")\n", + "\n", + "# Create the client instance\n", + "client = Elasticsearch(\n", + " # For local development\n", + " # hosts=[\"http://localhost:9200\"]\n", + " cloud_id=ELASTIC_CLOUD_ID,\n", + " api_key=ELASTIC_API_KEY,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "fcd165fa", + "metadata": { + "id": "fcd165fa" + }, + "source": [ + "If you're running Elasticsearch locally or self-managed, you can pass in the Elasticsearch host instead. [Read more](https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#_verifying_https_with_certificate_fingerprints_python_3_10_or_later) on how to connect to Elasticsearch locally." + ] + }, + { + "cell_type": "markdown", + "id": "1462ebd8", + "metadata": { + "id": "1462ebd8" + }, + "source": [ + "Confirm that the client has connected with this test." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "25c618eb", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "25c618eb", + "outputId": "30a6ba5b-5109-4457-ddfe-5633a077ca9b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'name': 'instance-0000000011', 'cluster_name': 'd1bd36862ce54c7b903e2aacd4cd7f0a', 'cluster_uuid': 'tIkh0X_UQKmMFQKSfUw-VQ', 'version': {'number': '8.9.0', 'build_flavor': 'default', 'build_type': 'docker', 'build_hash': '8aa461beb06aa0417a231c345a1b8c38fb498a0d', 'build_date': '2023-07-19T14:43:58.555259655Z', 'build_snapshot': False, 'lucene_version': '9.7.0', 'minimum_wire_compatibility_version': '7.17.0', 'minimum_index_compatibility_version': '7.0.0'}, 'tagline': 'You Know, for Search'}\n" + ] + } + ], + "source": [ + "print(client.info())" + ] + }, + { + "cell_type": "markdown", + "id": "61e1e6d8", + "metadata": { + "id": "61e1e6d8" + }, + "source": [ + "## Index some test data\n", + "\n", + "Our client is set up and connected to our Elastic deployment.\n", + "Now we need some data to test out the basics of Elasticsearch queries.\n", + "We'll use a small index of books with the following fields:\n", + "\n", + "- `title`\n", + "- `authors`\n", + "- `publish_date`\n", + "- `num_reviews`\n", + "- `publisher`\n", + "\n", + "### Create an index\n", + "\n", + "First ensure that you do not have a previously created index with the name `book_index`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "_OAahfg-tqrf", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_OAahfg-tqrf", + "outputId": "d8f81ba4-cdc9-4e30-edf7-6d5bb16920eb" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'acknowledged': True})" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.indices.delete(index=\"book_index\", ignore_unavailable=True)" + ] + }, + { + "cell_type": "markdown", + "id": "064b761a-565d-42f4-9b4a-4df4f190fd3b", + "metadata": {}, + "source": [ + "🔐 NOTE: at any time you can come back to this section and run the `delete` function above to remove your index and start from scratch.\n", + "\n", + "Let's create an Elasticsearch index with the correct mappings for our test data. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6bc95238", + "metadata": { + "id": "6bc95238" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'acknowledged': True, 'shards_acknowledged': True, 'index': 'book_index'})" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Define the mapping\n", + "mappings = {\n", + " \"properties\": {\n", + " \"title_vector\": {\n", + " \"type\": \"dense_vector\",\n", + " \"dims\": 384,\n", + " \"index\": \"true\",\n", + " \"similarity\": \"cosine\",\n", + " }\n", + " }\n", + "}\n", + "\n", + "# Create the index\n", + "client.indices.create(index=\"book_index\", mappings=mappings)" + ] + }, + { + "cell_type": "markdown", + "id": "075f5eb6", + "metadata": { + "id": "075f5eb6" + }, + "source": [ + "### Index test data\n", + "\n", + "Run the following command to upload some test data, containing information about 10 popular programming books from this [dataset](https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/data.json).\n", + "`model.encode` will encode the text into a vector on the fly, using the model we initialized earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "008d723e", + "metadata": { + "id": "008d723e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'took': 49, 'errors': False, 'items': [{'index': {'_index': 'book_index', '_id': 'HwOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'IAOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 1, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'IQOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 2, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'IgOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 3, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'IwOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 4, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'JAOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 5, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'JQOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 6, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'JgOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 7, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'JwOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 8, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'KAOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 9, '_primary_term': 1, 'status': 201}}]})" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import json\n", + "from urllib.request import urlopen\n", + "\n", + "url = \"https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/data.json\"\n", + "response = urlopen(url)\n", + "books = json.loads(response.read())\n", + "\n", + "operations = []\n", + "for book in books:\n", + " operations.append({\"index\": {\"_index\": \"book_index\"}})\n", + " # Transforming the title into an embedding using the model\n", + " book[\"title_vector\"] = model.encode(book[\"title\"]).tolist()\n", + " operations.append(book)\n", + "client.bulk(index=\"book_index\", operations=operations, refresh=True)" + ] + }, + { + "cell_type": "markdown", + "id": "cd8b03e0", + "metadata": { + "id": "cd8b03e0" + }, + "source": [ + "## Aside: Pretty printing Elasticsearch responses\n", + "\n", + "Your API calls will return hard-to-read nested JSON.\n", + "We'll create a little function called `pretty_response` to return nice, human-readable outputs from our examples." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "f12ce2c9", + "metadata": { + "id": "f12ce2c9" + }, + "outputs": [], + "source": [ + "def pretty_response(response):\n", + " if len(response[\"hits\"][\"hits\"]) == 0:\n", + " print(\"Your search returned no results.\")\n", + " else:\n", + " for hit in response[\"hits\"][\"hits\"]:\n", + " id = hit[\"_id\"]\n", + " publication_date = hit[\"_source\"][\"publish_date\"]\n", + " score = hit[\"_score\"]\n", + " title = hit[\"_source\"][\"title\"]\n", + " summary = hit[\"_source\"][\"summary\"]\n", + " publisher = hit[\"_source\"][\"publisher\"]\n", + " num_reviews = hit[\"_source\"][\"num_reviews\"]\n", + " authors = hit[\"_source\"][\"authors\"]\n", + " pretty_output = f\"\\nID: {id}\\nPublication date: {publication_date}\\nTitle: {title}\\nSummary: {summary}\\nPublisher: {publisher}\\nReviews: {num_reviews}\\nAuthors: {authors}\\nScore: {score}\"\n", + " print(pretty_output)" + ] + }, + { + "cell_type": "markdown", + "id": "39bdefe0", + "metadata": { + "id": "39bdefe0" + }, + "source": [ + "## Making queries\n", + "\n", + "Now that we have indexed the books, we want to perform a semantic search for books that are similar to a given query.\n", + "We embed the query and perform a search." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "Df7hwcIjYwMT", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Df7hwcIjYwMT", + "outputId": "e63884d7-d4a5-4f5d-ea43-fc2f0793f040" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 0.80428284\n", + "\n", + "ID: IwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2015-03-27\n", + "Title: You Don't Know JS: Up & Going\n", + "Summary: Introduction to JavaScript and programming as a whole\n", + "Publisher: oreilly\n", + "Reviews: 36\n", + "Authors: ['kyle simpson']\n", + "Score: 0.6989136\n", + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 0.6796988\n", + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 0.62065494\n", + "\n", + "ID: KAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2012-06-27\n", + "Title: Introduction to the Theory of Computation\n", + "Summary: Introduction to the theory of computation and complexity theory\n", + "Publisher: cengage learning\n", + "Reviews: 33\n", + "Authors: ['michael sipser']\n", + "Score: 0.6008769\n", + "\n", + "ID: JgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2011-05-13\n", + "Title: The Clean Coder: A Code of Conduct for Professional Programmers\n", + "Summary: A guide to professional conduct in the field of software engineering\n", + "Publisher: prentice hall\n", + "Reviews: 20\n", + "Authors: ['robert c. martin']\n", + "Score: 0.571234\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 0.56499225\n", + "\n", + "ID: IQOa7osBiUNHLMdf3q2r\n", + "Publication date: 2020-04-06\n", + "Title: Artificial Intelligence: A Modern Approach\n", + "Summary: Comprehensive introduction to the theory and practice of artificial intelligence\n", + "Publisher: pearson\n", + "Reviews: 39\n", + "Authors: ['stuart russell', 'peter norvig']\n", + "Score: 0.56054837\n", + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 0.54226947\n", + "\n", + "ID: IAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-05-03\n", + "Title: Python Crash Course\n", + "Summary: A fast-paced, no-nonsense guide to programming in Python\n", + "Publisher: no starch press\n", + "Reviews: 42\n", + "Authors: ['eric matthes']\n", + "Score: 0.5254088\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " knn={\n", + " \"field\": \"title_vector\",\n", + " \"query_vector\": model.encode(\"javascript books\"),\n", + " \"k\": 10,\n", + " \"num_candidates\": 100,\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "id": "LdJCpbQMeml5", + "metadata": { + "id": "LdJCpbQMeml5" + }, + "source": [ + "## Filtering\n", + "\n", + "Filter context is mostly used for filtering structured data. For example, use filter context to answer questions like:\n", + "\n", + "- _Does this timestamp fall into the range 2015 to 2016?_\n", + "- _Is the status field set to \"published\"?_\n", + "\n", + "Filter context is in effect whenever a query clause is passed to a filter parameter, such as the `filter` or `must_not` parameters in a `bool` query.\n", + "\n", + "[Learn more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html#filter-context) about filter context in the Elasticsearch docs." + ] + }, + { + "cell_type": "markdown", + "id": "dRSrPMyFf7w7", + "metadata": { + "id": "dRSrPMyFf7w7" + }, + "source": [ + "### Example: Keyword Filtering\n", + "\n", + "This is an example of adding a keyword filter to the query.\n", + "\n", + "The example retrieves the top books that are similar to \"javascript books\" based on their title vectors, and also Addison-Wesley as publisher." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "WoE0yTchfj3A", + "metadata": { + "id": "WoE0yTchfj3A" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 0.62065494\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 0.56499225\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " knn={\n", + " \"field\": \"title_vector\",\n", + " \"query_vector\": model.encode(\"javascript books\"),\n", + " \"k\": 10,\n", + " \"num_candidates\": 100,\n", + " \"filter\": {\"term\": {\"publisher.keyword\": \"addison-wesley\"}},\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/x-pack/plugins/search_notebooks/server/data/01_keyword_querying_filtering.json b/x-pack/plugins/search_notebooks/server/data/01_keyword_querying_filtering.json new file mode 100644 index 0000000000000..84f1830ecebf0 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/01_keyword_querying_filtering.json @@ -0,0 +1,912 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "83LdOUCwwHzs" + }, + "source": [ + "# Keyword querying and filtering\n", + "\n", + "\"Open\n", + "\n", + "This interactive notebook will introduce you to the basic Elasticsearch queries, using the official Elasticsearch Python client. Before getting started on this section you should work through our [quick start](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb), as you will be using the same dataset." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Install and import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch pandas" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from elasticsearch import Elasticsearch\n", + "from getpass import getpass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create the client instance\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id\n", + "ELASTIC_CLOUD_ID = getpass(\"Elastic Cloud ID: \")\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key\n", + "ELASTIC_API_KEY = getpass(\"Elastic Api Key: \")\n", + "\n", + "# Create the client instance\n", + "client = Elasticsearch(\n", + " # For local development\n", + " # hosts=[\"http://localhost:9200\"]\n", + " cloud_id=ELASTIC_CLOUD_ID,\n", + " api_key=ELASTIC_API_KEY,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pretty printing Elasticsearch responses\n", + "\n", + "Let's add a helper function to print Elasticsearch responses in a readable format. This function is similar to the one that was used in the [quickstart](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb) guide." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def pretty_response(response):\n", + " if len(response[\"hits\"][\"hits\"]) == 0:\n", + " print(\"Your search returned no results.\")\n", + " else:\n", + " for hit in response[\"hits\"][\"hits\"]:\n", + " id = hit[\"_id\"]\n", + " publication_date = hit[\"_source\"][\"publish_date\"]\n", + " score = hit[\"_score\"]\n", + " title = hit[\"_source\"][\"title\"]\n", + " summary = hit[\"_source\"][\"summary\"]\n", + " publisher = hit[\"_source\"][\"publisher\"]\n", + " num_reviews = hit[\"_source\"][\"num_reviews\"]\n", + " authors = hit[\"_source\"][\"authors\"]\n", + " pretty_output = f\"\\nID: {id}\\nPublication date: {publication_date}\\nTitle: {title}\\nSummary: {summary}\\nPublisher: {publisher}\\nReviews: {num_reviews}\\nAuthors: {authors}\\nScore: {score}\"\n", + " print(pretty_output)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "22onltbgxxGm" + }, + "source": [ + "## Querying\n", + "🔐 NOTE: to run the queries that follow you need the `book_index` dataset from our [quick start](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb). If you haven't worked through the quick start, please follow the steps described there to create an Elasticsearch deployment with the dataset in it, and then come back to run the queries here.\n", + "\n", + "In the query context, a query clause answers the question _“How well does this document match this query clause?”_. In addition to deciding whether or not the document matches, the query clause also calculates a relevance score in the `_score `metadata field.\n", + "\n", + "### Full text queries\n", + "\n", + "Full text queries enable you to search analyzed text fields such as the body of an email. The query string is processed using the same analyzer that was applied to the field during indexing.\n", + "\n", + "* **match**.\n", + " The standard query for performing full text queries, including fuzzy matching and phrase or proximity queries.\n", + "* **multi-match**.\n", + " The multi-field version of the match query." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "clXQwoFQ6x61" + }, + "source": [ + "#### Match query\n", + "Returns documents that `match` a provided text, number, date or boolean value. The provided text is analyzed before matching.\n", + "\n", + "The `match` query is the standard query for performing a full-text search, including options for fuzzy matching.\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html#match-query-ex-request).\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "id": "q_OE0XVx6_qX", + "outputId": "6a1d7760-5fb9-4809-e060-e35a398ed3c4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 0.7042277\n", + "\n", + "ID: IAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-05-03\n", + "Title: Python Crash Course\n", + "Summary: A fast-paced, no-nonsense guide to programming in Python\n", + "Publisher: no starch press\n", + "Reviews: 42\n", + "Authors: ['eric matthes']\n", + "Score: 0.7042277\n", + "\n", + "ID: JgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2011-05-13\n", + "Title: The Clean Coder: A Code of Conduct for Professional Programmers\n", + "Summary: A guide to professional conduct in the field of software engineering\n", + "Publisher: prentice hall\n", + "Reviews: 20\n", + "Authors: ['robert c. martin']\n", + "Score: 0.6771651\n", + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 0.62883455\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 0.62883455\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"match\": {\"summary\": {\"query\": \"guide\"}}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H-n6hoVsfAqc" + }, + "source": [ + "#### Multi-match query\n", + "\n", + "The `multi_match` query builds on the match query to allow multi-field queries.\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 154 + }, + "id": "TRmGYM94gCtb", + "outputId": "dc58b19f-e585-4d0a-d065-ac3fc18ae123" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 2.0307527\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.7064086\n", + "\n", + "ID: IwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2015-03-27\n", + "Title: You Don't Know JS: Up & Going\n", + "Summary: Introduction to JavaScript and programming as a whole\n", + "Publisher: oreilly\n", + "Reviews: 36\n", + "Authors: ['kyle simpson']\n", + "Score: 1.6360576\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\"multi_match\": {\"query\": \"javascript\", \"fields\": [\"summary\", \"title\"]}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FnBeBIVKiPnS" + }, + "source": [ + "Individual fields can be boosted with the caret (^) notation. Note in the following query how the score of the results that have \"JavaScript\" in their title is multiplied." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 154 + }, + "id": "_aI7hnH0ixkG", + "outputId": "2af27f3d-f9fd-4c7a-cab5-7cb06132582c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 6.0922585\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 5.1192265\n", + "\n", + "ID: IwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2015-03-27\n", + "Title: You Don't Know JS: Up & Going\n", + "Summary: Introduction to JavaScript and programming as a whole\n", + "Publisher: oreilly\n", + "Reviews: 36\n", + "Authors: ['kyle simpson']\n", + "Score: 1.6360576\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\"multi_match\": {\"query\": \"javascript\", \"fields\": [\"summary\", \"title^3\"]}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yXipv0xSk-nK" + }, + "source": [ + "### Term-level Queries\n", + "\n", + "You can use term-level queries to find documents based on precise values in structured data. Examples of structured data include date ranges, IP addresses, prices, or product IDs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Term search\n", + "\n", + "Returns document that contain exactly the search term." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 1.4816045\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 1.4816045\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"term\": {\"publisher.keyword\": \"addison-wesley\"}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Range search\n", + "\n", + "Returns documents that contain terms within a provided range.\n", + "\n", + "The following example returns books that have at least 45 reviews." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 1.0\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 1.0\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.0\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"range\": {\"num_reviews\": {\"gte\": 45}}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Prefix search\n", + "\n", + "Returns documents that contain a specific prefix in a provided field.\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "dCr1pwlqlOE7", + "outputId": "ae55cd66-0ded-4868-dac5-5815ea317c44" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 1.0\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.0\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"prefix\": {\"title\": {\"value\": \"java\"}}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "a606YcCmmLHW" + }, + "source": [ + "#### Fuzzy search\n", + "\n", + "Returns documents that contain terms similar to the search term, as measured by a Levenshtein edit distance.\n", + "\n", + "An edit distance is the number of one-character changes needed to turn one term into another. These changes can include:\n", + "\n", + "* Changing a character (box → fox)\n", + "* Removing a character (black → lack)\n", + "* Inserting a character (sic → sick)\n", + "* Transposing two adjacent characters (act → cat)\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "dTMc-IxPmbtC", + "outputId": "9acf74fd-bc16-45df-80f3-49504860b10a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 1.6246022\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.3651271\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"fuzzy\": {\"title\": {\"value\": \"pyvascript\"}}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Combining Query Conditions\n", + "\n", + "Compound queries wrap other compound or leaf queries, either to combine their results and scores, or to change their behaviour. They also allow you to switch from query to filter context, but that will be covered later in the Filtering section." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7do0lmxA_v25" + }, + "source": [ + "#### bool.must (AND)\n", + "The clauses must appear in matching documents and will contribute to the score. This effectively performs an \"AND\" logical operation on the given sub-queries." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 111 + }, + "id": "8_C-JHRQFDl7", + "outputId": "be59d18b-5e20-4db0-8697-2e7746251742" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 3.788629\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\n", + " \"bool\": {\n", + " \"must\": [\n", + " {\"term\": {\"publisher.keyword\": \"addison-wesley\"}},\n", + " {\"term\": {\"authors.keyword\": \"richard helm\"}},\n", + " ]\n", + " }\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eNlncytRIl9h" + }, + "source": [ + "#### bool.should (OR)\n", + "\n", + "The clause should appear in the matching document. This performs an \"OR\" logical operation on the given sub-queries." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 219 + }, + "id": "GRm9T1vfIsmF", + "outputId": "d9fb6936-3ffb-4fff-9467-1f7ac7b41490" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 2.3070245\n", + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 1.4816045\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 1.4816045\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\n", + " \"bool\": {\n", + " \"should\": [\n", + " {\"term\": {\"publisher.keyword\": \"addison-wesley\"}},\n", + " {\"term\": {\"authors.keyword\": \"douglas crockford\"}},\n", + " ]\n", + " }\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PG9TYqL-8H29" + }, + "source": [ + "## Filtering\n", + "\n", + "In a filter context, a query clause answers the question *“Does this document match this query clause?”* The answer is a simple Yes or No — no scores are calculated. Filter context is mostly used for filtering structured data, for example:\n", + "* Does this `timestamp` fall into the range 2015 to 2016?\n", + "* Is the `status` field set to `\"published\"`?\n", + "\n", + "Filter context is in effect whenever a query clause is passed to a `filter` parameter, such as the `filter` or `must_not` parameters in the `bool` query.\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PGTFXUIkJG4t" + }, + "source": [ + "### bool.filter\n", + "\n", + "The clause (query) must appear for the document to be included in the results. Unlike query context searches such as `term`, `bool.must` or `bool.should`, a matching `score` isn't calculated because filter clauses are executed in filter context." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "id": "6RH0OALLJPHv", + "outputId": "338419b0-3e60-4ac9-ddeb-67cac6202ca2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 0.0\n", + "\n", + "ID: JgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2011-05-13\n", + "Title: The Clean Coder: A Code of Conduct for Professional Programmers\n", + "Summary: A guide to professional conduct in the field of software engineering\n", + "Publisher: prentice hall\n", + "Reviews: 20\n", + "Authors: ['robert c. martin']\n", + "Score: 0.0\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\"bool\": {\"filter\": [{\"term\": {\"publisher.keyword\": \"prentice hall\"}}]}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### bool.must_not\n", + "The clause (query) must not appear in the matching documents. Because this query also runs in filter context, no scores are calculated; the filter just determines if a document is included in the results or not." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 0.0\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 0.0\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\"bool\": {\"must_not\": [{\"range\": {\"num_reviews\": {\"lte\": 45}}}]}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using Filters with Queries\n", + "Filters are often added to search queries with the intention of limiting the search to a subset of the documents. A filter can cleanly eliminate documents from a search, without altering the relevance scores of the results.\n", + "\n", + "The next example returns books that have the word \"javascript\" in their title, only among the books that have more than 45 reviews." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.7064086\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\n", + " \"bool\": {\n", + " \"must\": [{\"match\": {\"title\": {\"query\": \"javascript\"}}}],\n", + " \"must_not\": [{\"range\": {\"num_reviews\": {\"lte\": 45}}}],\n", + " }\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.3" + }, + "vscode": { + "interpreter": { + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/x-pack/plugins/search_notebooks/server/data/02_hybrid_search.json b/x-pack/plugins/search_notebooks/server/data/02_hybrid_search.json new file mode 100644 index 0000000000000..c5e9fd22caad6 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/02_hybrid_search.json @@ -0,0 +1,306 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "s49gpkvZ7q53" + }, + "source": [ + "# Hybrid Search using RRF\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/elastic/elasticsearch-labs/blob/main/notebooks/search/02-hybrid-search.ipynb)\n", + "\n", + "In this example we'll use the reciprocal rank fusion algorithm to combine the results of BM25 and kNN semantic search.\n", + "We'll use the same dataset we used in our [quickstart](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb) guide.\n", + "\n", + "You can use RRF for hybrid search out of the box, without any additional configuration. This example demonstrates how RRF ranking works at a basic level." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gaTFHLJC-Mgi" + }, + "source": [ + "# Install packages and initialize the Elasticsearch Python client\n", + "\n", + "To get started, we'll need to connect to our Elastic deployment using the Python client.\n", + "Because we're using an Elastic Cloud deployment, we'll use the **Cloud ID** to identify our deployment.\n", + "\n", + "First we need to `pip` install the packages we need for this example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K9Q1p2C9-wce", + "outputId": "204d5aee-571e-4363-be6e-f87d058f2d29" + }, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch sentence_transformers" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gEzq2Z1wBs3M" + }, + "source": [ + "Next we need to import the `elasticsearch` module and the `getpass` module.\n", + "`getpass` is part of the Python standard library and is used to securely prompt for credentials." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "uP_GTVRi-d96" + }, + "outputs": [], + "source": [ + "from elasticsearch import Elasticsearch\n", + "from sentence_transformers import SentenceTransformer\n", + "from getpass import getpass\n", + "\n", + "model = SentenceTransformer(\"all-MiniLM-L6-v2\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "AMSePFiZCRqX" + }, + "source": [ + "Now we can instantiate the Python Elasticsearch client.\n", + "First we prompt the user for their password and Cloud ID.\n", + "\n", + "🔐 NOTE: `getpass` enables us to securely prompt the user for credentials without echoing them to the terminal, or storing it in memory.\n", + "\n", + "Then we create a `client` object that instantiates an instance of the `Elasticsearch` class." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "h0MdAZ53CdKL", + "outputId": "96ea6f81-f935-4d51-c4a7-af5a896180f1" + }, + "outputs": [], + "source": [ + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id\n", + "ELASTIC_CLOUD_ID = getpass(\"Elastic Cloud ID: \")\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key\n", + "ELASTIC_API_KEY = getpass(\"Elastic Api Key: \")\n", + "\n", + "# Create the client instance\n", + "client = Elasticsearch(\n", + " # For local development\n", + " # hosts=[\"http://localhost:9200\"]\n", + " cloud_id=ELASTIC_CLOUD_ID,\n", + " api_key=ELASTIC_API_KEY,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "bRHbecNeEDL3" + }, + "source": [ + "Confirm that the client has connected with this test" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rdiUKqZbEKfF", + "outputId": "43b6f1cd-a43e-4dbe-caa5-7fd170464881" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'name': 'instance-0000000011', 'cluster_name': 'd1bd36862ce54c7b903e2aacd4cd7f0a', 'cluster_uuid': 'tIkh0X_UQKmMFQKSfUw-VQ', 'version': {'number': '8.9.0', 'build_flavor': 'default', 'build_type': 'docker', 'build_hash': '8aa461beb06aa0417a231c345a1b8c38fb498a0d', 'build_date': '2023-07-19T14:43:58.555259655Z', 'build_snapshot': False, 'lucene_version': '9.7.0', 'minimum_wire_compatibility_version': '7.17.0', 'minimum_index_compatibility_version': '7.0.0'}, 'tagline': 'You Know, for Search'}\n" + ] + } + ], + "source": [ + "print(client.info())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "enHQuT57DhD1" + }, + "source": [ + "Refer to https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#connect-self-managed-new to learn how to connect to a self-managed deployment.\n", + "\n", + "Read https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#connect-self-managed-new to learn how to connect using API keys.\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "WgWDMgf9NkHL" + }, + "source": [ + "## Pretty printing Elasticsearch responses\n", + "\n", + "Let's add a helper function to print Elasticsearch responses in a readable format. This function is similar to the one that was used in the [quickstart](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb) guide." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def pretty_response(response):\n", + " if len(response[\"hits\"][\"hits\"]) == 0:\n", + " print(\"Your search returned no results.\")\n", + " else:\n", + " for hit in response[\"hits\"][\"hits\"]:\n", + " id = hit[\"_id\"]\n", + " publication_date = hit[\"_source\"][\"publish_date\"]\n", + " rank = hit[\"_rank\"]\n", + " title = hit[\"_source\"][\"title\"]\n", + " summary = hit[\"_source\"][\"summary\"]\n", + " pretty_output = f\"\\nID: {id}\\nPublication date: {publication_date}\\nTitle: {title}\\nSummary: {summary}\\nRank: {rank}\"\n", + " print(pretty_output)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "MrBCHdH1u8Wd" + }, + "source": [ + "# Querying Documents with Hybrid Search\n", + "\n", + "🔐 NOTE: Before you can run the query in this section, you need the `book_index` dataset from our [quick start](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb). If you haven't worked through the quick start, please follow the steps described there to create an Elasticsearch deployment with the dataset in it, and then come back to run the query here.\n", + "\n", + "Now we need to perform a query using two different search strategies:\n", + "- Semantic search using the \"all-MiniLM-L6-v2\" embedding model\n", + "- Keyword search using the \"title\" field\n", + "\n", + "We then use [Reciprocal Rank Fusion (RRF)](https://www.elastic.co/guide/en/elasticsearch/reference/current/rrf.html) to balance the scores to provide a final list of documents, ranked in order of relevance. RRF is a ranking algorithm for combining results from different information retrieval strategies.\n", + "\n", + "Note that _score is null, and we instead use _rank to show our top-ranked documents." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: IAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-05-03\n", + "Title: Python Crash Course\n", + "Summary: A fast-paced, no-nonsense guide to programming in Python\n", + "Rank: 1\n", + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Rank: 2\n", + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Rank: 3\n", + "\n", + "ID: IwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2015-03-27\n", + "Title: You Don't Know JS: Up & Going\n", + "Summary: Introduction to JavaScript and programming as a whole\n", + "Rank: 4\n", + "\n", + "ID: KAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2012-06-27\n", + "Title: Introduction to the Theory of Computation\n", + "Summary: Introduction to the theory of computation and complexity theory\n", + "Rank: 5\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " size=5,\n", + " query={\"match\": {\"summary\": \"python programming\"}},\n", + " knn={\n", + " \"field\": \"title_vector\",\n", + " \"query_vector\": model.encode(\n", + " \"python programming\"\n", + " ).tolist(), # generate embedding for query so it can be compared to `title_vector`\n", + " \"k\": 5,\n", + " \"num_candidates\": 10,\n", + " },\n", + " rank={\"rrf\": {}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.3" + }, + "vscode": { + "interpreter": { + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/x-pack/plugins/search_notebooks/server/data/03_elser.json b/x-pack/plugins/search_notebooks/server/data/03_elser.json new file mode 100644 index 0000000000000..c6c5e6afcbc3f --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/03_elser.json @@ -0,0 +1,552 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "s49gpkvZ7q53" + }, + "source": [ + "# Semantic Search using ELSER v2 text expansion\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/elastic/elasticsearch-labs/blob/main/notebooks/search/03-ELSER.ipynb)\n", + "\n", + "\n", + "Learn how to use the [ELSER](https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-elser.html) for text expansion-powered semantic search.\n", + "\n", + "**`Note:`** This notebook demonstrates how to use ELSER model `.elser_model_2` model which offers an improved retrieval accuracy. \n", + "\n", + "If you have set up an index with ELSER model `.elser_model_1`, and would like to upgrade to ELSER v2 model - `.elser_model_2`, Please follow instructions from the notebook on [how to upgrade an index to use elser model](../model-upgrades/upgrading-index-to-use-elser.ipynb)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gaTFHLJC-Mgi" + }, + "source": [ + "# Install and Connect\n", + "\n", + "To get started, we'll need to connect to our Elastic deployment using the Python client.\n", + "Because we're using an Elastic Cloud deployment, we'll use the **Cloud ID** to identify our deployment.\n", + "\n", + "First we need to `pip` install the following packages:\n", + "\n", + "- `elasticsearch`\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K9Q1p2C9-wce", + "outputId": "204d5aee-571e-4363-be6e-f87d058f2d29" + }, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gEzq2Z1wBs3M" + }, + "source": [ + "Next, we need to import the modules we need.\n", + "🔐 NOTE: `getpass` enables us to securely prompt the user for credentials without echoing them to the terminal, or storing it in memory." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "uP_GTVRi-d96" + }, + "outputs": [], + "source": [ + "from elasticsearch import Elasticsearch, helpers, exceptions\n", + "from urllib.request import urlopen\n", + "from getpass import getpass\n", + "import json\n", + "import time" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "AMSePFiZCRqX" + }, + "source": [ + "Now we can instantiate the Python Elasticsearch client.\n", + "\n", + "First we prompt the user for their password and Cloud ID.\n", + "Then we create a `client` object that instantiates an instance of the `Elasticsearch` class." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "h0MdAZ53CdKL", + "outputId": "96ea6f81-f935-4d51-c4a7-af5a896180f1" + }, + "outputs": [], + "source": [ + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id\n", + "ELASTIC_CLOUD_ID = getpass(\"Elastic Cloud ID: \")\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key\n", + "ELASTIC_API_KEY = getpass(\"Elastic Api Key: \")\n", + "\n", + "# Create the client instance\n", + "client = Elasticsearch(\n", + " # For local development\n", + " # hosts=[\"http://localhost:9200\"]\n", + " cloud_id=ELASTIC_CLOUD_ID,\n", + " api_key=ELASTIC_API_KEY,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "bRHbecNeEDL3" + }, + "source": [ + "Confirm that the client has connected with this test" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rdiUKqZbEKfF", + "outputId": "43b6f1cd-a43e-4dbe-caa5-7fd170464881" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'name': 'instance-0000000011', 'cluster_name': 'd1bd36862ce54c7b903e2aacd4cd7f0a', 'cluster_uuid': 'tIkh0X_UQKmMFQKSfUw-VQ', 'version': {'number': '8.11.1', 'build_flavor': 'default', 'build_type': 'docker', 'build_hash': '6f9ff581fbcde658e6f69d6ce03050f060d1fd0c', 'build_date': '2023-11-11T10:05:59.421038163Z', 'build_snapshot': False, 'lucene_version': '9.8.0', 'minimum_wire_compatibility_version': '7.17.0', 'minimum_index_compatibility_version': '7.0.0'}, 'tagline': 'You Know, for Search'}\n" + ] + } + ], + "source": [ + "print(client.info())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "enHQuT57DhD1" + }, + "source": [ + "Refer to https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#connect-self-managed-new to learn how to connect to a self-managed deployment.\n", + "\n", + "Read https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#connect-self-managed-new to learn how to connect using API keys.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Download and Deploy ELSER Model\n", + "\n", + "In this example, we are going to download and deploy the ELSER model in our ML node. Make sure you have an ML node in order to run the ELSER model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# delete model if already downloaded and deployed\n", + "try:\n", + " client.ml.delete_trained_model(model_id=\".elser_model_2\", force=True)\n", + " print(\"Model deleted successfully, We will proceed with creating one\")\n", + "except exceptions.NotFoundError:\n", + " print(\"Model doesn't exist, but We will proceed with creating one\")\n", + "\n", + "# Creates the ELSER model configuration. Automatically downloads the model if it doesn't exist.\n", + "client.ml.put_trained_model(\n", + " model_id=\".elser_model_2\", input={\"field_names\": [\"text_field\"]}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above command will download the ELSER model. This will take a few minutes to complete. Use the following command to check the status of the model download." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "while True:\n", + " status = client.ml.get_trained_models(\n", + " model_id=\".elser_model_2\", include=\"definition_status\"\n", + " )\n", + "\n", + " if status[\"trained_model_configs\"][0][\"fully_defined\"]:\n", + " print(\"ELSER Model is downloaded and ready to be deployed.\")\n", + " break\n", + " else:\n", + " print(\"ELSER Model is downloaded but not ready to be deployed.\")\n", + " time.sleep(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the model is downloaded, we can deploy the model in our ML node. Use the following command to deploy the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Start trained model deployment if not already deployed\n", + "client.ml.start_trained_model_deployment(\n", + " model_id=\".elser_model_2\", number_of_allocations=1, wait_for=\"starting\"\n", + ")\n", + "\n", + "while True:\n", + " status = client.ml.get_trained_models_stats(\n", + " model_id=\".elser_model_2\",\n", + " )\n", + " if status[\"trained_model_stats\"][0][\"deployment_stats\"][\"state\"] == \"started\":\n", + " print(\"ELSER Model has been successfully deployed.\")\n", + " break\n", + " else:\n", + " print(\"ELSER Model is currently being deployed.\")\n", + " time.sleep(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This also will take a few minutes to complete." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "EmELvr_JK_22" + }, + "source": [ + "# Indexing Documents with ELSER\n", + "\n", + "In order to use ELSER on our Elastic Cloud deployment we'll need to create an ingest pipeline that contains an inference processor that runs the ELSER model.\n", + "Let's add that pipeline using the [`put_pipeline`](https://www.elastic.co/guide/en/elasticsearch/reference/master/put-pipeline-api.html) method." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XhRng99KLQsd", + "outputId": "00ea73b5-45a4-472b-f4bc-2c2c790ab94d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'acknowledged': True})" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.ingest.put_pipeline(\n", + " id=\"elser-ingest-pipeline\",\n", + " description=\"Ingest pipeline for ELSER\",\n", + " processors=[\n", + " {\n", + " \"inference\": {\n", + " \"model_id\": \".elser_model_2\",\n", + " \"input_output\": [\n", + " {\"input_field\": \"plot\", \"output_field\": \"plot_embedding\"}\n", + " ],\n", + " }\n", + " }\n", + " ],\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "0wCH7YHLNW3i" + }, + "source": [ + "Let's note a few important parameters from that API call:\n", + "\n", + "- `inference`: A processor that performs inference using a machine learning model.\n", + "- `model_id`: Specifies the ID of the machine learning model to be used. In this example, the model ID is set to `.elser_model_2`.\n", + "- `input_output`: Specifies input and output fields\n", + "- `input_field`: Field name from which the `sparse_vector` representation are created.\n", + "- `output_field`: Field name which contains inference results. " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "TF_wxIAhD07a" + }, + "source": [ + "## Create index\n", + "\n", + "To use the ELSER model at index time, we'll need to create an index mapping that supports a [`text_expansion`](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-text-expansion-query.html) query.\n", + "The mapping includes a field of type [`sparse_vector`](https://www.elastic.co/guide/en/elasticsearch/reference/master/sparse-vector.html) to work with our feature vectors of interest.\n", + "This field contains the token-weight pairs the ELSER model created based on the input text.\n", + "\n", + "Let's create an index named `elser-example-movies` with the mappings we need.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cvYECABJJs_2", + "outputId": "18fb51e4-c4f6-4d1b-cb2d-bc6f8ec1aa84" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'acknowledged': True, 'shards_acknowledged': True, 'index': 'elser-example-movies'})" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.indices.delete(index=\"elser-example-movies\", ignore_unavailable=True)\n", + "client.indices.create(\n", + " index=\"elser-example-movies\",\n", + " settings={\"index\": {\"default_pipeline\": \"elser-ingest-pipeline\"}},\n", + " mappings={\n", + " \"properties\": {\n", + " \"plot\": {\n", + " \"type\": \"text\",\n", + " \"fields\": {\"keyword\": {\"type\": \"keyword\", \"ignore_above\": 256}},\n", + " },\n", + " \"plot_embedding\": {\"type\": \"sparse_vector\"},\n", + " }\n", + " },\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "lFHgRUYVpNKP" + }, + "source": [ + "## Insert Documents\n", + "Let's insert our example dataset of 12 movies.\n", + "\n", + "If you get an error, check the model has been deployed and is available in the ML node. In newer versions of Elastic Cloud, ML node is autoscaled and the ML node may not be ready yet. Wait for a few minutes and try again." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IBfqgdAcuKRG", + "outputId": "3b86daa1-ade1-4ff3-da81-4207fa814d30" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done indexing documents into `elser-example-movies` index!\n" + ] + } + ], + "source": [ + "url = \"https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/movies.json\"\n", + "response = urlopen(url)\n", + "\n", + "# Load the response data into a JSON object\n", + "data_json = json.loads(response.read())\n", + "\n", + "# Prepare the documents to be indexed\n", + "documents = []\n", + "for doc in data_json:\n", + " documents.append(\n", + " {\n", + " \"_index\": \"elser-example-movies\",\n", + " \"_source\": doc,\n", + " }\n", + " )\n", + "\n", + "# Use helpers.bulk to index\n", + "helpers.bulk(client, documents)\n", + "\n", + "print(\"Done indexing documents into `elser-example-movies` index!\")\n", + "time.sleep(3)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "oCj3jHHML4Tn" + }, + "source": [ + "Inspect a new document to confirm that it now has an `plot_embedding` field that contains a list of new, additional terms.\n", + "These terms are the **text expansion** of the field(s) you targeted for ELSER inference in `input_field` while creating the pipeline. \n", + "ELSER essentially creates a tree of expanded terms to improve the semantic searchability of your documents.\n", + "We'll be able to search these documents using a `text_expansion` query.\n", + "\n", + "But first let's start with a simple keyword search, to see how ELSER delivers semantically relevant results out of the box." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "Zy5GT2xb38oz" + }, + "source": [ + "# Searching Documents\n", + "\n", + "Let's test out semantic search using ELSER." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bAZRxja-5Q6X", + "outputId": "37a26a2c-4284-4e51-c34e-9a55edf77cb8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Score: 12.763346\n", + "Title: Fight Club\n", + "Plot: An insomniac office worker and a devil-may-care soapmaker form an underground fight club that evolves into something much, much more.\n", + "\n", + "Score: 9.930427\n", + "Title: Pulp Fiction\n", + "Plot: The lives of two mob hitmen, a boxer, a gangster and his wife, and a pair of diner bandits intertwine in four tales of violence and redemption.\n", + "\n", + "Score: 9.4883375\n", + "Title: The Matrix\n", + "Plot: A computer hacker learns from mysterious rebels about the true nature of his reality and his role in the war against its controllers.\n", + "\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"elser-example-movies\",\n", + " size=3,\n", + " query={\n", + " \"text_expansion\": {\n", + " \"plot_embedding\": {\n", + " \"model_id\": \".elser_model_2\",\n", + " \"model_text\": \"fighting movie\",\n", + " }\n", + " }\n", + " },\n", + ")\n", + "\n", + "for hit in response[\"hits\"][\"hits\"]:\n", + " doc_id = hit[\"_id\"]\n", + " score = hit[\"_score\"]\n", + " title = hit[\"_source\"][\"title\"]\n", + " plot = hit[\"_source\"][\"plot\"]\n", + " print(f\"Score: {score}\\nTitle: {title}\\nPlot: {plot}\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next Steps\n", + "Now that we have a working example of semantic search using ELSER, you can try it out on your own data. Don't forget to scale down the ML node when you are done. " + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + }, + "vscode": { + "interpreter": { + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/x-pack/plugins/search_notebooks/server/data/04_multilingual.json b/x-pack/plugins/search_notebooks/server/data/04_multilingual.json new file mode 100644 index 0000000000000..9b41984a69035 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/04_multilingual.json @@ -0,0 +1,666 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "s49gpkvZ7q53" + }, + "source": [ + "# Multilingual semantic search\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/elastic/elasticsearch-labs/blob/main/notebooks/search/04-multilingual.ipynb)\n", + "\n", + "In this example we'll use a multilingual embedding model\n", + "[multilingual-e5-base](https://huggingface.co/intfloat/multilingual-e5-base) to perform search on a dataset of mixed\n", + "language documents. Using this model, we can search in two ways:\n", + " * Across languages, for example using a query in German to find documents in English\n", + " * Within a non-English language, for example using a query in German to find documents in German\n", + "\n", + " While this example is using dense retrieval only, it's possible to also combine dense and traditional lexical retrieval\n", + " with hybrid search. For more information on lexical multilingual search, please see the blog post\n", + " [Multilingual search using language identification in Elasticsearch](https://www.elastic.co/search-labs/multilingual-vector-search-e5-embedding-model).\n", + "\n", + " The dataset used contains snippets of Wikipedia passages from the [MIRACL](https://project-miracl.github.io/) dataset." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "Y01AXpELkygt" + }, + "source": [ + "# 🧰 Requirements\n", + "\n", + "For this example, you will need:\n", + "\n", + "- Python 3.6 or later\n", + "- An Elastic deployment with a machine learning node\n", + " - We'll be using [Elastic Cloud](https://www.elastic.co/guide/en/cloud/current/ec-getting-started.html) for this example (available with a [free trial](https://cloud.elastic.co/registration?utm_source=github&utm_content=elasticsearch-labs-notebook))\n", + "- The [Elastic Python client](https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/installation.html)\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "N4pI1-eIvWrI" + }, + "source": [ + "## Create Elastic Cloud deployment\n", + "\n", + "If you don't have an Elastic Cloud deployment, sign up [here](https://cloud.elastic.co/registration?utm_source=github&utm_content=elasticsearch-labs-notebook) for a free trial.\n", + "\n", + "Once logged in to your Elastic Cloud account, go to the [Create deployment](https://cloud.elastic.co/deployments/create) page and select **Create deployment**. Leave all settings with their default values." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gaTFHLJC-Mgi" + }, + "source": [ + "# Install packages and initialize the Elasticsearch Python client\n", + "\n", + "To get started, we'll need to connect to our Elastic deployment using the Python client.\n", + "Because we're using an Elastic Cloud deployment, we'll use the **Cloud ID** to identify our deployment.\n", + "\n", + "First we need to `pip` install the packages we need for this example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K9Q1p2C9-wce", + "outputId": "204d5aee-571e-4363-be6e-f87d058f2d29" + }, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch sentence_transformers" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gEzq2Z1wBs3M" + }, + "source": [ + "Next we need to import the `elasticsearch` module and the `getpass` module.\n", + "`getpass` is part of the Python standard library and is used to securely prompt for credentials." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "uP_GTVRi-d96" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7ea79a149aaf42cd8e178597038deb3c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading pytorch_model.bin: 0%| | 0.00/1.11G [00:00 \"Gesundheit\"\n", + " * \"wall\" -> \"Mauer\"\n", + "\n", + "The first example searches for a word in English." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: 9002#0\n", + "Language: de\n", + "Title: Gesundheits- und Krankenpflege\n", + "Passage: Die Gesundheits- und Krankenpflege als Berufsfeld umfasst die Versorgung und Betreuung von Menschen aller Altersgruppen,\n", + "insbesondere kranke, behinderte und sterbende Erwachsene. Die Gesundheits- und Kinderkrankenpflege hat ihren Schwerpunkt\n", + "in der Versorgung von Kindern und Jugendlichen. In beiden Fachrichtungen gehört die Verhütung von Krankheiten und\n", + "Gesunderhaltung zum Aufgabengebiet der professionellen Pflege.\n", + "Score: 0.8986236\n", + "\n", + "ID: 8881#0\n", + "Language: en\n", + "Title: Doctor (title)\n", + "Passage: Doctor is an academic title that originates from the Latin word of the same spelling and meaning. The word is originally\n", + "an agentive noun of the Latin verb \"docēre\" [dɔˈkeːrɛ] 'to teach'. It has been used as an academic title in Europe since\n", + "the 13th century, when the first Doctorates were awarded at the University of Bologna and the University of Paris.\n", + "Having become established in European universities, this usage spread around the world. Contracted \"Dr\" or \"Dr.\", it is\n", + "used as a designation for a person who has obtained a Doctorate (e.g. PhD). In many parts of the world it is also used\n", + "by medical practitioners, regardless of whether or not they hold a doctoral-level degree.\n", + "Score: 0.8904184\n" + ] + } + ], + "source": [ + "pretty_response(query(\"health\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that in the results above, we see that the document about healthcare,\n", + "even though it's in German, matches better to the query \"health\",\n", + "versus the English document which doesn't talk about health specifically but about doctors more generally.\n", + "This is the power of a multilingual embedding which embeds meaning across languages.\n", + "\n", + "The next example also searches for a word in English, but only retrieves results in German." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: 2270104#0\n", + "Language: de\n", + "Title: London Wall\n", + "Passage: London Wall ist die strategische Stadtmauer, die die Römer um Londinium gebaut haben, um die Stadt zu schützen, die über\n", + "den wichtigen Hafen an der Themse verfügte. Bis ins späte Mittelalter hinein bildete diese Stadtmauer die Grenzen von\n", + "London. Heute ist \"London Wall\" auch der Name einer Straße, die an einem noch bestehenden Abschnitt der Stadtmauer\n", + "verläuft.\n", + "Score: 0.8941858\n", + "\n", + "ID: 2270104#1\n", + "Language: de\n", + "Title: London Wall\n", + "Passage: Die Mauer wurde Ende des zweiten oder Anfang des dritten Jahrhunderts erbaut, wahrscheinlich zwischen 190 und 225,\n", + "vermutlich zwischen 200 und 220. Sie entstand somit etwa achtzig Jahre nach dem im Jahr 120 erfolgten Bau der Festung,\n", + "deren nördliche und westliche Mauern verstärkt und in der Höhe verdoppelt wurden, um einen Teil der neuen Stadtmauer zu\n", + "bilden. Die Anlage wurde zumindest bis zum Ende des vierten Jahrhunderts weiter ausgebaut. Sie zählt zu den letzten\n", + "großen Bauprojekten der Römer vor deren Rückzug aus Britannien im Jahr 410.\n", + "Score: 0.870095\n" + ] + } + ], + "source": [ + "pretty_response(query(\"wall\", language=\"de\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the final example, the query is given in German, and only German results are requested." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: 2270104#1\n", + "Language: de\n", + "Title: London Wall\n", + "Passage: Die Mauer wurde Ende des zweiten oder Anfang des dritten Jahrhunderts erbaut, wahrscheinlich zwischen 190 und 225,\n", + "vermutlich zwischen 200 und 220. Sie entstand somit etwa achtzig Jahre nach dem im Jahr 120 erfolgten Bau der Festung,\n", + "deren nördliche und westliche Mauern verstärkt und in der Höhe verdoppelt wurden, um einen Teil der neuen Stadtmauer zu\n", + "bilden. Die Anlage wurde zumindest bis zum Ende des vierten Jahrhunderts weiter ausgebaut. Sie zählt zu den letzten\n", + "großen Bauprojekten der Römer vor deren Rückzug aus Britannien im Jahr 410.\n", + "Score: 0.88160384\n", + "\n", + "ID: 2270104#0\n", + "Language: de\n", + "Title: London Wall\n", + "Passage: London Wall ist die strategische Stadtmauer, die die Römer um Londinium gebaut haben, um die Stadt zu schützen, die über\n", + "den wichtigen Hafen an der Themse verfügte. Bis ins späte Mittelalter hinein bildete diese Stadtmauer die Grenzen von\n", + "London. Heute ist \"London Wall\" auch der Name einer Straße, die an einem noch bestehenden Abschnitt der Stadtmauer\n", + "verläuft.\n", + "Score: 0.876139\n" + ] + } + ], + "source": [ + "pretty_response(query(\"Mauer\", language=\"de\"))" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.3" + }, + "vscode": { + "interpreter": { + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/x-pack/plugins/search_notebooks/server/index.ts b/x-pack/plugins/search_notebooks/server/index.ts new file mode 100644 index 0000000000000..fa0b8596ee7f9 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/index.ts @@ -0,0 +1,18 @@ +/* + * 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(context: PluginInitializerContext) { + const { SearchNotebooksPlugin } = await import('./plugin'); + return new SearchNotebooksPlugin(context); +} + +/** @public */ +export type { SearchNotebooksPluginSetup, SearchNotebooksPluginStart } from './types'; diff --git a/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.test.ts b/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.test.ts new file mode 100644 index 0000000000000..13e79c4ed3422 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.test.ts @@ -0,0 +1,53 @@ +/* + * 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 fs from 'fs/promises'; +import type { Logger } from '@kbn/logging'; + +// Mocking dependencies +jest.mock('fs/promises'); + +const mockLogger: Logger = { + warn: jest.fn(), + error: jest.fn(), +} as Partial as Logger; + +import { getNotebook, DEFAULT_NOTEBOOKS } from './notebook_catalog'; + +describe('getNotebook', () => { + const options = { logger: mockLogger }; + beforeEach(() => { + // Reset mocks and cache before each test + jest.clearAllMocks(); + }); + + it('throws an error if given an unknown notebook id', () => { + expect(getNotebook('some-fake-id', options)).rejects.toThrow('Unknown Notebook ID'); + expect(mockLogger.warn).toHaveBeenCalledTimes(1); + }); + + it('throws an error if the file is not found', () => { + const notebookId = DEFAULT_NOTEBOOKS.notebooks[0].id; + jest.mocked(fs.access).mockReset().mockRejectedValue(new Error('Boom')); + + expect(getNotebook(notebookId, options)).rejects.toThrow('Failed to fetch notebook.'); + }); + + it('Reads notebook', () => { + const notebookId = DEFAULT_NOTEBOOKS.notebooks[0].id; + + jest.mocked(fs.access).mockReset().mockResolvedValue(undefined); + + expect(getNotebook(notebookId, options)).resolves.toMatchObject({ + cells: expect.anything(), + metadata: expect.anything(), + }); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + expect(fs.access).toHaveBeenCalledWith(expect.stringContaining(`${notebookId}.json`), 0); + }); +}); diff --git a/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.ts b/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.ts new file mode 100644 index 0000000000000..9056404ee9760 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.ts @@ -0,0 +1,115 @@ +/* + * 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 fs from 'fs/promises'; +import path from 'path'; +import { i18n } from '@kbn/i18n'; +import type { Logger } from '@kbn/logging'; + +import { NotebookCatalog, NotebookInformation, NotebookDefinition } from '../types'; + +const NOTEBOOKS_DATA_DIR = '../data'; + +export const DEFAULT_NOTEBOOKS: NotebookCatalog = { + notebooks: [ + { + id: '00_quick_start', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.quickStart.title', { + defaultMessage: 'Semantic search quick start', + }), + description: i18n.translate('xpack.searchNotebooks.notebooksCatalog.quickStart.description', { + defaultMessage: + "This interactive notebook will introduce you to some basic operations with Elasticsearch, using the official Elasticsearch Python client. You'll perform semantic search using Sentence Transformers for text embedding. Learn how to integrate traditional text-based search with semantic search, for a hybrid search system.", + }), + }, + { + id: '01_keyword_querying_filtering', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.keywordQueryFiltering.title', { + defaultMessage: 'Keyword querying and filtering', + }), + description: i18n.translate( + 'xpack.searchNotebooks.notebooksCatalog.keywordQueryFiltering.description', + { + defaultMessage: + 'This interactive notebook will introduce you to the basic Elasticsearch queries, using the official Elasticsearch Python client. Before getting started on this section you should work through our quick start, as you will be using the same dataset.', + } + ), + }, + { + id: '02_hybrid_search', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.hybridSearch.title', { + defaultMessage: 'Hybrid Search using RRF', + }), + description: i18n.translate( + 'xpack.searchNotebooks.notebooksCatalog.hybridSearch.description', + { + defaultMessage: + 'This interactive notebook will use the reciprocal rank fusion algorithm to combine the results of BM25 and kNN semantic search.', + } + ), + }, + { + id: '03_elser', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.elser.title', { + defaultMessage: 'Semantic Search using ELSER v2 text expansion', + }), + description: i18n.translate('xpack.searchNotebooks.notebooksCatalog.elser.description', { + defaultMessage: 'Learn how to use ELSER for text expansion-powered semantic search.', + }), + }, + { + id: '04_multilingual', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.multilingual.title', { + defaultMessage: 'Multilingual semantic search', + }), + description: i18n.translate( + 'xpack.searchNotebooks.notebooksCatalog.multilingual.description', + { + defaultMessage: + "In this example we'll use a multilingual embedding model 'multilingual-e5-base' to perform search on a dataset of mixed language documents.", + } + ), + }, + ], +}; +export const NOTEBOOKS_MAP: Record = + DEFAULT_NOTEBOOKS.notebooks.reduce((nbMap, nb) => { + nbMap[nb.id] = nb; + return nbMap; + }, {} as Record); + +const NOTEBOOK_IDS = DEFAULT_NOTEBOOKS.notebooks.map(({ id }) => id); + +export const getNotebook = async ( + notebookId: string, + { logger }: { logger: Logger } +): Promise => { + // Only server pre-defined notebooks, since we're reading files from disk only allow IDs + // for the known notebooks so that we aren't attempting to read any file from disk given user input + if (!NOTEBOOK_IDS.includes(notebookId)) { + logger.warn(`Unknown search notebook requested ${notebookId}`); + throw new Error( + i18n.translate('xpack.searchNotebooks.notebooksCatalog.errors.unknownId', { + defaultMessage: 'Unknown Notebook ID', + }) + ); + } + + const notebookPath = path.join(__dirname, NOTEBOOKS_DATA_DIR, `${notebookId}.json`); + try { + await fs.access(notebookPath, fs.constants.F_OK); + const notebook = (await import(notebookPath)).default; + return notebook; + } catch (err) { + logger.error(`Error reading search notebook ${notebookId}`, err); + throw new Error( + i18n.translate('xpack.searchNotebooks.notebooksCatalog.errors.notebookImportFailure', { + defaultMessage: 'Failed to fetch notebook.', + }) + ); + } +}; diff --git a/x-pack/plugins/search_notebooks/server/plugin.ts b/x-pack/plugins/search_notebooks/server/plugin.ts new file mode 100644 index 0000000000000..247c62d5ec7c6 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/plugin.ts @@ -0,0 +1,48 @@ +/* + * 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 { + PluginInitializerContext, + CoreSetup, + CoreStart, + Plugin, + Logger, +} from '@kbn/core/server'; + +import { SearchNotebooksPluginSetup, SearchNotebooksPluginStart } from './types'; +import { defineRoutes } from './routes'; +import { SearchNotebooksConfig } from './config'; + +export class SearchNotebooksPlugin + implements Plugin +{ + private readonly config: SearchNotebooksConfig; + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.config = initializerContext.config.get(); + this.logger = initializerContext.logger.get(); + } + + public setup(core: CoreSetup) { + if (!this.config.enabled) return {}; + + this.logger.debug('searchNotebooks: Setup'); + const router = core.http.createRouter(); + + // Register server side APIs + defineRoutes(router, this.logger); + + return {}; + } + + public start(core: CoreStart) { + return {}; + } + + public stop() {} +} diff --git a/x-pack/plugins/search_notebooks/server/routes/index.ts b/x-pack/plugins/search_notebooks/server/routes/index.ts new file mode 100644 index 0000000000000..2509290c0e061 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/routes/index.ts @@ -0,0 +1,62 @@ +/* + * 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 } from '@kbn/config-schema'; +import type { IRouter } from '@kbn/core/server'; +import type { Logger } from '@kbn/logging'; + +import { DEFAULT_NOTEBOOKS, NOTEBOOKS_MAP, getNotebook } from '../lib/notebook_catalog'; +import { NotebookDefinition } from '../types'; + +export function defineRoutes(router: IRouter, logger: Logger) { + router.get( + { + path: '/internal/search_notebooks/notebooks', + validate: {}, + }, + async (_context, _request, response) => { + return response.ok({ + body: DEFAULT_NOTEBOOKS, + headers: { 'content-type': 'application/json' }, + }); + } + ); + + router.get( + { + path: '/internal/search_notebooks/notebooks/{notebookId}', + validate: { + params: schema.object({ + notebookId: schema.string(), + }), + }, + }, + async (context, request, response) => { + const notebookId = request.params.notebookId; + + if (!NOTEBOOKS_MAP.hasOwnProperty(notebookId)) { + logger.warn(`Unknown search notebook requested ${notebookId}`); + return response.notFound(); + } + + const notebookMetadata = NOTEBOOKS_MAP[notebookId]; + let notebook: NotebookDefinition; + try { + notebook = await getNotebook(notebookId, { logger }); + } catch (e) { + return response.customError(e.message); + } + return response.ok({ + body: { + ...notebookMetadata, + notebook, + }, + headers: { 'content-type': 'application/json' }, + }); + } + ); +} diff --git a/x-pack/plugins/search_notebooks/server/types.ts b/x-pack/plugins/search_notebooks/server/types.ts new file mode 100644 index 0000000000000..506eb9126f940 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/types.ts @@ -0,0 +1,89 @@ +/* + * 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 SearchNotebooksPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchNotebooksPluginStart {} + +export interface NotebookInformation { + id: string; + title: string; + description: string; +} +export interface NotebookCatalog { + notebooks: NotebookInformation[]; +} + +export interface Notebook extends NotebookInformation { + link?: { + title: string; + url: string; + }; + notebook: NotebookDefinition; +} + +export interface NotebookDefinition { + cells: NotebookCellType[]; + metadata?: NotebookMetadataType; + nbformat?: number; + nbformat_minor?: number; +} + +export interface NotebookMetadataType { + kernelspec?: { + display_name?: string; + language?: string; + name?: string; + }; + language_info?: { + mimetype?: string; + name?: string; + version?: string; + }; +} + +export interface NotebookCellType { + auto_number?: number; + cell_type?: string; + execution_count?: number | null; + id?: string; + inputs?: string[]; + metadata?: { + id?: string; + }; + outputs?: NotebookOutputType[]; + prompt_number?: number; + source?: string[]; +} + +export interface NotebookOutputType { + name?: string; + ename?: string; + evalue?: string; + traceback?: string[]; + data?: { + 'text/plain'?: string[]; + 'text/html'?: string[]; + 'text/latex'?: string[]; + 'image/png'?: string; + 'image/jpeg'?: string; + 'image/gif'?: string; + 'image/svg+xml'?: string; + 'application/javascript'?: string[]; + }; + output_type?: string; + png?: string; + jpeg?: string; + gif?: string; + svg?: string; + text?: string[]; + execution_count?: number; + metadata?: { + scrolled?: boolean; + }; +} diff --git a/x-pack/plugins/search_notebooks/tsconfig.json b/x-pack/plugins/search_notebooks/tsconfig.json new file mode 100644 index 0000000000000..17fad2e1a5398 --- /dev/null +++ b/x-pack/plugins/search_notebooks/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "common/**/*.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../typings/**/*" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/config-schema", + "@kbn/core", + "@kbn/i18n", + "@kbn/logging", + ] +} diff --git a/yarn.lock b/yarn.lock index 3d00f2c85b17b..2829d06df74fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5802,6 +5802,10 @@ version "0.0.0" uid "" +"@kbn/search-notebooks@link:x-pack/plugins/search_notebooks": + version "0.0.0" + uid "" + "@kbn/search-playground@link:x-pack/plugins/search_playground": version "0.0.0" uid "" From f046050c1c97b9c9e63c52021ca93b2240bb7fa8 Mon Sep 17 00:00:00 2001 From: "Eyo O. Eyo" <7893459+eokoneyo@users.noreply.github.com> Date: Thu, 4 Apr 2024 21:38:22 +0200 Subject: [PATCH 08/69] Tabbed modal component (#179613) ## Summary This splits out the work created in https://github.com/elastic/kibana/pull/179037, so that we might have a smaller PR to be review that is also single purpose. This PR introduces the tabbed modal component, alongside visual API for constructing a modal with tabbed experience within Kibana. It mostly builds off the EUI modal component, with allowance to construct a modal declaratively, and also supports managing state for the modal. See `IModalTabDeclaration` At the moment this component is quite rudimentary and might be evolved, but as of now it has mostly been created to support the work for redesigning the share experience for dashboard, lens and canvas. It can be reviewed by through the shared_ux storybook; `yarn storybook shared_ux`. Examples for it's usage have also been included. ## Visuals Screenshot 2024-03-28 at 12 07 01 Co-authored-by: rshen91 --- packages/shared-ux/modal/tabbed/src/context/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared-ux/modal/tabbed/src/context/index.tsx b/packages/shared-ux/modal/tabbed/src/context/index.tsx index 9021b6b864826..edb80300874bb 100644 --- a/packages/shared-ux/modal/tabbed/src/context/index.tsx +++ b/packages/shared-ux/modal/tabbed/src/context/index.tsx @@ -144,7 +144,7 @@ export function ModalContextProvider Date: Thu, 4 Apr 2024 20:58:15 +0100 Subject: [PATCH 09/69] [Console Monaco] Add support for loading from a URL (#179947) Closes https://github.com/elastic/kibana/issues/179906 ## Summary This PR adds support for loading a Console snippet from a URL through the `load_from` parameter. It utilizes the native `fetch` function to fetch the URL. For protection against malicious URLs, only Elastic domain (www.elastic.co) is accepted. **How to test:** 1. Create a `config/kibana.dev.yml` file (if one doesn't exist already) and add the line: `console.dev.enableMonaco: true` 2. Start Es with `yarn es snapshot` and Kibana with `yarn start`. 3. Navigate to Console with a `load_from` parameter specifying a valid Elastic docs URL. For example, navigating to `app/dev_tools#/console?load_from=https://www.elastic.co/guide/en/elasticsearch/reference/current/snippets/2935.console` (this is the snippet from this [docs page](https://www.elastic.co/guide/en/elasticsearch/reference/master/search-search.html)) should load the following snippet in Console: ``` GET /my-index-000001/_search ``` 4. Try loading a URL with a non-Elastic domain (e.g. `app/dev_tools#/console?load_from=https://www.test.co`). There should be a warning toast displayed explaining that only Elastic domain is allowed: Screenshot 2024-04-04 at 17 58 42 --- .../editor/monaco/use_set_initial_value.ts | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/plugins/console/public/application/containers/editor/monaco/use_set_initial_value.ts b/src/plugins/console/public/application/containers/editor/monaco/use_set_initial_value.ts index 0107a95ccbfc0..b95a8ac46ac5d 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/use_set_initial_value.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/use_set_initial_value.ts @@ -41,11 +41,32 @@ const readLoadFromParam = () => { * * @param params The {@link SetInitialValueParams} to use. */ -export const useSetInitialValue = (params: SetInitialValueParams) => { +export const useSetInitialValue = async (params: SetInitialValueParams) => { const { initialTextValue, setValue, toasts } = params; - const loadBufferFromRemote = (url: string) => { - // TODO: Add support for fetching from HTTP + const loadBufferFromRemote = async (url: string) => { + if (/^https?:\/\//.test(url)) { + // Check if this is a valid URL + try { + new URL(url); + } catch (e) { + return; + } + // Parse the URL to avoid issues with spaces and other special characters. + const parsedURL = new URL(url); + if (parsedURL.origin === 'https://www.elastic.co') { + const resp = await fetch(parsedURL); + const data = await resp.text(); + setValue(`${initialTextValue}\n\n${data}`); + } else { + toasts.addWarning( + i18n.translate('console.loadFromDataUnrecognizedUrlErrorMessage', { + defaultMessage: + 'Only URLs with the Elastic domain (www.elastic.co) can be loaded in Console.', + }) + ); + } + } // If we have a data URI instead of HTTP, LZ-decode it. This enables // opening requests in Console from anywhere in Kibana. @@ -67,12 +88,12 @@ export const useSetInitialValue = (params: SetInitialValueParams) => { }; // Support for loading a console snippet from a remote source, like support docs. - const onHashChange = debounce(() => { + const onHashChange = debounce(async () => { const url = readLoadFromParam(); if (!url) { return; } - loadBufferFromRemote(url); + await loadBufferFromRemote(url); }, 200); window.addEventListener('hashchange', onHashChange); @@ -80,7 +101,7 @@ export const useSetInitialValue = (params: SetInitialValueParams) => { const loadFromParam = readLoadFromParam(); if (loadFromParam) { - loadBufferFromRemote(loadFromParam); + await loadBufferFromRemote(loadFromParam); } else { setValue(initialTextValue || DEFAULT_INPUT_VALUE); } From 2ad38df5cd80b2a4360d3bf3c9d349d3d615ca91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Thu, 4 Apr 2024 22:02:48 +0200 Subject: [PATCH 10/69] Revert "deepmerge in merging apm-configuration (#179048)" (#180005) ## Summary Reverting #179048 because it creates a false expectation that environment vars and config will be merged. This is true for the RUM agent. However, the NodeJS agent reads the environment vars and discards any provided config, leading to inconsistent behavior between both agents. ### Checklist - [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 ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../kbn-apm-config-loader/src/config.test.ts | 20 ++----------------- packages/kbn-apm-config-loader/src/config.ts | 6 +----- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/packages/kbn-apm-config-loader/src/config.test.ts b/packages/kbn-apm-config-loader/src/config.test.ts index 3d0bd98bec467..e955b175de129 100644 --- a/packages/kbn-apm-config-loader/src/config.test.ts +++ b/packages/kbn-apm-config-loader/src/config.test.ts @@ -7,9 +7,9 @@ */ import type { AgentConfigOptions, Labels } from 'elastic-apm-node'; import { - gitRevExecMock, - mockedRootDir, packageMock, + mockedRootDir, + gitRevExecMock, readUuidFileMock, resetAllMocks, } from './config.test.mocks'; @@ -153,7 +153,6 @@ describe('ApmConfiguration', () => { delete process.env.ELASTIC_APM_API_KEY; delete process.env.ELASTIC_APM_KIBANA_FRONTEND_ACTIVE; delete process.env.ELASTIC_APM_SERVER_URL; - delete process.env.ELASTIC_APM_GLOBAL_LABELS; delete process.env.NODE_ENV; }); @@ -186,21 +185,6 @@ describe('ApmConfiguration', () => { }) ); }); - - it('ELASTIC_APM_GLOBAL_LABELS', () => { - process.env.ELASTIC_APM_GLOBAL_LABELS = 'test1=1,test2=2'; - const config = new ApmConfiguration(mockedRootDir, {}, true); - - expect(config.getConfig('serviceName')).toEqual( - expect.objectContaining({ - globalLabels: { - git_rev: 'sha', - test1: '1', - test2: '2', - }, - }) - ); - }); }); it('ELASTIC_APM_KIBANA_FRONTEND_ACTIVE', () => { diff --git a/packages/kbn-apm-config-loader/src/config.ts b/packages/kbn-apm-config-loader/src/config.ts index 583dd8fc58b56..8771eb042dc75 100644 --- a/packages/kbn-apm-config-loader/src/config.ts +++ b/packages/kbn-apm-config-loader/src/config.ts @@ -7,7 +7,6 @@ */ import { join } from 'path'; -import deepmerge from 'deepmerge'; import { merge, isEmpty } from 'lodash'; import { execSync } from 'child_process'; import { getDataPath } from '@kbn/utils'; @@ -310,10 +309,7 @@ export class ApmConfiguration { const { servicesOverrides, redactUsers, ...configFromKibanaConfig } = this.getConfigFromKibanaConfig(); const configFromEnv = this.getConfigFromEnv(configFromKibanaConfig); - const config = [configFromKibanaConfig, configFromEnv].reduce( - (acc, conf) => deepmerge(acc, conf), - {} - ); + const config = merge({}, configFromKibanaConfig, configFromEnv); if (config.active === false && config.contextPropagationOnly !== false) { throw new Error( From c12f02cf166284d83da66b59bd7e1204b23310f3 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Thu, 4 Apr 2024 13:30:48 -0700 Subject: [PATCH 11/69] [Fleet] Adjust add agent flyout copy (#180004) ## Summary Resolves https://github.com/elastic/kibana/issues/137639. Adjusts the copy in Add agent flyout per discussion in issue. ### 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) --------- Co-authored-by: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> --- .../agent_policy/components/agent_policy_create_inline.tsx | 2 +- .../agent_enrollment_flyout/agent_policy_selection.tsx | 2 +- .../steps/agent_policy_selection_step.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx index b3f06abf72e12..74a71347b41f0 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx @@ -114,7 +114,7 @@ export const AgentPolicyCreateInlineForm: React.FunctionComponent = ({ ) : ( diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx index 310f441b04245..a3216d9c68404 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx @@ -80,7 +80,7 @@ export const AgentPolicySelection: React.FC = (props) => { ) : ( diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/agent_policy_selection_step.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/agent_policy_selection_step.tsx index a0828bb72f489..972fb4f2b5df3 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/agent_policy_selection_step.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/agent_policy_selection_step.tsx @@ -34,7 +34,7 @@ export const AgentPolicySelectionStep = ({ }): EuiContainedStepProps => { return { title: i18n.translate('xpack.fleet.agentEnrollment.stepChooseAgentPolicyTitle', { - defaultMessage: 'What type of host are you adding?', + defaultMessage: 'What type of host do you want to monitor?', }), children: ( <> From bd2d9e6016fe257f05f128874b19da257a13bae3 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Thu, 4 Apr 2024 15:06:18 -0700 Subject: [PATCH 12/69] [DOCS] Add description for untracked alert status (#176974) --- .../alerting/create-and-manage-rules.asciidoc | 63 +++++++++--------- .../images/rule-details-alerts-active.png | Bin 289583 -> 309716 bytes ...e-types-index-threshold-example-alerts.png | Bin 236336 -> 245802 bytes .../stack_alerting/list_view.ts | 8 --- 4 files changed, 31 insertions(+), 40 deletions(-) diff --git a/docs/user/alerting/create-and-manage-rules.asciidoc b/docs/user/alerting/create-and-manage-rules.asciidoc index b1a99f856546b..35e554b0205fc 100644 --- a/docs/user/alerting/create-and-manage-rules.asciidoc +++ b/docs/user/alerting/create-and-manage-rules.asciidoc @@ -97,7 +97,7 @@ For example, you can have actions that create an {opsgenie} alert when rule cond [[alerting-concepts-suppressing-duplicate-notifications]] [TIP] ============================================== -If you are not using alert summaries, actions are triggered per alert and a rule can end up generating a large number of actions. Take the following example where a rule is monitoring three servers every minute for CPU usage > 0.9, and the action frequency is `On check intervals`: +If you are not using alert summaries, actions are generated per alert and a rule can end up generating a large number of actions. Take the following example where a rule is monitoring three servers every minute for CPU usage > 0.9, and the action frequency is `On check intervals`: * Minute 1: server X123 > 0.9. _One email_ is sent for server X123. * Minute 2: X123 and Y456 > 0.9. _Two emails_ are sent, one for X123 and one for Y456. @@ -131,44 +131,25 @@ For more information about common action variables, refer to <>. - -[float] -[[importing-and-exporting-rules]] -=== Import and export rules - -To import and export rules, use <>. - -[NOTE] -============================================== -Some rule types cannot be exported through this interface: - -**Security rules** can be imported and exported using the {security-guide}/rules-ui-management.html#import-export-rules-ui[Security UI]. - -**Stack monitoring rules** are <> for you and therefore cannot be managed in *Saved Objects*. -============================================== +When a rule is in a snoozed state, you can cancel or change the duration of this state. -Rules are disabled on export. You are prompted to re-enable the rule on successful import. -[role="screenshot"] -image::images/rules-imported-banner.png[Rules import banner,500] +preview:[] To temporarily suppress notifications for rules, you can also create a <>. [float] [[rule-details]] @@ -189,14 +170,19 @@ image::images/rule-details-alerts-active.png[Rule details page with multiple ale In this example, the rule detects when a site serves more than a threshold number of bytes in a 24 hour period. Four sites are above the threshold. These are called alerts - occurrences of the condition being detected - and the alert name, status, time of detection, and duration of the condition are shown in this view. Alerts come and go from the list depending on whether the rule conditions are met. -When an alert is created, it generates actions. If the conditions that caused the alert persist, the actions run again according to the rule notification settings. There are three common alert statuses: +When an alert is created, it generates actions. If the conditions that caused the alert persist, the actions run again according to the rule notification settings. There are four common alert statuses: `active`:: The conditions for the rule are met and actions should be generated according to the notification settings. `flapping`:: The alert is switching repeatedly between active and recovered states. `recovered`:: The conditions for the rule are no longer met and recovery actions should be generated. +`untracked`:: Actions are no longer generated. For example, you can choose to move active alerts to this state when you disable or delete rules. NOTE: The `flapping` state is possible only if you have enabled alert flapping detection in *{stack-manage-app}* > *{rules-ui}* > *Settings*. For each space, you can choose a look back window and threshold that are used to determine whether alerts are flapping. For example, you can specify that the alert must change status at least 6 times in the last 10 runs. If the rule has actions that run when the alert status changes, those actions are suppressed while the alert is flapping. +You can mute an alert to temporarily suppress future actions. +Open the action menu (…) for the appropriate alert in the table and select *Mute*. +To permanently suppress actions for an alert, open the actions menu and select *Mark as untracked*. + If there are rule actions that failed to run successfully, you can see the details on the *History* tab. In the *Message* column, click the warning or expand icon image:images/expand-icon-2.png[double arrow icon to open a flyout with the document details] or click the number in the *Errored actions* column to open the *Errored Actions* panel. In this example, the action failed because the <> setting was updated and the action's email recipient is no longer included in the allowlist: @@ -208,8 +194,21 @@ image::images/rule-details-errored-actions.png[Rule histor page with alerts that If an alert was affected by a maintenance window, its identifier appears in the *Maintenance windows* column. For more information about their impact on alert notifications, refer to <>. -You can suppress future actions for a specific alert by turning on the *Mute* toggle. If a muted alert no longer meets the rule conditions, it stays in the list to avoid generating actions if the conditions recur. You can also disable a rule, which stops it from running checks and clears any alerts it was tracking. You may want to disable rules that are not currently needed to reduce the load on {kib} and {es}. +[float] +[[importing-and-exporting-rules]] +=== Import and export rules + +To import and export rules, use <>. + +[NOTE] +============================================== +Some rule types cannot be exported through this interface: + +**Security rules** can be imported and exported using the {security-guide}/rules-ui-management.html#import-export-rules-ui[Security UI]. + +**Stack monitoring rules** are <> for you and therefore cannot be managed in *Saved Objects*. +============================================== +Rules are disabled on export. You are prompted to re-enable the rule on successful import. [role="screenshot"] -image::images/rule-details-disabling.png[Use the disable toggle to turn off rule checks and clear alerts tracked] -// NOTE: This is an autogenerated screenshot. Do not edit it directly. +image::images/rules-imported-banner.png[Rules import banner,500] \ No newline at end of file diff --git a/docs/user/alerting/images/rule-details-alerts-active.png b/docs/user/alerting/images/rule-details-alerts-active.png index 295cb263c40ebb6d2a6d7dde3448587bfc554e08..b2a5332db2ae981acee81c05860c027b309982ca 100644 GIT binary patch literal 309716 zcmdSBbx>Q4*DeZ_778tp0-?oS0~B{cf#B}$?(W(a2<~ph-Q8P?6$%u0cXxtw(tGZ? z_x)zheCPN6d1iKI_Jq9`$=XYw^{j*{$cev2!$(6vKzJ)DA*zIcfLeoq@KOr(75p8- z5bs9>1Vk%K5fKGR5fM@aCwntX8&d=X+E~}vE@@#!oPKZ^R-&lV*!b$M!B*98=&Odf z+)wob^I4tt(wMS9ZPsLu{}e>idVQ8Bey6C7k6YkK9wE*LAhyw%tw z9a_Ko-eNGho$BogJzuM0w?&?7saeT6Mc~}OgGjxXi8DC>|J~v>4j`kls`X(>}WoB8lhpRdaSKYyHguoPT^^-=!eYL58Y&r zXaL3M9avja!#>;ZB~JXvgT_W5^c}_BHY@8+&C})_H*>3`>4Zsio=D{O=z$dTkC#Y~ zs*2)MXLxmLdixc4D-3YubDL^Nn#sx{(8JGB5fDQx5s=|$i0~Ia{Dpvk^bP5My@Oiw z?Zy8(e<}6%k1PzKG6)Dl2$G_oR6Gz5Gf_NnRPlnNFOh|5$r32PDu|q9DhOANiwfcV zz!+zQb_9+;LOy*0AfwZMQ`zhIy3F?)3+Z)^NdEl_o1vSzySe*`ja$6z&Bz6a&-tXq zbU8H>0(lZU z_+`q!`e%PH76moG`q$qs1Ad#OAKFJmEQEh|Ks6lR{yT*rpyu-+LN&%8a18#PO5pm# zs#(SVmmd&I!Wn*B{w>}2fA_%QDkL@f!SOF28)?io{5Hu8<$%}!Rx3h1pRNC;Q3{a` zzZU9=+b%-D{Si$f*2ww zDA;;Miwu{o`&TxTeZ;H(RCX45%szP%pZoFn7Zg|~v3#LSDxG-Lq1@x*9u^*+cqE1P zJ8@SB69I4j3RF$PTS_V_o>I;!fwLZLtezALgBQpV0EZp(>DhtPSAmmM4)@nYUN@(K z6Q3s5?TaQPfBc|8J{9;$p)p4He+th+_}CJv0BPZFh}EBu<0TSbQ|s+#f(vD`5=uSv zNIs@)Gv8=i{eF3|qcn^^b#(VC2&YNAsDf6f80%=ZQ&an^Ej&U>A{{^cmcn?=g(ZQF zbhXcwJ7GS;OT<@ifoi*4KT<+MI1Wbi8I^e6!4m&JdWwNGX}oRhjuexACy2`6Z1D{t ztljV@bw5Vhyl$JD^>y`YB+?il@@c9p`u=-1MpR0@RuD&ddA5qV1JZxuQh_SeF{R{5 zDuSFMKj8v1-!bdP**QPlytdTm{)~XyoQ)t@cWfR;{OLdRGE&CZCXz!xIxKC#T{;PD z=5l)yEVt)d7lnJqOr)o?fYV9y>luCjBIU6$CI0)4YqYK5boD_zx&P^p%hCuizY_tj zln?*ybNapkfu}$59X{nk8I?LQ4y`u3FO#?mMRJUEVD3N!RFB|*BEdT8WX2-ZvKa~4 zyVNWJQlnV%mo$IV*Qp&+Gt3)y`{VGxPlLoHND?&pJToF87}JMyE9GhpXdK1*qn$6T z;P)v7!Szz|`NNn0G>i+CVg*1UUs}8xN-uBCNvx%8xJ1H(|7_ZK723?z&Z*@hBMXtL zzFuWZFKuRd|KEQ5f5c^v1bAXr^T#ep}(J(Mr z6OCWMh1>oW-uS@6`=1JL4i^HtyC%fm(dk!$9{HVlA7Ly0E@wu$SammAs9LP!HR~Ee zq!d`+%{eJDAcQaeGr8Y4;H3)?Mg2RrJpZS_z?Xy`-_VeSzNe$EvK`2pzi@_!rvEHi z86(HY4ZLUe__rmOM*sqOjR!($TU)#P39)XgORC*cD+Cb{aq}d5VM(NUl4O)YP%!X# zsY~4Re3R^Xv4u{V`eYg+;BhJ>2}r!Ok7L#M_xB%+qp}6RdVacR)`dnFfl})fmfJmP z)hl(FGBNF~d-j@{bX!GdDs_u|ZqLJvhYoC&W!x`Xyspx^Cr3x4&v!<}Q`yX~(~O(_ z9$!)ENm1&P=+i5ZelOeJ=7?eaE?PfhASC2h)wN@euvy}Sx_l=OW#@%-ZX64FbsPQ1v6?qAq>8Qk70h+_y{?Gbp%!9cz_7a3n8DkvbN#8okD- zdxUiK*Mx-(j<=OBkGeYs?Ki3#DkO9daOFSQTc9D48bk}tS1vE4C!%j*Q~Sw^M-wO7 z{SpqWG48BBU8y#t7=GH~3TO4^JL!U9ynOj`u1rqx_VFHOIZ?=1Z*lfctJ9}I<9(;e znEprxPl?Q)l8RP)tJ{%`>%nAWu{&(!X9%X{QR`K``-xvzWMl!G`G|tcrRCpTGOU1j zd!am*ONIj&3)r8okmV>`gX?rgGO3@;LqJd2MW~qd|H;qmOQR z7FXbMzDdXHyImeBUz}n;Q5cIem(RjsGyB~*{DeQ5N;-M$Y=Z_jsz^RNC$B$>VV&|o zlBFLFcaVOqsOmpH*{*6KN=wskQ&^J{OSXm9omoAU?_k6zT!Fh`|agT-p5@$FQV{>;YAuUHE4 z#Fk6}0%`NnEY%Shonxn_NfF1B&RGiv28NPeBE6c*NK+H~Qhom^w|!l);njY_UL6_KA$ ziO+k;NT&}p_G8&+qtkaAZ}XqEe(0+vQ>it1?LAeZcl_(*!y;@zF^`UkNp8PcZ}*;m zs$5fKaAtn5X=R&srr5P*SrA=~##cbGWSq~v8Frw^mb|uXZx+b-U;KF0Wjg9`K2p2> z2T z^ooMQlZu%zR@5srq}J9<5ATqJ2Ix*a0ABsq!-am=M+@@y9Ri=PNw_WOof{Q7`7`dW zyfrm@Mv@rQ+1&T;{#GL^=y+q#Pq4^J(oc3D5dDKY2QP?$e`Q9Es56QouLuYL-1`OW)1eeT-rCoylnOf^1Jh8-^zOYcO54ak~h)e0^&LdG`f zlr4J)RcmE!9yEH`4TQju-53sQwRA6>SsDf2_T0(GFDJPDQHM<{vGMpon&HO{`7{>e zq{x7ANoD1$x(+WTOh+QMN}XRS+cw5at#2pm)a}jfq21&l1hNG&#(hb<-$tI z;B{&V;lkS9sOJ?+tFu!Pa<;8-yYuRA({-xhm;jy095oiS!J_AY625*hebR65{-9~x z32LUYntOdN9Ff=4#~*7OF{UtSaXvw0T*!PN%2l1h8qDG__6boKWn1nD5o(R@=|(RV zdkK2f^X?Vftj`{GO`$660_SwXWt-=d@kRcA8mADRzG5` zI`8f9Wizky<~xQ?2)B$DZ>ql1n&ZFqc;xUp3lgLYbJ#c+6%~oH`98DHCET8i7uj#I zQZ`dg;dj=3`R&t-V#r0ISepdwiSWo`oGX5BXlz5t1w_~odcQUk^W%j@_3E!N6djJN znK0b4gr`Na>op5jpDKJFC-$q8=h9{xm!iYDC7O2UEAFuKr7v=g; z{i#y59D8ct0?{3(Y4b?@sf?DCeHhe2(ud^y>WU+AZeh05H>87p>70nqo&K}Jl9Vi2 zxRYsxQP8;^UiCnf?NKuR3foQAM1eHT-SNHU^v{E1X6?pBD!@>S^G^Ot5WmBY9Fc3k z{E+bC{Y0E#->ZMr8Xg(1Gx+>tr)`%RgT8A{;vR1vFL~D+ExAFy$4zjdEJ?L8PBoQJ z?A75}Jm~?9p6X*Acmqg!aXmONL0GC+D;u5uY`-UkCM&ns(COb`E zC_nFcQsfb*9^Dia$FN=CEpz~)p6Wh~v@t1j_~uti4sC$zb2 zV`35gGX%eQ1Rma>bh=6+f4|tBJ)>)a2Gn1ev7i@y(x4C}0n27@E6ror`inJb){oci zI0pkUO#4@Z_5^+P$$_aIY!9+j+23pyE)V+^zXZSWm6qh#8rfLIu_oZME41&rmCCnc z_5Tq=wDIE$3j0GQ3<_>K=Io4G_I{?&YP}>$<8+lO)$czR%(`4AS*g0a_MJP*wgw7v zSdRt!rSNJ>Ms7o~#bZkJtC(!(ZSF~wI^5vBXH3{~y=xgyeV!h8+LX}sa~BPFU1r;+ z-{GboIYm160h8*!@`bn9{k3fY1mpwec3jV2bCD+Kc^rl|SZ(Rb3#~6ldw0bi;C22p z1|Cy6oJu&c@5Fo)D%I)4x!rMll=P!Q8lpf9mybG}Y>w$l*|o@wL@iL4S$FYjjPTOgyUj2-PC^FSfn`tR z79?QDf(rCjDrmWdiC;=&0RCv0zr;PA&6Im67NUA5_8)gF)>=2}O&(v*dwq=Jj6AZM zOGSaHL3&eiySeeV`4lxpfBRmi50@wq?_j3$><{TJg$dNOA_1?fl>0cPB0K!rb9~nN zuw5?th)n5;tV2A1CVWJZL;_dx3LBeIJ&*iGN^0U&WobB6>!Os^cZ#uFYR^N}JPt?s zaxXe4e#+@eSyMy98_Nm3hXSmXSO%bNzud=?lyOM>MdqsT>@Z{;o`3jLBciL@Ejk7_ zgQU$a+@a{|@w>k%ey9nOc`;}X@YPDEU|!L=%r{CGswBNnm2r zMCANV?O>=^T)e$tclh(MKR&r!z;_$eV0TaHs70RFhm^ED+O-Qn4Clp*!Wnz|#Z<43 z3S6|!=w2;IzAMo9o;z}oy~SX8*c`fFdD&Kk44Qv!6Fx7ulyxkbj66D7%eFpmwbEI) zfY(~FGisTv!GFg6UY`NPuU+esDvpsHWD5s8loFctBHp8Ga95<#zy)|#8{{}A7Zr?e zS}YhY_#&%SX-YF{H^63h(t_NVf=-VXeyuR%2oepqJ8pbpc{FZ=A^1d_*w4Kn9#F(ZCZ)HrE z1dc~Hg(Q*a^h#<{;wfIsY6_kLkkyJHTC~9DcC_OYVpD;1gzcyQ`vOScZ zUTe-KZV2u2=-qp+@yt*z+5iPJd;pdo)@e|EB#kbq6!Lp^VK!L%0#C@Myo$3DGstF@ z0#f$AZE}F>gm(aLzx!&&NB(>|0TRvN{jirt!0PJTP$fP4S0!+vF0vt|sy?U(ZM~ggjs`o~Wtp`lxDKhW>d==}MkMXJXoZ-#x6|IRkMCE>0 z-Gg2umOPq7i8BM0Es>1uA zU&iSg71^I9)EdzfN65HoDx%259W;DNQdFpk1{7DHM~&_Nk=Yj>{HRYN!;r+BL%0rB zU@b(`FviaBS_-MEB`E$2D%<_((X;X z;dK7>coD1r=V+nHayKT>Z9yFBT~Thk(3p7#^PbAN5Bw5BIDMd+6&3|FOv27Ae4eZR zr01g8p{3f9qtpOu=rTWD$*)|08n!$&vANpknB4Ka>0KTwm2w z96$d0>UaXXObmYdCxS!>SiJ<>v^**S1A|_IW-3?6>jJ1k@(h(#@PJxhqX^~w?(Vvt zpYqsh&T#OJ{8+WBE;forv~ZH?4gF@nd2VQ}yLWDeY@p!{+OH*NxwGy&7VJ2GZo#g> zGMgmALPjU`$(w%5Vly<)rm`CX7R-xbULX|JU!VWUr;QryyGFp)v}0jAa0 z7*-D+soWuATCQ_DoZWIjtEt(^Ke>pN#edCGvg6m|!aXLQXn7@&XPZ9FI-%^N7G6vb zDokuxTDQ*zSWnl70^Fl-*O%=>fiOR5;@KDfD8?kf$lO5+R%jY2G9GjnfIsg6DRIL?i$DeW#4K`uPlchz6uR$LE$FY6P|tQ+FU-Sx@21|O(Z(nPs&NJ~zbv1qWwtia7ZIM!g5AbN zYA`nGhEB4->?bpBUT&4B=!5hE1A3Ls@g7T&$8{-_USmItqvQPo`wpSp{ha)zQW(M0 z9_w}b;n8U)%-~`qmo&D|9;le+u!ne^* z)~~y_b#YD*-9)Rw%5cUOmet{QP|lFXZfT>NkaJDsJGy$JTOgg7&`BZ+Ir=6RNuGaG zuHB_L7@gVba!kn>6?Z%d5nsHw{Q*Z1hLEZLS^X@_k}@KLWGIX5G0unfM7Zpzzz8uh z9*M+)52JSY->}DaKtf4$ijzjq17~b5$3CBx)T)I9OBEWMAswyG;-VEi4mXs#I2&g* z&VyOPfwy$U4v6b+?NuDWk;6sns07_AH3*eb@|1XLai#;iZM($MNrSg5sPn%~R!6UezE>X;~gYr1wkO+o6FL#P`3eJ@{{CH5&%eW}l9A7$D zkdl*5tABJ_W@`1`5lm!OjuG6~6S2a`6lcu)*&heazQ&)V-Qj*0-{E#lKME4OKM_#P z+^*ua+IQ*?MMlG9Euv>rg+?xoC0mSLzYmM*s>~N*&>P6MN<_=wr$SQ*(0G`ce;J#* zr41PVe6$_OS6CXPIOf8A9agK)0Se%qdac}uncXJURSB-NLD?CVWNxA@is%P8a1uk6 zj}z-wEGqM@SY4?(BYsORL^bh5{@$iIb2&Z4<@Mp@A(wR!k}G|u7Qh?sX*#;kKQ;D< z@;tUYk!*1=hK}RP{%KJ@$bf~LxuIMwp%iC`8&F$5R}kV0taf0>Z4@M;AJfh(O)0EE z)8Iw|plfV*%p}39uQd5aahU4pp88~t(xu3 znLqhnz^uLY+mI2qz(&2|gkMUfx@ptl)l-$?D6zbG5vieaY*$gAPcFg_^-5!WOfWyQ`zo}#o1Re!8N{U+F z6~)EXG#pGzKND%gacG(3F!}zdBU>NGlP1y6-d$9fhwuT>|39?}5J1WZw&OI|$_F?n(Y^riOE|)zY2FZ!VEOol*aVJp~G$x(M$UHwK6J!YzFy{`W z__M9o#tSFpT&;y@l|w)o`w|Drl``i>98K;fQBl&`{fd^AdR=5aMCPE@wnP_gKs_OD zZZt5qfsU<;p5P;J7o?9}fT~_UY`4-<29?xE=r(S$*UYXp9V&GtJ9=O>9}$&&UM>_7 zHwO8{J$2-v+FuiL%T=ULDSoBb3TeI(#cr|@=Kg7va;1Gun~OLVz2l^raWB#@$FNf+ zk%Q2Hc49~Epq2kYv;Fw%_yOMNOzg2hyu^gf=tGZ@XJ!~gvHdrjfb`EG`0mAR7Ys{9e-+A-`c55E-J@G-%kb| zu)DWt?iOA*+<*66$J5T0n8*#&xQ3poK0A;_yuO4LxEGeIr_-Ilf_CLO)VK2+w_v#5 zMtj32(-WBsu!i2AuJ=zJ+uV`aZSjQ|w%aODR-#LmeT3^(XzorSJHD8ltwqdpu3V~8^Lg)=p`MOGPPYtz zF(`YT!zi88UQwxbR=S|a*Z<-OXOD>|>?gs`SK-f4O}{{9#a!+VYCYXvVeh)_ih}G@ zu-jqE<*XQyzE4hc?W$I*3f+(KWVy^RHSz+Vvn>rvKoIXXHBETV7z<0i%be5H(%wD1 zO`!*%)JHu%wftJ?;*Wf{)3p(QRN}0DYYn>z#U2m$pJy>`j3!J3i-Q_d!1fqHUy&DF zhUqx&_@4OuFh-{G11JSN zbG`V60zOjWz4Ci{DYDn+cYEcIf9eIMrzhvo)E0P=8(n2$@K;77kC7wdgbI3^d|2fIwyIOvm;(2?-dF0(7asuE^Vn}55PJ$Tx)0lo(Dh&$;{Iu0iDm1<@Qci z>giQ!HAUoQfV4X2gg@r)4D6Vng$-YtqzAjRtLAzjlmk2!I^))7j5JEx3jWrf@Jdwx`q#7i5u>j(ICCC(HF5>FLO$2j)qBY7e#+ zwyabvzz#BqF;}15j0tvR3(7lxNUkMbx`PCg9@C}n90>6ZtT8v z949(O5nntcKmW-c&7zFr&oS3W&k>5idN*6A8IB26VZ1Hz9aivWqJ<$Krs4=&At!;C zZEXR85C#L!gE=i~!w{6h)LbTcoo2BmK`oOeOrUuOt6$>MU4n|qP#h1{@YppVu-4a% z*Tm7|&KY=>b=~y-_b^|Q6f&3lapmy{l%^?r@2WlLc)r0lo{8MY0<+YuB25_KWAgqq zfZk6Q2PI1Q2YQ=+#9c)2TcUhh@`etpDXTU=ZPC`3A6O9G|J=9eT~4Qq*uo*05p*2X zZ<6}*e}FuTf`0rw?KvVeUlIu!S5La0@}t3C`kE3uK}vF#%5`RM_ZNz|D)igp;A0%t zNe1Q=-3}{o(MG!`dj5Snt7qI_%E@!`8cn*ci2G#evHMt+n8#iI#9+Q3V z#?<_Q9X%i%K@|?1MbjXb4e52S^UIQZfDJ(zb?P-{1ZZiYH^fZF1e`Xt2WFI7VR|&z z^DFJ1%DlEZCML#9e>%N33e+^M{6|;2x<+zSO8Q3tU2@ridB^jv}1U1#1+Ko2T zy(OJ+Skrj38OFE$Me85q!N7W&Z>Sp6Hf*mow8Bt{GL~r?B9*(4H`$oK(uCo#fhcPl zv5Slt!@8wEXd`b~kb~qDBT3XsX_ZFntrg`%NsWj!O%wZ)7jT$NOFL+$DueXi~eQ>%z+jhNZ##2az*e@Y1ww$u_ z!K|MTgii-crKyABg4+F)Rm);Ee|#=Kt$48?RRGzKulhD=lnSa_cxhZCTFA%0T0z2Y zCi2N*>wTT%wYbjcyt?Fd8>B+V&wonYV;a^31VtYW>ox2~%g;|7!WOVD#^wj~<0s}U zhN_Qvkmw}IOc)LJus#WoqFe0)X z$c@d+yd`gV=kJydm5?muC{~=jY>B(yWu>B~MvEff+zLWI%Z^13w{C)ulX~bZ zOv+QCSgdDdlB|_DjND#>H}f$Z-m&QA3(0iKX=!4dED-*+ASbz@c(A|VmOwN#;Co5E zM_@*;_=jG#3Oxp2T0)4_wU(jWMt@`ulf0|@Jh;etuEU&JwM?tG52loRi-MFcRfZ&} z&bqy^A;R1-nJjqglD|HJ)PXR@X}{b)xbtgeMW1KK=jmXE&3`O;k3g{R_3!NG`zwkDtEEr8SF`qA!v*k(@zhbHW}U>H-#%um>%1_~z-g1Rvq*b^ zGuDcMs?m1A4T5aB)GrvTCp(QFJ}I$m@)w~|E}|)*xPmhu=EylxiMu$+Ra46a=5jL2 z%fufYPVic0;TYa7NASo$F+6_p@7l)N>FHx| z&2YNgZ%8k^)^ZG6Kiwsf<5Q`WVKI%)i*TraHzh2BR+et(TcuIStxB&xK54%8`POm> zBUVj-dPJpKLb?vq_jCw8Fuct~#k5}iPMFd;zXh0d&%i;2?_W2H~jl0!zp+2LQ z#RjOU9Ne3jdMW3>RjQC0dAK})Pe%GvaOc{=$7Lat>_qtTdR!L${?y<#MaEr&HnM3#~#) zvpP7#S^~@m;EvYldV7nTa3=h^)6tyMbM)ZY!26 zkS@L+iGwVZy}_{_KsugTa|=~5E_Iw|Ngb`&k9PM&Dj{<0)fC0MO&#)1tD?N+EZP3G z9{f~=sWKiqfH5fl;9LsSYQ;4LMFxo#fb8ftvp3zfhz~ zvF8vgb(?&ggcg``Kl!dFXPvqFsOA^0N-#x{TWK^6$M-*&1i5BjJ*BeMOhfDz%pC*E zWizRPwUE|tgwapNo5e)vp-=ZGIhU>{#Z{L|u$}CSg2KU>Q>pSOrAp4eMS0y8Nuv52+XxD$b%ciDIzO?GqWfkSnR{QU91lG}2$MLG z?N&Nv(Vv_ide!*qMlyMMajT1;+Jznm8JNcxer6VZS>ps5@H?!Ms$z8uT8Bf6nW>D{ z+`PY%mZ_Ejr*&guEr>WHAwPoO67+W2FQ~w4hlRr5dY^~@s>A7^icWI}v=+dLA8F9% zm-L|3I&(M|ByY-kdakUIcISkQ!z$%D-b^udkgpkbpW^2tYkK(};;wD|DL;0>Fr9W^}e%#_p~P_LrJOtg;O`149y;=>kQAp$b+!Z znnhdC@fe!Md29#eIDM1?OhyvG>~RzQk(sV1i0YadKIsm5N+wb5c}a(KoW)|4xRH01>@OelMfke_F2w z2I8nx5cQE8t~*#@&$!w8JlE{I15~1G@eBW`cK$%F&CHKGb}1#Bi^# z=Em_ec2m9wFbdB&2$j_>*n6Zjeek{~c|RQ)WEIq9ujbX^OI2i9r{drKC4lC&M+0li#RHz6M^-1HfL!BiA}sl6aZ&b|Yjg1@ z)=^jvWBd!MIAjtVO9*k@ zv?qyCo9yUm^@p#eeqK}thVb+?bP`O&=URXX_KDtyCP+*_kBwi)3*2uMkeUG|!V=5s zQ4j6hvBq9-w+1P0>~gY_1HDTKK8H~<^qcl=?P|!o9ZH>az%U%^Ux?H3-LQSHs;`H$ z`c&HNzV;V7P;WQSh(E8>;)&&^3BYXRMcQw8W8fCp9}Z-m!mXKP#qzb>snmrxM!PBR zMf|^9VmNhS&FZwd>4v^4sE7`m&sl0{8}^@Bq8h2^g9e7xKV&+O>J1Zl-}1h=^!?Bixj!g(Oq%O{6vA_D)wgb+}<$*awN%E_YTXvry~R%j3u zJOHQ56=lVj3X7xst&L+*#a9hBB*-$n#AMl=5A(N>aK(>58mU)mFv(n;G|mrD&Ua4I zG_^!f#1!{A|IX%Wl6>RLbWE;V5(6^gsglH2X%c&>)x>ja7z;;kMa)N2gP7o`E?pZ| zTk}G*zQ7QfU)APqS(o}sOFT&U&qafJp;HS@4}CIZkVY=Mhc1m9Es`GIZ)RW&WYv79 zse*3jn&*%OfkZ*cRnV34BdA8VH15QKu+ETRPk*UcdyC&=VI>J#M>Ik>Kb&#*jZpCT zS!b7skvWb}n|8+nqy2qlL&sQX;S!Rk^LXnQ$3owuzN0qG`nCiIfzWQJ0kDeon8u+) zSk^Zmo{I3q$Al5OCWDa@wMkUm3?$2oK<<6AuQXSpR{6C*JY9R)yyEFJXZ5R6!n6uZ zTHS_j1SFb_arWOyj3NP-UN|Xv9A;?pYwCzXYw^emWUq2f4guCQFY@q_btqRGx=3^YjjrRO;J_|Ool#r+EJS564+cF=?h_%zo6XUSduQ1*l{{=?17`klK{F7rI zgpN1P(5T&)o%us#SwS!3uGsJ=YNA(Rd0%7s&GBXL^qraUXGJOh521YtP=f~ zfIdzWn9<2o>}kA%1QcxjDtfUVLlfPovu8vNK#z82<&A=yh-&a;;X9+V5CO8U9k-Uf zw1;)i)lbh$6$>k!zB9Q{WrPxdZY5eE^7HYpT#P83pMAoZQ4c?yH!nXCc5K!{5#r^c z`tO+1c!J+YP#UwmM&SdkR+|&5d}4C^Y>UZdNB!E2rZ?9g$x($seR$?mg0&n`kL70- zz?&lGTJyQudHttfM?2Q&!!0OgeI`xP;(DiK?hX?E{JCYv!PrtxQH|j-oGV(}$MYfXpq)gxFju_R8AfC6VJ9EIhnY}z=w z?N-2yq}RWU6^oXBF^zj{oe#-z+0Q=T=U(-5qI!e{JleBl;g5+tMm;&@uSrl4r-iNA z9n6%OH@_{qF3~Ncwhf& zR4jxICd6ugpTQU)2Wke-yH(mT2q&WB?dGq(Cvu+eIlJ6rbGb}G{Xv(j?UAlpsiPR` zWa456a!7fakl89A#%7jLFHs7jS1qOe%D6=fClEK#|Lp3g(FhiHb@|TRu_#Z^nB+>5 zVI|Ucv*?huDoW!RHjxHyVutp5)`6!W(XnEDb;E~Qw8p{wqrFWFcR3YWkFD8 z&$t7TU(6U>Y!B&6WOUC~W8j2Uq_gx5D0owZ(NY zYPt_t?lk~`S}ATvd{*>fT^^8!X91ooEIc5pgdYD!G3%K52!mgS8*Leuu0=0NuSleT zjye9vx18`EpiuQ-i@cdPeHoj4IE-Qg<)tbB9qf{4{(w+Kv0=enD&VtQY9oGxc;bZ| zhO(t73KEB0zHkrKaLbZ-ifs9oX+hz2At9-G-&as<8>yg-cQ3DBXuo~TdZhmhtBec? zVu%;*d9VJPmo=Qhch-6%if4*h8|wF5Oyqlh;Ku90zHC+;$v1-4l{Eb}k7aa*BHJd3 z94Y-3Eqq@H&NbMnqEu{Bl%_jdXN1q2W6C~zXS1F(WmQ0Y$$w64 zzW1p$ZzPcHUH*E!%=X+da8yPTD`T5J!9^enqJP8e%e-J-n3L)`zw*a~GL!8qw7|6t zcqub_92auvYln!qtrI9_hDS&UV*C!rVN;+%ct70_7a{E_E~l%X=9^9e)KOIl&t7AP ztBF-85b+n$C)i{nFsOlpR#^fzFw%e zgGeVaIft3HKzFZ4PPuF!m~@~;KgFYF6Ap0suT;!C*4gQPc96iH*jr9N(*C0~5DKPI zkjYQr0b~+d!sf5EUDQR#xxLmSdL2WOS(*8@Rk&x@2H3R9lsnqVL1RgKw)b1CV4dzO z!o42xhwD5sJsw76`hCuskXJO%#|q^ZhVk%xMrn$NsZr9`h3#aLbZPLgx^5NgCuI$K zw`RcxL3>5p|05!)a#1)Lf<|lJSK>zWA=`fH@UgGYc|BQx1zn%3w8jH<+Yc#{9w(=w zZFKy6$-LN^Xu}%Mi%qL`qh3j;N{6h&swvrVK3!~U_;WLAEU$&5%9~zP7W9RPp!>a+ zzJd~HVlg$TJO&_^){~cm{^i)g5k2Jz_idBc8Il~oPLru)`tCyc2P&B>eFi zjJa=~E4?GfZeie0Rgi2$aw`1+k%Aofw6GcW^3^LTuDZXrwz?|-;*1UTsa4K@RD^&) zPrSZ;tj|qXU&$e1-)h&^qz2itz6dN(i8AmDj(&*@%4F@!CILQshIQyH0UJFfo2rKwXUPfmpY{pEf+@io#Ygvd zk(9jH)_%oh3g5iPtBQ@i&L806hxkrv-cO4U)(cCmrg99i6d{`Y`By*O22uG{tB@nH0esVt%)(i_CR%R)b9XaB!VXuj_^w%V^Nc^*UTDXR7~Vis8U9o`w@`K1{uHUnYE`@aQG>ROtXan(mJI#h0 zX6$Z@$agUP3;#3$p6!k0rn~`~X`4%AxoJVKdoc<>_(V~_Skb7iQ1-IaW-vGRcaE34 z6sjz@DnR>Sn$h;ImdSuD+-iipz1Z(9fmm_6-q|tZ3R@cgI@60FiWJR-G>(Jva2Hsa zN~I{_){yoanBNdv;QwX}UWV*+zokN+S$u>^6iQtol&cb&Yn7Pe4&N)H4VO^On?HW+ zpOj69$tvDkZZ!J3Y~Flmb!7Wh*!h(@bBr-oN9@k;5W$of>Z#a+a=UkJbvYQ?viW5U1r3LQh;$x%M(TWKYi7wB9x2-C^i&t6W zJekc7k$y`Kp9Pylm_{5O%Tgn@71xJKRi zP*vB&plaE~((6{w3BtzF-OW1F#OK`Zy}-i{GaYQ}zW8UyDAzg)OrHWEh)dp=g9_`o zM}~i4X5jDaGEwF~Np0Tg6eMp5*+ENa6NhIpp|plo6*PkT1lr2Wf=G5uIE|i{8=py9#3J#fTpQrKXt5}~JlQ*N zNI0_*&R?%w#|9YQeue7&JX(l<$?D_p4qSuSu6zr;@Karx^neAQeDKL2%q(0`*3HN8 z98PNh`oVf1t!~3qfu`4Pt!`&oD#HA5?$*^P&hg`&jskp*@E^;~VyFoqJ3sEYm+!O~ zG#A?g${CaAm;h$LXdOU_ed7_Y$wjqh0&O^tbCz6ohY%l(xJJ^nX9Ib2RK%;~=NB{- z4VgTP7{9Ng8tg>gevZdu-Rs0cn#KP! z@6VXWoymw?^8M{@6OoHfe#Ni&nULjUm8mVi#i>&wKqSPPVn>TuJ3j1F!qDi${rdM4 zP6d~4S6l2>rvs*rhbj8BrgPNDjG9C};-4=uUXU~W;x8Qqj-xgb(C*b=&{Je5ju37r|(o*t$ zWA59Jw|tB`%_)L6r`SzJapSeK@a2z=2PyEK;k);Oh)-$2bj(CP(9QY`W_V_|CL~ zgv2?f=ign@9W(kJD5*%un_K~JSlS?=t;2p!?OI<8&pum$>+-39h(IvL(ZU#fSX$cV zwxV9CMUnNV&0eah*?Uyak_9UBm8k87_ctV%-@O8y9W?riXl@>iRGB5Kpq3R$|hnkU&Wa*;!*N}@9 zwYQTPcG?+qJz)#o5Odx*rFQj3Mf>qCV?xr}Pz_rx>?O0DH>MU`FLnVkLrEFY*uiVJ zg=@n%5=OXWGSa8pQ<9pZInmklbZGBdCQHf@o4tRgpNYp|o`M(+`#FF}6*_fH)cu~F|Rr8%J3C2Hp3D5NJMXk)tBqL#ZWwwgmzZgmH{FKD1FWru{ zfxNE5X}eJWb)rDl^Xsk30d(q|sYF1!?EAH4Ds8rnBC{4(UMF0Oj*_B0->(OD`K1D{ zM9jmnZH7}=Xk7Ru-G@&A2v&RxGPJ@QDfgv&#jDLx>y;+9Z2RNb{LALZM&p_UVdEO) za0L^}oP9jMA%rKWe8ONn=Ct%6UpmNu@aQd<_-*D_fRK|E$m>PfkFrWY6_H&V$9I3Lwa5B*Ui3%sr7VqW+UQN`{YooE09sN4v5Vc ze~(i7RlM%C;9Y=1Z3%&|7g{=oQQM|bi@4#1J6KVh_ibHlR`><}Tz$OM;;rbZ*+ftM z^#Bp*&mGAIX{vOu5#mwRZ2!0sFeLMfO)6EpaB4?BBlk~IePb21-eH-V)z*-l@^bY(mo3{tDlgC}BEibVXw7mwrY5tQKx@vE#`QW*FS~l4t1W~Ia^Ics&gD1ClwE~*qJA0YK~YgCg#^#JDR3BS7; zx9p2}byS?XB%nuEs$7(G`pa8GgCOuFs;bh{Vswq!lw?go`+W=I=)7ox$n(C zz6(*)$p0wE#zcr?%VI+Vw5UJmG;c502W zF+qth@=?U?i)NqbVFaP#O=3ot^3Lg-jpWEAW{67X&Zsp;R55F=bCEB#xhv}tyISl` z(@Es_bv<@RNuddw6l01Sr1WieXfnkY-M>33b38oc(Y-MLMaV@NH!0SPWq+H^W82}D z{*+-fLV{Mg=ze=xz6Ik6ibfFCv~>?9N(Hy=d{1sjAV~99t*v%KW9rfY;Qq{3$PWE3 z59A6TmQ$ir7QIM=$Db7;UfYK;7{%Tzj05eX2M&5Qw!fT%y*qD@?)4n84RHSXY|xVe zQat#qy13(_QOb!Z1$0dsKNLd&K*g<*b26Qzn@E8y9<{;&Py(kGd-uyPV9gESdQeJF zU)Fpy-m0k!RIkW0LpM~OB!wI7YtXTgO%>y?MDZt=WL`*)|NLBU+W%OYU5aMBPVDK~ z_?+`VxTy{q&DVhZ$@3`L1L()h-R>jF37TY9+(L1|xpq*ed_E!G4p*gqA_hq~d#DES z2t{~E{+UVobFCJ;Hp<3{(a_scwGys@{0J+Gp7+Efflv|4$g21_!?!ARR+j*+ z2hSEx5rKaDG@m;2f@t5x*QB$pa;#B$3g6#)7K1X`taLl*5*ae?a%SYQ8%)|X_~6E8 z$n({EOiOLIpL~4kCd@&5%F5WiA#z9&eTa%b@=B82RmwdzLHE? zh4$`euUO0Lvo0!r{5m@Ck$aoS^RgHe`9Y%CST~zG90pI2r<9Ssv>El&em{_rriN0e zFKQ#Z!nCYNrG z@A{14Ckl*S56QOmPTCPWzFlHTZC7M*7a1mf{*ZO)Z!i+!$d+Q%3Q4@v;LbCVsS@4r zuou#># zPl;83 z#sWIEL?ycLqDI-RewimwN!?&rYkm+9jcF)jvKg|5sf5{RE8f=R6iCNQ0@3tZ0$Il3 z#?Rb$^?na;=c&HZHZ$1p0|Xlr)7$rB(Ef~%H>{Ks$OD8AAcx*45>8RaU*#YNhiXoI zqw&y)5YwTg3bFE?JL!b^2Bz)?o?`vzzQ~8cRiWvM1#*!53@(DAeSQ5+R&M{-cejm7 zlu4>(YT+shPw0W(^8=uPt%@$nGvwOV6a%e}y@ZwU<(N!XIZO#Ca_~G?If(w(PVTPhR(CwaLWy@^tQNl2AN{t+mXnutir1<2NPS zKde9}KvDau>DL=StP<$na3V=fsA6kwE}A;BO1H}LJDU_x!km!kbVu2)-jyh^(s1L9BY66|u1+NqR%%hzYXwXrxm3F%zjR9*#hF)1GTu(gP_cS+wO?<(3b69g;H+X^L zYnm1}vjpv>z^{aNoev^2dJRgW2za8RqNv#nstnrudj~$kJK7ya=^SuD&E}YOwrZY8 zr4n)gVX;l3cdO!U6+>FM^MczdaQPr&~?svSos|5Gdt57-9-HS7m}bv^AjqZfK#e50A4N@rTD%=f8j0YM=6?8X_uM}b zhrujkdG^!oi?&s@6Kv<}1A+D~`;TV!!Fm3kd8^B;?rIMIss-2v6sVmBzg-D{vyBe{ zxrks5A0QhgcYXc>`)givvvq4gi5Om`4>2NBE7phS2zrv=tRy zWH?nrOaYJARR<>h*SGgB*xwCr6ghVSuB3{U-LJs_!sFdI`t{B+Ku`5fv(`bfkFP*^ zXQIGF=Vi9?4qe!n^SAsC2`_8J#V2_aaLiYHoxvKdpmj_CZ5Qj~w_v|H}T=W_l0;z%^+?*3jv{IigZ3W6^rQ;>IK!yTJp z62jW#A@C!*H1s_`5TkN8fE_5Zcr=-7g2dOiEV3?}f zoh&UlbLiS1+9@*;XR_+NT;_L;$>O$}9AluT zef;!g*}kjs$7QbC&|WaDyTg&Y9R8JWzt0EMKjpXn+dGW8K}2#b7h8wV(oZC>Op;{y zLA{#XZM_PydrVtD0WvL-`z_OquVU7BzYeb*^GbZb)JTN+2Lw&%qr$QHsh9ys$^rVq z3P?0k>~lbgB3VD|&?B~0kqkz=4x1Hlu_*HnQLoaQVs2tN#|}TLy9mwMWPRdgN;u0lc@6rFoPsHI|s;oubc4XWs#7!}cN*{Ojh08n6MNItz; zhrq&)W!%&b<{M+djYQAc89@AMjn=xNc*bhQAM~0=vzjGl=H41sXmJxy7J^i@d?3~C zlRhjO2Hp(wj=S|RRCwb|poC{rQENpo6gXB0plX}AfCyHaU3DY>FxMDo#XFe2>I{6+2L|g1PBln152`{u*^SbVz zzu=cmHCR$38kf}W$0jt1=oj=nO^7Iq6Zn#y;hRxzkfY-Z9ii-e(a+UoA8pk?WBsHyD-B*&JUa>OUtD^`!(V=mVrkQ`oUqd=&{1 zHQ$Q7qxD?Qx7mvhuZ~uVu9hD{_#)FHxFamc5t&+;br{tq^?x=wc-41bePN}RPzwzW ztrz2nLvYux6?g2Q__#@f0N?@HCvn4}%RYM~Yu3YA_m{Uigj^me9ac-H3P?(wDla}i z!^_R@N#nLPQg=}m({au?WTIB<)LVK1VW(anYLq`XdKI-f1;jp5Q$f1|BB`e;Vu0Hw z6$SWjlE?o-$)}F|3!r&$+BpBH_ZYU}+tfrl#9CBUi0QXywg2B)gEy@du+1i7}ZarBCvU%xn!H3*8MT+rf;u`fQ z(+gDM44Le1d4%HqJ!8)(5uO#zpCFa#wAAKW9=mdwozv}3wBP~=^O3@X-$Zm9gHw}R zfyuVJ`!A2zYOAWMe%DH$AtJuN8u+LvlUVX5175BMbc~FhvS#u*e%3pBAPfvnuGtBu zl5ss+jsyt1<_Z<63_9O$y_hS1*&(=QyL%z07>oA<(sclE%G5iqn~kqDQNA4G2^WwO zyw|JSfKd7a;CF1)2a|oERD}F-+Ln;Rla>*VXUxiikJM5NZC$wyT+^hFX$H?6+6ilrynVoU(gVA8YGtj4yM;N2K}m>PC}JYtCemgFyZd;j0M!Ui8lGHQuoIfDph(UQY=cY z%~$KotggA=kpHO&`L}AMka&)QE9}|uzI?8@2G$AcKhe7GWWH&|tuYx)2@Q*PIJdocfGrNLJZ4fd YIKuS|*Z_BV5&L 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

&N5C@vr;l#S4FbbF4+; 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�KuVSTF&pLlcmT>Vl^0?z@ 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 Cp}T4T literal 289583 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