Standortsuche
Übersicht
Fess kann geografische Bereichssuchen für Dokumente mit Breiten- und Längengraden durchführen. Mit dieser Funktion können Sie Dokumente innerhalb einer bestimmten Entfernung von einem bestimmten Punkt suchen oder Suchsysteme in Verbindung mit Kartendiensten wie Google Maps erstellen.
Anwendungsfälle
Standortsuche kann für folgende Zwecke genutzt werden:
Geschäftssuche: Suche nach Geschäften in der Nähe des aktuellen Standorts des Benutzers
Immobiliensuche: Suche nach Immobilien innerhalb einer bestimmten Entfernung von einem bestimmten Bahnhof oder einer Einrichtung
Veranstaltungssuche: Suche nach Veranstaltungsinformationen in der Umgebung eines bestimmten Ortes
Einrichtungssuche: Suche nach Sehenswürdigkeiten oder öffentlichen Einrichtungen in der Nähe
Konfigurationsmethode
Konfiguration bei Indexgenerierung
Definition des Standortfeldes
In Fess ist location als Standardfeld für Standortinformationen definiert. Dieses Feld ist als OpenSearch-Typ geo_point konfiguriert.
Registrierungsformat für Standortinformationen
Bei Indexgenerierung werden Breiten- und Längengrad durch Komma getrennt im location-Feld festgelegt.
Format:
Breitengrad,Längengrad
Beispiel:
45.17614,-93.87341
Bemerkung
Breitengrad wird im Bereich von -90 bis 90, Längengrad im Bereich von -180 bis 180 angegeben.
Konfigurationsbeispiel für Datenspeicher-Crawling
Bei Verwendung von Datenspeicher-Crawling werden Breiten- und Längengrade aus einer Datenquelle mit Standortinformationen im location-Feld festgelegt.
Beispiel: Abruf aus Datenbank
SELECT
id,
name,
address,
CONCAT(latitude, ',', longitude) as location
FROM stores
Hinzufügen von Standortinformationen per Skript
Sie können auch dynamisch Standortinformationen zu Dokumenten hinzufügen, indem Sie die Skriptfunktion der Crawl-Konfiguration verwenden.
// Breiten- und Längengrad im location-Feld festlegen
doc.location = "35.681236,139.767125";
Konfiguration bei Suche
Für Standortsuche geben Sie Mittelpunkt und Bereich der Suche über Request-Parameter an.
Request-Parameter
| Parametername | Beschreibung |
|---|---|
geo.location.point | Breiten-/Längengrad des Suchmittelpunkts (durch Komma getrennt) |
geo.location.distance | Suchradius vom Mittelpunkt (mit Einheit) |
Entfernungseinheiten
Für Entfernungen können folgende Einheiten verwendet werden:
km: Kilometerm: Metermi: Meilenyd: Yards
Suchbeispiele
Grundlegende Suche
Suche nach Dokumenten innerhalb eines Radius von 10 km vom Bahnhof Tokyo (35.681236, 139.767125):
http://localhost:8080/search?q=Suchschlüsselwort&geo.location.point=35.681236,139.767125&geo.location.distance=10km
Suche in der Nähe des aktuellen Standorts
Suche innerhalb 1 km vom aktuellen Standort des Benutzers:
http://localhost:8080/search?q=Ramen&geo.location.point=35.681236,139.767125&geo.location.distance=1km
Sortierung nach Entfernung
Um Suchergebnisse nach Entfernung zu sortieren, verwenden Sie den sort-Parameter.
http://localhost:8080/search?q=Convenience&geo.location.point=35.681236,139.767125&geo.location.distance=5km&sort=location.distance
Verwendung in API
Standortsuche kann auch in JSON-API verwendet werden.
curl -X POST "http://localhost:8080/json/?q=Hotel" \
-H "Content-Type: application/json" \
-d '{
"geo.location.point": "35.681236,139.767125",
"geo.location.distance": "5km"
}'
Anpassung von Feldnamen
Änderung des Standard-Feldnamens
Um den für Standortsuche verwendeten Feldnamen zu ändern, ändern Sie in fess_config.properties folgende Einstellung:
query.geo.fields=location
Zur Angabe mehrerer Feldnamen trennen Sie diese durch Kommas.
query.geo.fields=location,geo_point,coordinates
Implementierungsbeispiele
Implementierung in Webanwendung
Beispiel für Suche mit JavaScript unter Abruf des aktuellen Standorts:
// Aktuellen Standort mit Browser-Geolocation-API abrufen
navigator.geolocation.getCurrentPosition(function(position) {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
const distance = "5km";
// Such-URL erstellen
const searchUrl = `/search?q=&geo.location.point=${latitude},${longitude}&geo.location.distance=${distance}`;
// Suche ausführen
window.location.href = searchUrl;
});
Integration mit Google Maps
Beispiel für Anzeige von Suchergebnissen als Marker auf Google Maps:
// Karte initialisieren
const map = new google.maps.Map(document.getElementById('map'), {
center: {lat: 35.681236, lng: 139.767125},
zoom: 13
});
// Standortsuche mit Fess-API ausführen
fetch('/json/?q=Geschäfte&geo.location.point=35.681236,139.767125&geo.location.distance=5km')
.then(response => response.json())
.then(data => {
// Suchergebnisse als Marker anzeigen
data.response.result.forEach(doc => {
if (doc.location) {
const [lat, lng] = doc.location.split(',').map(Number);
new google.maps.Marker({
position: {lat: lat, lng: lng},
map: map,
title: doc.title
});
}
});
});
Leistungsoptimierung
Optimierung der Indexeinstellungen
Bei Umgang mit großen Mengen an Standortdaten optimieren Sie Indexeinstellungen.
Überprüfen Sie Standortfeld-Einstellungen in app/WEB-INF/classes/fess_indices/fess.json.
"location": {
"type": "geo_point"
}
Beschränkung des Suchbereichs
Aus Leistungsgründen wird empfohlen, den Suchbereich auf das notwendige Minimum zu beschränken.
Weitreichende Suchen (50 km oder mehr) können längere Verarbeitungszeiten erfordern
Konfigurieren Sie angemessene Bereiche je nach Verwendungszweck
Fehlersuche
Standortsuche funktioniert nicht
Überprüfen Sie, ob Daten korrekt im
location-Feld gespeichert sind.Überprüfen Sie, ob das Breiten-/Längengrad-Format korrekt ist (durch Komma getrennt).
Überprüfen Sie, ob
locationim OpenSearch-Index-Mapping alsgeo_point-Typ definiert ist.
Keine Suchergebnisse zurückgegeben
Überprüfen Sie, ob Dokumente innerhalb der angegebenen Entfernung existieren.
Überprüfen Sie, ob Breiten-/Längengradwerte im korrekten Bereich liegen (Breitengrad: -90~90, Längengrad: -180~180).
Überprüfen Sie, ob Entfernungseinheit korrekt angegeben ist.
Standortinformationen werden nicht korrekt angezeigt
Überprüfen Sie, ob
location-Feld beim Crawling korrekt festgelegt wurde.Überprüfen Sie, ob Breiten-/Längengrad-Datentyp in der Datenquelle numerisch ist.
Bei Festlegung von Standortinformationen per Skript überprüfen Sie, ob das Zeichenfolgen-Konkatenationsformat korrekt ist.
Referenzinformationen
Für Details zur Standortsuche siehe folgende Ressourcen: