Mam około 400 000 dokumentów w indeksie GAE Search. Wszystkie dokumenty mają właściwość location
GeoPoint
i są rozmieszczone na całym świecie. Niektóre dokumenty mogą znajdować się w odległości ponad 4000 km od jakiegokolwiek innego dokumentu, inne mogą być połączone w metrach od siebie nawzajem.Jak znaleźć najbliższy dokument za pomocą interfejsu Google App Engine Search API?
chciałbym znaleźć najbliższy dokument do określonego zestawu współrzędnych ale znaleźć następujący kod daje błędne wyniki:
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)
z tym kodem będę uzyskać wyniki, które są zgodne, ale błędne. Na przykład wyszukiwanie najbliższego dokumentu do Londynu wskazuje, że najbliższy znajduje się w Szkocji. Sprawdziłem, że istnieją tysiące bliżej dokumentów.
Zawęziłem problem do zbyt dużego parametru radius
. Dostaję poprawne wyniki, jeśli promień spadnie do około 12 km (radius=12000
). Z reguły nie ma więcej niż 1000 dokumentów w promieniu 12 km. (Prawdopodobnie związane z search.SortOptions(limit=1000)
.)
Problemem jest to, że jeśli jestem w rozrzedzony obszarze kuli ziemskiej, gdzie nie ma żadnych dokumentów na tysiące mil, moja funkcja wyszukiwania nie zwraca niczego z radius=12000
(12km). Chcę, aby zwracał mi najbliższy dokument, gdziekolwiek jestem. Jak mogę to osiągnąć konsekwentnie za pomocą jednego połączenia z interfejsem API wyszukiwania?
Dzięki za potwierdzenie tego, co założyli @Middy, działo się to za kulisami. Świadomość, że limit "trafień" wynosi 10k, zdecydowanie pomaga. Dopiero po ukończeniu określę odpowiedź na ** Chcę, aby zwracała mi najbliższy dokument, gdziekolwiek jestem. Jak mogę to osiągnąć konsekwentnie za pomocą jednego połączenia z interfejsem API wyszukiwania? ** jest to, że nie mogę konsekwentnie, jeśli mój promień wyszukiwania _might_ zawiera więcej niż 10 000 dokumentów - co niestety może zrobić moja aplikacja :( – Dan