From f14723ffda5ab96a133e28e43ae1a3596ce4412b Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Fri, 15 Jul 2022 10:32:17 +0200 Subject: [PATCH] docs: create search 1.0 blog post Signed-off-by: Camila Belo --- ...22-07-19-releasing-backstage-search-1.0.md | 68 ++++++++++++++++++ .../releasing-backstage-search-v1.png | Bin 0 -> 21969 bytes 2 files changed, 68 insertions(+) create mode 100644 microsite/blog/2022-07-19-releasing-backstage-search-1.0.md create mode 100644 microsite/blog/assets/22-07-19/releasing-backstage-search-v1.png diff --git a/microsite/blog/2022-07-19-releasing-backstage-search-1.0.md b/microsite/blog/2022-07-19-releasing-backstage-search-1.0.md new file mode 100644 index 0000000000..61ff25ac0a --- /dev/null +++ b/microsite/blog/2022-07-19-releasing-backstage-search-1.0.md @@ -0,0 +1,68 @@ +--- +# prettier-ignore +title: Releasing Backstage Search 1.0 +author: Emma Indal, Spotify +authorURL: https://www.linkedin.com/in/emma-indal +--- + +**TL;DR** If you’ve been waiting for Backstage Search to come out of beta, we’re excited to announce that [Backstage Search 1.0](https://backstage.io/docs/features/search/search-overview#backstage-search-10) is here! + +We first released the Backstage Search Platform over a year ago. Backstage Search Platform is a search experience built for you, by you. + +![Releasing Backstage Search 1.0](assets/22-07-19/releasing-backstage-search-v1.png) + +Backstage Search Platform makes it possible for you to search across your entire software ecosystem. With a Search platform that is customizable and extendable, you can identify your needs within your organization and set up search to solve these problems. Whether it is to search through the Software Catalog or technical documentation generated by the TechDocs plugin. + + + +## So what is Backstage Search 1.0? + +Since the first release of the Backstage Search Platform, we have seen a fantastic community grow around the search plugins. To mention just a few of these contributions: + +- More search engine modules: [Elasticsearch](https://www.npmjs.com/package/@backstage/plugin-search-backend-module-elasticsearch) originally [contributed](https://github.com/backstage/backstage/pull/6569) by Roadie and [Postgres](https://www.npmjs.com/package/@backstage/plugin-search-backend-module-pg) originally [contributed](https://github.com/backstage/backstage/pull/7316) by SDA SE +- More components: Quick search modal, originally [contributed](https://github.com/backstage/backstage/pull/7316) by Expedia Group +- More plugin integrations: TechDocs also [contributed](https://github.com/backstage/backstage/pull/6375) by Roadie and [Software Catalog](https://github.com/backstage/backstage/pull/4515) + +These are just a few contributions of the countless enhancements and improvements made by contributors across the globe. With a well adopted and tested search platform we feel confident to release Backstage Search as 1.0. + +Packages included in Backstage Search 1.0 release are: + +**Core search packages** + +- [@backstage/plugin-search](https://www.npmjs.com/package/@backstage/plugin-search) +- [@backstage/plugin-search-react](https://www.npmjs.com/package/@backstage/plugin-search-react) +- [@backstage/plugin-search-common](https://www.npmjs.com/package/@backstage/plugin-search-common) +- [@backstage/plugin-search-backend](https://www.npmjs.com/package/@backstage/plugin-search-backend) +- [@backstage/plugin-search-backend-node](https://www.npmjs.com/package/@backstage/plugin-search-backend-node) + +**Modules** + +- [@backstage/plugin-search-backend-module-elasticsearch](https://www.npmjs.com/package/@backstage/plugin-search-backend-module-elasticsearch) + +No additional features are released as part of the major release as the maintainers of the search packages focused on the following for this release: + +- Bug fixes and clean up of deprecations. +- Improved error handling for missing indices. +- Separation of AWS Elastic and Open Elastic support. +- Refactor the packages by moving reusable components from `@backstage/plugin-search` to `@backstage/plugin-search-react`. +- Improved documentation including tutorials for how to [Integrate Search into a plugin](https://backstage.io/docs/plugins/integrating-search-into-plugins). + +You might have noticed that the [@backstage/plugin-search-backend-module-pg](https://www.npmjs.com/package/@backstage/plugin-search-backend-module-pg) package is not part of 1.0. That’s because that package is a community supported module, and therefore we have not included it as part of 1.0. If you are interested in pushing the Postgres engine to 1.0, feel free to reach out to us in the [#search](https://discord.com/channels/687207715902193673/770283289327566848) channel on Discord. + +## Elasticsearch as the recommended engine for production usage + +When the Backstage Search Platform was first released, it came with an in-memory search engine as default - Lunr. While this is a good engine to use on a smaller scale and for local development (to avoid having to set up a search engine instance separately), it also has its limitations such as: + +- Lunr does not scale well. Horizontally scaled deployments of Backstage and/or Backstage Search backend using Lunr result in either duplicated indexing processes and indices or inconsistent index state across nodes. +- Lunr’s filter functionality is limited, especially for [logical AND/OR operators](https://github.com/olivernn/lunr.js/issues/353). +- Lunr has a smaller community than Elasticsearch, which could mean that adopters relying on it will have less by way of resources for iterating on and improving search. + +Therefore, we recommend using Elasticsearch for production usage. Moving forward, the search maintainers will prioritize the Elasticsearch engine while we’ll rely on the community to maintain the Postgres engine. + +## How to contribute + +If you want to contribute and to further improve search, you can check out the [open issues labeled with search](https://github.com/backstage/backstage/issues?q=is%3Aissue+search+label%3Asearch+is%3Aopen) or reach out to us at the [#search](https://discord.com/channels/687207715902193673/770283289327566848) Discord channel. + +## How to get started + +If you haven’t adopted the Backstage Search Platform yet and feel like now is a good time. Head over to the [getting started docs](https://backstage.io/docs/features/search/getting-started). diff --git a/microsite/blog/assets/22-07-19/releasing-backstage-search-v1.png b/microsite/blog/assets/22-07-19/releasing-backstage-search-v1.png new file mode 100644 index 0000000000000000000000000000000000000000..136e0c4084d8495f8d5704cc48a6863cf065ca26 GIT binary patch literal 21969 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 literal 0 HcmV?d00001