2012-10-24 10 views
10

Próba użycia ElasticSearch stworzyć przeszukiwanie który używa odległości od środka obiektu, aby wpłynąć na trafność.ElasticSearch - wykorzystanie odległość od punktu wpływać na trafność zapytania

Nie chcę po prostu porządek na odległość od punktu, co wiem jest to możliwe, ponieważ chcę Znaczenie podstawie szukanego zapytania wywiera również wpływ na wyniki.

Chciałbym podać ciąg wyszukiwania, np. "Kawa", i lat/lon, powiedz "38, -77", i uzyskać wyniki uporządkowane przez połączenie tego, jak są powiązane z "kawą" "i jak blisko są do" 38, -77 ".

Dzięki!

Odpowiedz

6

Można użyć distance function w skrypcie na Custom Score Query zmodyfikować _score na podstawie odległości od środka obiektu.

+0

Czy te wagi będą stosowane po rzeczywistym wyszukiwaniu? Powód, dla którego pytam, jest taki, że jeśli limit wyszukiwania wyniósł 100 wyników, a łączne wyniki były równe 1000, to niektóre bardzo bliskie wyniki mogą zostać pominięte, jeśli pojawią się po pierwszych 100. –

+0

Te wagi będą stosowane po wyszukiwaniu, ale przed pobraniem. Przeprowadzane jest pierwsze wyszukiwanie i gromadzone są wyniki 1000 (w twoim przykładzie). Dla każdego zebranego wyniku wynik trafności jest obliczany za pomocą dostarczonego skryptu, a 100 najlepszych wyników zostaje zachowanych. Po przetworzeniu wszystkich 1000 rekordów z wyników wyszukiwania pobranych zostanie 100 najlepszych rekordów. – imotov

+0

Dziękuję bardzo za pomoc! Czy tak zawsze działa funkcja elastycznego wyszukiwania? Wydaje się, że w przypadku niektórych zapytań, które zawierają dużą ilość "rozmytości", potencjalny zestaw wyszukiwania może zawierać miliony wyników o niskiej trafności. W jaki sposób elasticsearch wie, kiedy przestać szukać? –

10

Niedawno (0.90.4) dodaje typ kwerendy function_score dodaje obsługę Ranking opiera się na odległość. Jest to alternatywa dla niestandardowego typu zapytania wynikowego.

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

Przykładem podniósł stamtąd:

"query": { 
    "function_score": { 
    "functions": [ 
     { "gauss": { "loc": { "origin": "51,0", "scale": "5km" }}}, 
    ] 
    } 
} 

Dotyczy to funkcji rozkładu (jest ich kilka) do pola („loc”), który strzelił przeciwko odległość od pochodzenia dali konkretna skala. Jest to dokładnie to, czego potrzebujesz do rankingu odległości, ponieważ daje ci to dużą elastyczność, jeśli chodzi o jego klasyfikację bez pisania niestandardowych skryptów.

+0

Jakiego rodzaju polem jest "loc"? Czy możesz wyjaśnić trochę więcej na ten temat? Mam coś takiego "" loc ":" 12.5,65.5 "" i wydaje się, że nie działa. –

+0

Mogło się zmienić od czasu, gdy to napisałem, w ostatnich wersjach elasticsearch nastąpiła duża zmiana w zakresie elementów geo. 0.90.4 to dawno temu. –

+0

Znajdę. Dzięki ! –

Powiązane problemy