We hebben een tijdje Algolia gebruikt om te zoeken door onze klanten/orders/etc., dit werkt perfect. Enige puntje was dat we de 10k records al snel aantikten waarbij je meteen van gratis naar $35 per maand gaat. Ook nog geen ramp, maar gezien de AVG en andere redenen leek het een goed idee om het zoeken terug naar de webserver te halen. Dus... ElasticSearch geïnstalleerd en daarmee aan de slag gegaan.
Echter kan ik niet helemaal een goede afstelling vinden, waarmee de resultaten net zo goed zijn als wat Algolia altijd voor ons deed. Dat het nooit zo goed werkt als Algolia zelf kan ik me voorstellen, maar een beetje in de buurt komen zou leuk zijn.
Op dit moment levert zoeken op klant 'Lorem' (niet letterlijk) de volgende resultaten op:
- Dorem
- Lorem
- Lipsum
Waarbij het resultaat met de exacte klantnaam niet als eerste resultaat naar voren komt.
Index configuratie
Mapping
Search rules
---
Naast dit probleem lijkt ook zoeken met de `ngram_analyzer` niet altijd lekker te werken. Stel je hebt een order record: id, name, customer_name. Dan wil je dat zoeken op <klantnaam> <deel ordernaam> de resultaten van die klant bovenaan zet, dat werkt, maar vervolgens komen alle orders van die klantbovenaan te staan, ipv. alleen orders van die klant met <deel ordernaam>.
Kortom; veel ongerelateerde zoekresultaten! Heeft er iemand een beetje inzicht in hoe dit wat beter afgesteld kan worden? Ik kan weinig concreets vinden op internet, vooral oude voorbeelden en verder alleen losse onderdelen terwijl ik volgens mij een combinatie van bepaalde analyzers/rules nodig heb.
Echter kan ik niet helemaal een goede afstelling vinden, waarmee de resultaten net zo goed zijn als wat Algolia altijd voor ons deed. Dat het nooit zo goed werkt als Algolia zelf kan ik me voorstellen, maar een beetje in de buurt komen zou leuk zijn.
Op dit moment levert zoeken op klant 'Lorem' (niet letterlijk) de volgende resultaten op:
- Dorem
- Lorem
- Lipsum
Waarbij het resultaat met de exacte klantnaam niet als eerste resultaat naar voren komt.
Index configuratie
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| 'analysis' => [ 'filter' => [ 'ngram_filter' => [ 'type' => 'ngram', 'min_gram' => 3, 'max_gram' => 3, ], 'edge_ngram_filter' => [ 'type' => 'edge_ngram', 'min_gram' => 2, 'max_gram' => 12, ], 'snowball_filter' => [ 'type' => 'snowball', 'language' => 'Dutch', ], ], 'analyzer' => [ 'customer_name_analyzer' => [ 'type' => 'custom', 'tokenizer' => 'standard', 'filter' => [ 'lowercase', 'asciifolding', 'edge_ngram_filter', ], ], 'ngram_analyzer' => [ 'type' => 'custom', 'tokenizer' => 'standard', 'filter' => [ 'lowercase', 'asciifolding', 'snowball_filter', 'ngram_filter', ], ], ], ], |
Mapping
code:
1
2
3
4
5
6
7
8
9
10
| 'properties' => [ 'id' => [ 'type' => 'integer', 'index' => false, ], 'name' => [ 'type' => 'text', 'analyzer' => 'customer_name_analyzer', ], ], |
Search rules
code:
1
2
3
4
5
6
7
| 'must' => [ 'multi_match' => [ 'query' => $this->builder->query, 'fields' => ['name'], 'minimum_should_match' => '75%', ] ], |
---
Naast dit probleem lijkt ook zoeken met de `ngram_analyzer` niet altijd lekker te werken. Stel je hebt een order record: id, name, customer_name. Dan wil je dat zoeken op <klantnaam> <deel ordernaam> de resultaten van die klant bovenaan zet, dat werkt, maar vervolgens komen alle orders van die klantbovenaan te staan, ipv. alleen orders van die klant met <deel ordernaam>.
Kortom; veel ongerelateerde zoekresultaten! Heeft er iemand een beetje inzicht in hoe dit wat beter afgesteld kan worden? Ik kan weinig concreets vinden op internet, vooral oude voorbeelden en verder alleen losse onderdelen terwijl ik volgens mij een combinatie van bepaalde analyzers/rules nodig heb.