Configurer Elasticsearch sur PostgreSQL avec Zombodb

L’objectif de ce billet est d’illustrer une configuration personnalisée d’Elasticsearch par Zombodb sur PostgreSQL.

Je passe sur l’installation qui est bien documenté sur le site de l’extension: https://github.com/zombodb/zombodb

La configuration commence après l’activation de l’extension zombodb sur la base PostgreSQL.

Pour les besoins de l’exemple voici quelques données de tests :

create table test(id integer primary key, content text);

insert into test values (1, 'pizza'), (2, 'pizzas'),( 3, 'pizz'), (4, 'developper'), (5, 'developpement'),( 6, 'developpe');

Création d’un index

CREATE INDEX idx_zdb_test
ON test
USING zombodb(zdb('test', test.ctid), zdb(test))
WITH (url='http://elasticsearch:9200/');

Configuration des « analyzers »

SELECT zdb_define_analyzer('custom_search_analyzer', '{"type": "custom", "tokenizer": "standard", "filter":["stopwords", "asciifolding" ,"lowercase", "snowball", "elision", "worddelimiter"] }');

SELECT zdb_define_analyzer('custom_analyzer','{ "type": "custom", "tokenizer":"nGram", "filter":["stopwords", "asciifolding" ,"lowercase", "snowball","elision", "worddelimiter"] }');

SELECT zdb_define_filter('snowball', '{"type": "snowball", "language": "French"}');

SELECT zdb_define_filter('elision', '{"type": "elision", "articles": ["l", "m", "t", "qu", "n", "s", "j", "d"]}');

SELECT zdb_define_filter('stopwords', '{"type": "stop", "stopwords":["_french_"], "ignore_case" : true }');

SELECT zdb_define_filter('worddelimiter', '{"type": "word_delimiter"}');

SELECT zdb_define_tokenizer('nGram', '{"type": "nGram", "min_gram": 2,"max_gram": 20}');

Configuration du mapping :

SELECT zdb_define_mapping('test', 'content', '{
"type": "string",
"store": false,
"include_in_all": true,
"search_analyzer": "custom_search_analyzer",
"index_analyzer": "custom_analyzer",
"norms": {"enabled": false}
}');

Lancer une réindexation :

reindex idx_zdb_test;

Tester

poke=# SELECT * FROM test WHERE zdb('test', test.ctid) ==> 'content:pizza';
id | content
----+---------
1 | pizz
2 | pizza
3 | pizzas
(3 lignes)
poke=# SELECT * FROM test WHERE zdb('test', test.ctid) ==> 'content:pizz';
id | content
----+---------
1 | pizz
2 | pizza
3 | pizzas
(3 lignes)
poke=# SELECT * FROM test WHERE zdb('test', test.ctid) ==> 'content:pizzas';
id | content
----+---------
1 | pizz
2 | pizza
3 | pizzas

Il est également possible de créer un DOMAIN:

CREATE DOMAIN custom_search_analyzer as text;

Pour ensuite l’utiliser directement dans PostgreSQL.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *