2022-07-08 20:04:37 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"database/sql"
|
|
|
|
"log"
|
|
|
|
"os"
|
2022-07-09 15:31:16 +02:00
|
|
|
"strings"
|
2022-07-08 20:04:37 +02:00
|
|
|
|
|
|
|
_ "github.com/lib/pq"
|
2022-07-09 15:31:16 +02:00
|
|
|
|
|
|
|
"git.sr.ht/~sircmpwn/searchhut/config"
|
2022-07-08 20:04:37 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
2022-07-09 15:31:16 +02:00
|
|
|
query := strings.Join(os.Args[1:], " ")
|
|
|
|
|
|
|
|
conf := config.Load()
|
|
|
|
connstr, ok := conf.Get("searchhut", "connection-string")
|
|
|
|
if !ok {
|
|
|
|
log.Fatal("Configuration missing connection string")
|
|
|
|
}
|
|
|
|
|
2022-07-08 20:04:37 +02:00
|
|
|
db, err := sql.Open("postgres", connstr)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Avoid parsing the query vector twice
|
|
|
|
rows, err := db.Query(`
|
|
|
|
SELECT
|
|
|
|
title,
|
|
|
|
url,
|
|
|
|
ts_rank_cd(fts_vector, websearch_to_tsquery('english', $1), 32) AS rank
|
|
|
|
FROM page
|
|
|
|
WHERE
|
|
|
|
title IS NOT NULL AND
|
|
|
|
websearch_to_tsquery('english', $1) @@ fts_vector
|
|
|
|
ORDER BY rank DESC
|
|
|
|
LIMIT 10;
|
|
|
|
`, query)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
for rows.Next() {
|
|
|
|
var (
|
|
|
|
title string
|
|
|
|
url string
|
|
|
|
rank float64
|
|
|
|
)
|
|
|
|
if err := rows.Scan(&title, &url, &rank); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
log.Printf("%s: %s", url, title)
|
|
|
|
}
|
|
|
|
}
|