@@ -84,6 +84,12 @@ func CreateDB(config settings.Config) {
84
84
log .Fatalf ("Failed to create index: %v" , err )
85
85
}
86
86
87
+ log .Info ("Creating search rank index" )
88
+ err = createIndexRank (pool )
89
+ if err != nil {
90
+ log .Fatalf ("Failed to create index: %v" , err )
91
+ }
92
+
87
93
log .Info ("Creating search trgm index" )
88
94
err = createIndexTrgm (pool )
89
95
if err != nil {
@@ -171,20 +177,20 @@ func processParquet(pool *pgxpool.Pool, path string) {
171
177
172
178
func processAliases (tx pgx.Tx , rec Record , id uint64 ) {
173
179
// Add name as alias
174
- addAlias (tx , rec . ID , rec .Name , id )
180
+ addAlias (tx , rec , rec .Name , id )
175
181
176
182
// Add aliases for name aliases
177
183
for name , alias := range aliases {
178
184
if rec .Name == name {
179
- addAlias (tx , rec . ID , alias , id )
185
+ addAlias (tx , rec , alias , id )
180
186
}
181
187
}
182
188
183
189
// Add embedding for truncated names
184
190
for _ , truncation := range truncations {
185
191
if strings .Contains (rec .Name , truncation ) {
186
192
alias := strings .Trim (strings .Replace (rec .Name , truncation , "" , 1 ), " " )
187
- addAlias (tx , rec . ID , alias , id )
193
+ addAlias (tx , rec , alias , id )
188
194
}
189
195
}
190
196
@@ -197,13 +203,13 @@ func processAliases(tx pgx.Tx, rec Record, id uint64) {
197
203
}
198
204
199
205
alias := rec .Name + " " + relation
200
- addAlias (tx , rec . ID , alias , id )
206
+ addAlias (tx , rec , alias , id )
201
207
202
208
// Add entry for relation aliases
203
209
for name , alias := range aliases {
204
210
if relation == name {
205
211
aliasEmbedding := rec .Name + " " + alias
206
- addAlias (tx , rec . ID , aliasEmbedding , id )
212
+ addAlias (tx , rec , aliasEmbedding , id )
207
213
}
208
214
}
209
215
}
@@ -217,10 +223,15 @@ func addOvertureFeature(tx pgx.Tx, rec Record, recordId uint64) error {
217
223
return err
218
224
}
219
225
220
- func addAlias (tx pgx.Tx , id , alias string , recordId uint64 ) error {
226
+ func addAlias (tx pgx.Tx , rec Record , alias string , recordId uint64 ) error {
221
227
alias = strings .ToLower (alias )
222
- query := fmt .Sprintf (`INSERT INTO %s (feature_id, alias) VALUES ($1, $2)` , TABLE_SEARCH )
223
- _ , err := tx .Exec (context .Background (), query , recordId , alias )
228
+ classRank := getClassRank (rec .Class )
229
+ subclassRank := getSubclassScore (rec .Subclass )
230
+ wordCount := len (strings .Split (alias , " " ))
231
+ charCount := len (alias )
232
+
233
+ query := fmt .Sprintf (`INSERT INTO %s (feature_id, alias, class_rank, subclass_rank, word_count, char_count) VALUES ($1, $2, $3, $4, $5, $6)` , TABLE_SEARCH )
234
+ _ , err := tx .Exec (context .Background (), query , recordId , alias , classRank , subclassRank , wordCount , charCount )
224
235
225
236
return err
226
237
}
@@ -240,6 +251,13 @@ func vacuum(pool *pgxpool.Pool) error {
240
251
}
241
252
242
253
func setupDatabase (pool * pgxpool.Pool , schema string ) error {
254
+ if schema != "" {
255
+ _ , err := pool .Exec (context .Background (), fmt .Sprintf ("CREATE SCHEMA IF NOT EXISTS %s;" , schema ))
256
+ if err != nil {
257
+ return fmt .Errorf ("failed to create schema: %v" , err )
258
+ }
259
+ }
260
+
243
261
queryExtensions := `
244
262
CREATE EXTENSION IF NOT EXISTS postgis;
245
263
CREATE EXTENSION IF NOT EXISTS pg_trgm;
@@ -250,12 +268,7 @@ func setupDatabase(pool *pgxpool.Pool, schema string) error {
250
268
return fmt .Errorf ("failed to create extensions: %v" , err )
251
269
}
252
270
253
- if schema == "" {
254
- return nil
255
- }
256
-
257
- _ , err = pool .Exec (context .Background (), fmt .Sprintf ("CREATE SCHEMA IF NOT EXISTS %s;" , schema ))
258
- return err
271
+ return nil
259
272
}
260
273
261
274
func createTableOverture (pool * pgxpool.Pool , tablespace string ) error {
@@ -296,7 +309,11 @@ func createTableSearch(pool *pgxpool.Pool, tablespace string) error {
296
309
297
310
CREATE TABLE %[1]s (
298
311
feature_id BIGINT,
299
- alias TEXT
312
+ alias TEXT,
313
+ class_rank INT,
314
+ subclass_rank INT,
315
+ word_count INT,
316
+ char_count INT
300
317
) %[2]s;
301
318
` , TABLE_SEARCH , tablespace )
302
319
@@ -313,6 +330,15 @@ func createForeignKey(pool *pgxpool.Pool) error {
313
330
return err
314
331
}
315
332
333
+ func createIndexRank (pool * pgxpool.Pool ) error {
334
+ query := fmt .Sprintf (`
335
+ CREATE INDEX IF NOT EXISTS idx_%[1]s_class_subclass ON %[1]s USING btree (class_rank, subclass_rank);
336
+ ` , TABLE_SEARCH )
337
+
338
+ _ , err := pool .Exec (context .Background (), query )
339
+ return err
340
+ }
341
+
316
342
func createIndexGeom (pool * pgxpool.Pool ) error {
317
343
query := fmt .Sprintf (`
318
344
CREATE INDEX IF NOT EXISTS idx_%[1]s_geom ON %[1]s USING GIST (geom);
@@ -341,3 +367,55 @@ func createFTSVectorColumn(pool *pgxpool.Pool) error {
341
367
_ , err := pool .Exec (context .Background (), query )
342
368
return err
343
369
}
370
+
371
+ func getClassRank (class string ) int {
372
+ switch class {
373
+ case "division" :
374
+ return 1
375
+ case "water" : // lot of division names with partly water name, maas, ijssel, etc, rank the same
376
+ return 1
377
+ case "road" :
378
+ return 2
379
+ case "infra" :
380
+ return 3
381
+ case "address" :
382
+ return 4
383
+ case "zipcode" :
384
+ return 5
385
+ case "poi" :
386
+ return 6
387
+ default :
388
+ return 100
389
+ }
390
+ }
391
+
392
+ func getSubclassScore (subclass string ) int {
393
+ switch subclass {
394
+ case "locality" :
395
+ return 1
396
+ case "county" :
397
+ return 2
398
+ case "neighboorhood" :
399
+ return 3
400
+ case "microhood" :
401
+ return 4
402
+ case "motorway" :
403
+ return 1
404
+ case "trunk" :
405
+ return 2
406
+ case "primary" :
407
+ return 3
408
+ case "secondary" :
409
+ return 4
410
+ case "tertiary" :
411
+ return 5
412
+ case "unclassified" :
413
+ return 6
414
+ case "residential" :
415
+ return 6
416
+ case "living_street" :
417
+ return 6
418
+ default :
419
+ return 100
420
+ }
421
+ }
0 commit comments