adds search api

This commit is contained in:
Christian Beutel
2024-03-09 19:05:21 +01:00
parent 1b493f576e
commit 963b589b2d
8 changed files with 133 additions and 69 deletions

View File

@@ -1,17 +1,16 @@
<script lang="ts">
import { ms } from "$lib/meilisearch";
import type { Category } from "$lib/models/category";
import type { TrailFilter } from "$lib/models/trail";
import { country_codes } from "$lib/util/country_code_util";
import { formatDistance, formatElevation } from "$lib/util/format_util";
import { createEventDispatcher } from "svelte";
import { _ } from "svelte-i18n";
import { slide } from "svelte/transition";
import DoubleSlider from "../base/double_slider.svelte";
import type { RadioItem } from "../base/radio_group.svelte";
import RadioGroup from "../base/radio_group.svelte";
import Search, { type SearchItem } from "../base/search.svelte";
import Slider from "../base/slider.svelte";
import { slide } from "svelte/transition";
import { _ } from "svelte-i18n";
export let categories: Category[];
export let filterExpanded: boolean = true;
@@ -87,8 +86,13 @@
return;
}
const result = await ms.index("cities500").search(q, { limit: 5 });
searchDropdownItems = result.hits.map((h) => ({
const r = await fetch("/api/v1/search/cities500", {
method: "POST",
body: JSON.stringify({ q: q, options: { limit: 5 } }),
});
const result = await r.json();
searchDropdownItems = result.hits.map((h: Record<string, any>) => ({
text: h.name,
description:
country_codes[h["country code"] as keyof typeof country_codes],

View File

@@ -7,7 +7,6 @@ import { util } from "$lib/vendor/svelte-form-lib/util";
import { get, writable, type Writable } from "svelte/store";
import { summit_logs_create, summit_logs_delete, summit_logs_update } from "./summit_log_store";
import { waypoints_create, waypoints_delete, waypoints_update } from "./waypoint_store";
import { ms } from "$lib/meilisearch";
import type { LatLng } from "leaflet";
import { ClientResponseError } from "pocketbase";
@@ -45,19 +44,22 @@ export async function trails_search_filter(filter: TrailFilter, f: (url: Request
if (filter.near.lat && filter.near.lon) {
filterText += ` AND _geoRadius(${filter.near.lat}, ${filter.near.lon}, ${filter.near.radius})`
}
const indexResponse = await ms
.index("trails")
.search(filter.q, { filter: filterText });
const trailIds = indexResponse.hits.map((h) => h.id);
let r = await f("/api/v1/search/trails", {
method: "POST",
body: JSON.stringify({ q: filter.q, options: { filter: filterText } }),
});
const result = await r.json();
const trailIds = result.hits.map((h: Record<string, any>) => h.id);
if (trailIds.length == 0) {
trails.set([]);
return [];
}
const r = await f('/api/v1/trail?' + new URLSearchParams({
r = await f('/api/v1/trail?' + new URLSearchParams({
expand: "category,waypoints,summit_logs",
filter: trailIds.map((id) => `id="${id}"`).join('||'),
filter: trailIds.map((id: Record<string, any>) => `id="${id}"`).join('||'),
sort: `${filter.sortOrder}${filter.sort}`
}), {
method: 'GET',
@@ -87,13 +89,20 @@ export async function trails_search_bounding_box(northEast: LatLng, southWest: L
}
}
const indexResponse = await ms.index("trails").search("", {
filter: [
`_geoBoundingBox([${northEast.lat}, ${northEast.lng}], [${southWest.lat}, ${southWest.lng}])`,
filterText
],
let r = await fetch("/api/v1/search/trails", {
method: "POST",
body: JSON.stringify({
q: "", options: {
filter: [
`_geoBoundingBox([${northEast.lat}, ${northEast.lng}], [${southWest.lat}, ${southWest.lng}])`,
filterText
],
}
}),
});
const trailIds = indexResponse.hits.map((h) => h.id);
const result = await r.json();
const trailIds = result.hits.map((h: Record<string, any>) => h.id);
if (trailIds.length == 0) {
const currentTrails: Trail[] = get(trails);
@@ -101,8 +110,8 @@ export async function trails_search_bounding_box(northEast: LatLng, southWest: L
return compareObjectArrays<Trail>(currentTrails, []);
}
const r = await fetch('/api/v1/trail?' + new URLSearchParams({
filter: trailIds.map((id) => `id="${id}"`).join("||"),
r = await fetch('/api/v1/trail?' + new URLSearchParams({
filter: trailIds.map((id: Record<string, any>) => `id="${id}"`).join("||"),
expand: "category,waypoints,summit_logs",
sort: `+name`,
}), {