Situatie
Stel je een game en een game medium voor:
Het spel heeft een titel en kan meerdere genres hebben, bijvoorbeeld "Dragon Ball Karakot" met "Fighting" en "Adventure" als genres
Dan is er een gebruiker die dit spel bezit. De gebruiker is eigenaar van de game op een schijf (medium) op de PlayStation 5.
Het doel:
Ik wil alle games doorzoeken waarbij de gametitel overeenkomt met "Dragon" en het gamegenre 5 is (d.w.z. Fighting) en waarbij de mediumplatform-ID 2 is (d.w.z. PlayStation 5) en de gebruikers-ID 25 is
De vraag:
Wat is de beste manier om dit te doen aangezien er twee afzonderlijke indexen zijn? Of moet ik één geneste query maken of twee query's uitvoeren? Of zijn er andere oplossingen?
Elasticsearch mappings
Elasticsearch mappings die ik tot nu toe heb verzonnen:
Twee afzondelijke mappings
Consolidated Index mapping:
Merged index mapping
Allen hebben zo hun voor en nadelen. Op dit moment gebruik ik de tweede (consolidatie), maar merk dat ik tegen limitaties aanloop. Bijvoorbeeld het verwijderen van een gebruiker is niet het verwijderen van een document maar een Elasticsearch script dat de user id opzoekt in de mediums.
De derde is het makkelijkst om te querieen maar daarvoor is er veel dubbele content omdat elk eigenschap van een game over alle mediums wordt gedupliceerd en als een game wijzigd, moet dit voor alle mediums ge-update worden (en een game wijzigd vaak vanwege bijv. een waardering die hier in dit voorbeeld nog niet wordt meegenomen).
Dus nogmaals de vraag (zie boven) wat een goede manier is om dit soort constructies te mappen voor queries met pagination etc.
Stel je een game en een game medium voor:
Het spel heeft een titel en kan meerdere genres hebben, bijvoorbeeld "Dragon Ball Karakot" met "Fighting" en "Adventure" als genres
Dan is er een gebruiker die dit spel bezit. De gebruiker is eigenaar van de game op een schijf (medium) op de PlayStation 5.
Het doel:
Ik wil alle games doorzoeken waarbij de gametitel overeenkomt met "Dragon" en het gamegenre 5 is (d.w.z. Fighting) en waarbij de mediumplatform-ID 2 is (d.w.z. PlayStation 5) en de gebruikers-ID 25 is
De vraag:
Wat is de beste manier om dit te doen aangezien er twee afzonderlijke indexen zijn? Of moet ik één geneste query maken of twee query's uitvoeren? Of zijn er andere oplossingen?
Elasticsearch mappings
Elasticsearch mappings die ik tot nu toe heb verzonnen:
Twee afzondelijke mappings
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
| // Games "mappings": { "properties": { "title": { "type": "text", "index": "true" }, "genres": { "type": "integer", "index": "true" } } } // Mediums "mappings": { "properties": { "game_id": { "type": "keyword", "index": "true" }, "user_id": { "type": "integer", "index": "true" }, "platform_id": { "type": "integer", "index": "true" } } } |
Consolidated Index mapping:
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
| // Games "mappings": { "properties": { "title": { "type": "text", "index": "true" }, "genres": { "type": "integer", "index": "true" }, "mediums": { "type": "nested", "properties": { "user_id": { "type": "integer", "index": "true" }, "platform_id": { "type": "integer", "index": "true" } } } } } |
Merged index mapping
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
| // Mediums "mappings": { "properties": { "user_id": { "type": "integer", "index": "true" }, "platform_id": { "type": "integer", "index": "true" } "game_id": { "type": "keyword", "index": "true" }, "game_title": { "type": "text", "index": "true" }, "game_genres": { "type": "integer", "index": "true" } } } |
Allen hebben zo hun voor en nadelen. Op dit moment gebruik ik de tweede (consolidatie), maar merk dat ik tegen limitaties aanloop. Bijvoorbeeld het verwijderen van een gebruiker is niet het verwijderen van een document maar een Elasticsearch script dat de user id opzoekt in de mediums.
De derde is het makkelijkst om te querieen maar daarvoor is er veel dubbele content omdat elk eigenschap van een game over alle mediums wordt gedupliceerd en als een game wijzigd, moet dit voor alle mediums ge-update worden (en een game wijzigd vaak vanwege bijv. een waardering die hier in dit voorbeeld nog niet wordt meegenomen).
Dus nogmaals de vraag (zie boven) wat een goede manier is om dit soort constructies te mappen voor queries met pagination etc.
[ Voor 6% gewijzigd door ZeroXT op 20-07-2024 11:42 ]