Ho circa 400.000 documenti in un indice GAE Search. Tutti i documenti hanno una proprietà location
GeoPoint
e sono distribuiti su tutto il globo. Alcuni documenti potrebbero trovarsi a oltre 4000 km da qualsiasi altro documento, altri potrebbero essere raggruppati a pochi metri l'uno dall'altro.Come posso trovare il documento più vicino utilizzando l'API di ricerca di Google App Engine?
Vorrei trovare il documento più vicina ad un insieme specifico di coordinate, ma trovare il seguente codice dà risultati non corretti:
from google.appengine.api import search
# coords are in the form of a tuple e.g. (50.123, 1.123)
search.Document(
doc_id='meaningful-unique-id',
fields=[search.GeoField(name='location'
value=search.GeoPoint(coords[0], coords[1]))])
# find document function radius is in metres
def find_document(coords, radius=1000000):
sort_expr = search.SortExpression(
expression='distance(location, geopoint(%.3f, %.3f))' % coords,
direction=search.SortExpression.ASCENDING,
default_value=0)
search_query = search.Query(
query_string='distance(location, geopoint(%.3f, %.3f)) < %d' \
% (coords[0], coords[1], radius),
options=search.QueryOptions(
limit=1,
ids_only=True,
sort_options=search.SortOptions(expressions=[sort_expr])))
index = search.Index(name='document-index')
return index.search(search_query)
Con questo codice otterrò i risultati che sono coerenti ma non corretto. Ad esempio, una ricerca per il documento più vicino a Londra indica che il più vicino era in Scozia. Ho verificato che ci sono migliaia di documenti più vicini.
Ho ridotto il problema al parametro radius
troppo grande. Ottengo risultati corretti se il raggio scende a circa 12 km (radius=12000
). Generalmente non ci sono più di 1000 documenti in un raggio di 12 km. (Probabilmente associato a search.SortOptions(limit=1000)
.)
Il problema è che se mi trovo in una zona sparsa del globo in cui non ci sono documenti per migliaia di miglia, la mia funzione di ricerca non restituirà nulla con radius=12000
(12 km). Voglio che restituisca il documento più vicino a me ovunque io sia. Come posso farlo in modo coerente con una chiamata all'API di ricerca?
Grazie per la conferma di ciò che @Middy e io presumevamo accadesse dietro le quinte. Sapere che il limite "colpisci" è 10k aiuta sicuramente. Solo per il completamento dirò la risposta a ** Voglio che restituisca il documento più vicino a me ovunque io sia. Come posso raggiungere questo risultato in modo coerente con una chiamata all'API di ricerca? ** È che non posso coerentemente se il mio raggio di ricerca _might_ contenga più di 10k documenti - che purtroppo la mia app potrebbe fare :( – Dan