typesense/include/stemmer_manager.h
Ozan Armağan 0f54bf7101
Add stemming support for fields (#1498)
* Add stemming support for fields

* Add tests for stemming

* Check if the stemmer is  loaded correctly

* Add mutex for stemmer initialization and usage

* Fix get_stemmer_mutex() function signature

* Add StemmerManager class and refactor field.cpp and index.cpp

* Add mutex for thread safety in StemmerManager

* update delete_all_stemmers()

* Update field property name from "stemming" to "stem"
2024-01-20 21:18:54 +05:30

43 lines
1.2 KiB
C++

#pragma once
#include <unordered_map>
#include <string>
#include <vector>
#include <memory>
#include <mutex>
#include <libstemmer.h>
#include "lru/lru.hpp"
class Stemmer {
private:
sb_stemmer * stemmer = nullptr;
LRU::Cache<std::string, std::string> cache;
std::mutex mutex;
public:
Stemmer(const char * language);
~Stemmer();
std::string stem(const std::string & word);
};
class StemmerManager {
private:
std::unordered_map<std::string, std::shared_ptr<Stemmer>> stemmers;
StemmerManager() {}
std::mutex mutex;
public:
static StemmerManager& get_instance() {
static StemmerManager instance;
return instance;
}
StemmerManager(StemmerManager const&) = delete;
void operator=(StemmerManager const&) = delete;
StemmerManager(StemmerManager&&) = delete;
void operator=(StemmerManager&&) = delete;
~StemmerManager();
std::shared_ptr<Stemmer> get_stemmer(const std::string& language);
void delete_stemmer(const std::string& language);
void delete_all_stemmers();
const bool validate_language(const std::string& language);
};