2013-07-08 11 views
9

To, czego szukam, to proste, jasne wyjaśnienie, jak naprawdę działa domyślny mechanizm scoringowy ElasticSearch (Lucene). Chodzi mi o to, czy używa on punktacji Lucene, czy może używa własnej punktacji?Domyślny mechanizm oceniania ElasticSearch

Na przykład chcę wyszukać dokument na przykład za pomocą pola "Nazwa". Korzystam z klienta .NET NEST, aby pisać moje zapytania. Rozważmy ten typ zapytania:

IQueryResponse<SomeEntity> queryResult = client.Search<SomeEntity>(s => 
    s.From(0) 
    .Size(300) 
    .Explain() 
    .Query(q => q.Match(a => a.OnField(q.Resolve(f => f.Name)).QueryString("ExampleName"))) 
); 

który jest tłumaczony na takie zapytania JSON:

{ 
"from": 0, 
"size": 300, 
"explain": true, 
"query": { 
    "match": { 
    "Name": { 
     "query": "ExampleName" 
     } 
    } 
    } 
} 

jest około 1,1 mln dokumentów, że wyszukiwanie jest wykonywane na. Co dostanę w zamian, to (to tylko część wyniku, sformatowany na własną rękę):

650 "ExampleName" 7,313398 

651 "ExampleName" 7,313398 

652 "ExampleName" 7,313398 

653 "ExampleName" 7,239194 

654 "ExampleName" 7,239194 

860 "ExampleName of Something" 4,5708737 

gdzie pierwsze pole jest tylko Id, drugi to nazwa pola, na których ElasticSearch przeprowadzić to wyszukiwanie, a trzeci jest wynikiem.

Jak widać, istnieje wiele duplikatów w indeksie ES. Ponieważ niektóre z odnalezionych dokumentów mają różne wyniki, pomimo tego, że są dokładnie takie same (z tylko różnym Id), doszedłem do wniosku, że różne odłamki wykonano przeszukując różne części całego zestawu danych, co prowadzi mnie do prześledzenia, że ​​wynik jest w pewnym stopniu oparty na ogólnej ocenie. dane w danym fragmencie, nie wyłącznie na dokumencie, który jest faktycznie brany pod uwagę przez wyszukiwarkę.

Pytanie brzmi, jak dokładnie działa ta punktacja? Czy możesz mi powiedzieć/pokazać/wskazać mi dokładną formułę obliczania wyniku dla każdego dokumentu znalezionego przez ES? I w końcu, w jaki sposób można zmienić ten mechanizm punktowania?

Odpowiedz

11

Domyślną wartością jest algorytm DefaultSimilarity w rdzeniu Lucene, largely documented here. Możesz dostosować punktację, konfigurując your own Similarity lub używając czegoś takiego jak custom_score query.

Dziwna zmiana wyniku w pierwszych pięciu wynikach wydaje się na tyle mała, że ​​nie dotyczy mnie zbyt wiele, jeśli chodzi o ważność wyników zapytania i ich kolejność, ale jeśli chcesz zrozumieć jego przyczynę, explain api może pokazać dokładnie, co się tam dzieje.

+0

OK, to prawie obejmuje to, co chciałem wiedzieć. Informacja, że ​​ES wykorzystuje wyłącznie podobieństwo Lucene jest bardzo pomocna. Dzięki! –

+0

Więcej szczegółów na temat czynników w algorytmie punktacji Lucene: http://www.lucenetutorial.com/advanced-topics/scoring.html – ThoQ

2

Zmiana wyniku opiera się na danych w danym fragmencie (jak podejrzewasz). Domyślnie ES używa wyszukiwania o nazwie "zapytanie następnie pobrać", który wysyła zapytanie do każdego odłamka, znajduje wszystkie pasujące dokumenty z wynikami przy użyciu lokalnych TDIF (to będzie się różnić w zależności od danych na danym fragmencie - tu jest twój problem) .

Możesz to zmienić, używając zapytania "dll" , a następnie pobrać "typ wyszukiwania - prequery każdego fragmentu pytającego o częstotliwości i dokumenty, a następnie wysyła zapytanie do każdego odłamka itd.

Można ustawić go w url

$ curl -XGET '/index/type/search?pretty=true&search_type=dfs_query_then_fetch' -d '{ 
    "from": 0, 
    "size": 300, 
    "explain": true, 
    "query": { 
    "match": { 
     "Name": { 
     "query": "ExampleName" 
     } 
    } 
    } 
}' 
Powiązane problemy