Verkkopalvelun hakutoiminnallisuuden optimointi Elasticsearch-hakumoottorilla
Kolehmainen, Seppo (2025)
Kolehmainen, Seppo
2025
Master's Programme in Computing Sciences and Electrical Engineering
Informaatioteknologian ja viestinnän tiedekunta - Faculty of Information Technology and Communication Sciences
Hyväksymispäivämäärä
2025-12-12
Julkaisun pysyvä osoite on
https://urn.fi/URN:NBN:fi:tuni-2025121211540
https://urn.fi/URN:NBN:fi:tuni-2025121211540
Tiivistelmä
Nykyaikana monien verkkopalveluiden tulee pystyä käsittelemään suuria määriä dataa. Kasvavat datamäärät asettavat haasteen sekä tiedon löydettävyydelle että sen hakemisen nopeudelle. Palvelun operatiivisen tietokannan tietomalli suunnitellaan usein sovelluslogiikan lähtökohdista eikä se aina palvele parhaalla mahdollisella tavalla tiedon tehokasta hakemista. Tietokannat eivät myöskään aina tarjoa tehokkaimpia mahdollisia työkaluja tiedon hakemiseen. Tätä varten on kehitetty hakumoottoreita kuten Apache Lucene -kirjaston ympärille toteutettu Elasticsearch.
Tässä opinnäytetyössä selvitettiin, miten Elasticsearch-hakumoottori soveltuu MongoDB:n päälle rakennetun verkkopalvelun hakutoiminnallisuuden optimointiin. Työ koostui projektista, jossa verkkopalveluun toteutettiin hakutoiminnallisuus Elasticsearchin avulla sekä suorituskykymittauksista, joilla selvitettiin, minkälaisissa hakutapauksissa Elasticsearchin käyttö on tehokkaampaa kuin hakeminen MongoDB:stä.
Projekti jakautui kolmeen pääosaan, joista ensimmäisessä toteutettiin MongoDB:n datan synkronointi Elasticsearchiin MongoDB:n Change Stream -tapahtumavirtaa hyödyntämällä. Projektin toisessa osassa sovellukseen toteutettiin rajapinta Elasticsearch-hakujen tekemistä sekä indeksien hallinnointia varten. Viimeisessä osassa toteutettiin varsinainen hakutoiminnallisuus. Projektin lopputuloksena oli tuotantovalmis hakuimplementaatio, jolla onnistuttiin optimoimaan vanhan hakutoteutuksen hitaimpia hakuja huomattavasti.
Suorituskykymittauksissa selvitettiin MongoDB:n ja Elasticsearchin eroja erilaisissa hakuskenaarioissa. Mittauksissa nousi esille, että MongoDB:ssä yksinkertaisemmat haut, joita varten tietokantaan on toteutettu toimiva indeksi, ovat erittäin nopeita, eikä niiden optimointi onnistu Elasticsearchia käyttämällä. Monimutkaisempien hakujen kuten tekstihaun ja aggregointien tekeminen on kuitenkin Elasticsearchista huomattavasti tehokkaampaa.
Erillisen hakumoottorin käyttöönotto jo olemassa olevaan sovellukseen voi olla työläs projekti, mutta se myös tarjoaa paljon mahdollisuuksia nopeampien ja parempien hakujen rakentamiseen. Tämän opinnäytetyön tuloksia voidaan hyödyntää hakumoottorin käytön tarpeen sekä sen käyttöönoton vaatiman työmäärän arvioinnissa. Modern online services are often required to be able to handle large amounts of data. Growing data volumes create a challenge in information discoverability as well as search efficiency. The data model of an application’s operational database is typically designed around application logic, and it does not always serve the purpose of efficient data retrieval. Additionally, database search functionality is often limited and lacks support for more complex search operations. For this purpose, search engines have been developed. One such search engine is Elasticsearch, which is based on the Apache Lucene library.
The aim of this thesis was to examine how the Elasticsearch search engine can be used to optimize a web service’s search functionality built on top of MongoDB. The thesis included a project in which the search functionality was implemented using Elasticsearch, as well as performance measurements to identify use cases where using Elasticsearch is more efficient that using MongoDB.
The project was divided into three main parts. The first part was to synchronize data from MongoDB to Elasticsearch using MongoDB’s Change Stream event stream functionality. The second part involved building a search API for the application and a functionality for Elasticsearch index management. The final part focused on developing the actual search features. The project resulted in a production-ready search implementation that significantly improved the performance of the slowest queries in the previous solution.
The performance measurements were designed to compare how MongoDB and Elasticsearch perform in different search scenarios. The results showed that simple, well-indexed MongoDB queries are very efficient and cannot be improved with Elasticsearch. However, more complex search cases such as text search and data aggregation were much more efficient when executed with Elasticsearch.
Introducing a search engine to an existing application mat require substantial effort. However, it can provide many possibilities for building better and more efficient search functionalities. The results of this thesis can help evaluate the need for a search engine and estimate the work required for its deployment.
Tässä opinnäytetyössä selvitettiin, miten Elasticsearch-hakumoottori soveltuu MongoDB:n päälle rakennetun verkkopalvelun hakutoiminnallisuuden optimointiin. Työ koostui projektista, jossa verkkopalveluun toteutettiin hakutoiminnallisuus Elasticsearchin avulla sekä suorituskykymittauksista, joilla selvitettiin, minkälaisissa hakutapauksissa Elasticsearchin käyttö on tehokkaampaa kuin hakeminen MongoDB:stä.
Projekti jakautui kolmeen pääosaan, joista ensimmäisessä toteutettiin MongoDB:n datan synkronointi Elasticsearchiin MongoDB:n Change Stream -tapahtumavirtaa hyödyntämällä. Projektin toisessa osassa sovellukseen toteutettiin rajapinta Elasticsearch-hakujen tekemistä sekä indeksien hallinnointia varten. Viimeisessä osassa toteutettiin varsinainen hakutoiminnallisuus. Projektin lopputuloksena oli tuotantovalmis hakuimplementaatio, jolla onnistuttiin optimoimaan vanhan hakutoteutuksen hitaimpia hakuja huomattavasti.
Suorituskykymittauksissa selvitettiin MongoDB:n ja Elasticsearchin eroja erilaisissa hakuskenaarioissa. Mittauksissa nousi esille, että MongoDB:ssä yksinkertaisemmat haut, joita varten tietokantaan on toteutettu toimiva indeksi, ovat erittäin nopeita, eikä niiden optimointi onnistu Elasticsearchia käyttämällä. Monimutkaisempien hakujen kuten tekstihaun ja aggregointien tekeminen on kuitenkin Elasticsearchista huomattavasti tehokkaampaa.
Erillisen hakumoottorin käyttöönotto jo olemassa olevaan sovellukseen voi olla työläs projekti, mutta se myös tarjoaa paljon mahdollisuuksia nopeampien ja parempien hakujen rakentamiseen. Tämän opinnäytetyön tuloksia voidaan hyödyntää hakumoottorin käytön tarpeen sekä sen käyttöönoton vaatiman työmäärän arvioinnissa.
The aim of this thesis was to examine how the Elasticsearch search engine can be used to optimize a web service’s search functionality built on top of MongoDB. The thesis included a project in which the search functionality was implemented using Elasticsearch, as well as performance measurements to identify use cases where using Elasticsearch is more efficient that using MongoDB.
The project was divided into three main parts. The first part was to synchronize data from MongoDB to Elasticsearch using MongoDB’s Change Stream event stream functionality. The second part involved building a search API for the application and a functionality for Elasticsearch index management. The final part focused on developing the actual search features. The project resulted in a production-ready search implementation that significantly improved the performance of the slowest queries in the previous solution.
The performance measurements were designed to compare how MongoDB and Elasticsearch perform in different search scenarios. The results showed that simple, well-indexed MongoDB queries are very efficient and cannot be improved with Elasticsearch. However, more complex search cases such as text search and data aggregation were much more efficient when executed with Elasticsearch.
Introducing a search engine to an existing application mat require substantial effort. However, it can provide many possibilities for building better and more efficient search functionalities. The results of this thesis can help evaluate the need for a search engine and estimate the work required for its deployment.
