2013-07-23 10 views
5

Chcę kwerendy zwraca wynik, który zostanie obliczony jak:Jak obliczyć wynik na podstawie liczby haseł w zapytaniu elastycznym?

wystąpienia każdego terminu zapytania w tytule + Opis/liczby terminów użytych w zapytaniu

np

EbSearch.add [ 
new_job(id: 1, title: "Java Programmierer", 
description: "Java Programmierer") 
] 

res = EbSearch.search("Java Programmierer").results.first.score.should == 4 

W tej chwili wyjścia 8, ponieważ wykonuje zapytanie dla każdego terminu i podsumowuje je. Mogę po prostu podzielić się później, ale nie mam analizowanych terminów zapytań, więc związki mogłyby zepsuć wynik.

Zapytanie jest skonstruowane jak poniżej:

search = Tire.search index_name do 
    query do 
    dis_max do 
     query { string query, fields: ['title^3', 'description.with_synonyms^0.5'], use_dis_max: false, default_operator: "OR" } 
     query { string query, fields: ['title^3', 'description.without_synonyms'], use_dis_max: false, default_operator: "OR"} 
    end 
    end 
end 

Jakiś pomysł jak mogę rozwiązać ten problem jest bardzo mile widziane.

EDIT

zdałem sobie sprawę, że nie tyle pod warunkiem kontekst.

Oto kilka innych fragmentów, które już opracowałem. Napisałem niestandardowy podobieństwoProvider, aby wyłączyć idf i normalizację. https://gist.github.com/outsmartin/6114175

Cały kod opony znajduje się tutaj https://gist.github.com/6114186. Jest to nieco bardziej skomplikowane niż przykład, ale powinno być zrozumiałe.

+0

Przez związki masz na myśli, że wyszukiwana fraza "elastyczne wyszukiwanie" może zostać zmyślona na 2 żetony? Czy chcesz podzielić to przez 2? – ramseykhalaf

+0

Na przykład, ale ponieważ mam dużo niemieckich terminów, muszę podzielić "Javaprogrammierer" na Java i Programmierer. Ponieważ kwerenda jest wykonywana przy użyciu wszystkich haseł, chcę, aby wynik był w przykładzie od 0 do 4. – outsmartin

+0

Nadal jestem trochę zdezorientowany ... Z powyższego opisu zrozumiałem, że wyszukiwanie "Java Programmierer" powinno mieć wynik: (4: wystąpienie każdego terminu zapytania w tytule + opis)/(2: liczba zapytań) = 2. Ale mówisz, że chcesz, aby wynik był 4. Jestem trochę zdezorientowany. – ramseykhalaf

Odpowiedz

3

Możesz łatwo uzyskać listę analizowanych pojęć dla swojego zapytania za pomocą polecenia analyze. Muszę jednak wspomnieć, że punktacja Elasticsearch jest znacznie bardziej skomplikowana, niż mogłoby się wydawać, gdy przeprowadzasz testy na małych indeksach. Możesz znaleźć formułę, której używa Elasticsearch w Lucene documentation, i możesz użyć polecenia explain, aby zobaczyć, jak ta formuła jest stosowana do Twoich wyników. Proponowałbym również przetestowanie i dostrojenie algorytmu oceniania na indeksie za pomocą pojedynczego fragmentu lub użycie typu wyszukiwania dfs_query_then_fetch, który zapewnia bardziej precyzyjne wyniki na małych indeksach.

+0

Zaktualizowałem pytanie, podając więcej informacji. Pomysł z poleceniem analizy brzmi obiecująco, jedyną wadą jest kolejna prośba do serwera elasticsearch. – outsmartin

+0

udało się, dzięki – outsmartin

Powiązane problemy