Lucene fieldNorm rozbieżność między obliczaniem podobieństwa a wartością czasu zapytania

Próbuję zrozumieć, jakfieldNorm jest obliczany (w czasie indeksowania), a następnie używany (i najwyraźniej ponownie obliczany) w czasie zapytania.

We wszystkich przykładach używam narzędzia StandardAnalyzer bez słów stop.

OdśnieżanieDefaultSimilarityjestcomputeNorm metoda podczas indeksowania rzeczy, zauważyłem, że dla 2 konkretnych dokumentów zwraca:

0,5 dla dokumentu A (który ma 4 żetony w swoim polu)0,70710677 dla dokumentu B (który ma 2 tokeny w swoim polu)

Robi to za pomocą formuły:

state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));

gdzie boost jest zawsze 1

Potem, kiedy sprawdzam te dokumenty, widzę, że w zapytaniu wyjaśnię, co otrzymuję

0.5 = fieldNorm(field=titre, doc=0) dla dokumentu A0.625 = fieldNorm(field=titre, doc=1) dla dokumentu B

To już dziwne (dla mnie jestem pewien, że to ja czegoś mi brakuje). Dlaczego nie otrzymuję tych samych wartości dla normy pola, co te obliczone w czasie indeksowania? Czy to jest „normalizacja zapytań” w działaniu? Jeśli tak, jak to działa?

Jest to jednak mniej lub bardziej w porządku, ponieważ dwie zmienne typu pola czasu kwerendy dają taką samą kolejność, jak te obliczane w czasie indeksu (pole o krótszej wartości ma wyższy współczynnik pola w obu przypadkach)

Następnie stworzyłem własną klasę podobieństwa, w której zaimplementowałem metodę computeNorms w taki sposób:

public float computeNorm(String pField, FieldInvertState state) {
    norm = (float) (state.getBoost() + (1.0d / Math.sqrt(state.getLength())));
    return norm;
}

W czasie indeksu otrzymuję teraz:

1.5 dla dokumentu A (który ma 4 żetony w swoim polu)1.7071068 dla dokumentu B (który ma 2 żetony w swoim polu)

Jednak teraz, gdy sprawdzam te dokumenty, widzę, że oba mają tę samą normę pola, co raportowana funkcja wyjaśniania:

1.5 = fieldNorm(field=titre, doc=0) dla dokumentu A1.5 = fieldNorm(field=titre, doc=1) dla dokumentu B

Dla mnie jest to teraz naprawdę dziwne, jak to się dzieje, jeśli użyję pozornie dobrego podobieństwa do obliczenia pola fieldNorm w czasie indeksu, co daje mi odpowiednie wartości proporcjonalne do liczby tokenów, później, w czasie kwerendy, wszystko to jest tracone i w zapytaniu oba dokumenty mają tę samą normę pola?

Moje pytania to:

dlaczego czas indeksu fieldNorm zgłaszany przez metodę computeNorm podobieństwa nie pozostaje taki sam, jak raportowany przez zapytanie wyjaśnij?dlaczego dla dwóch różnych wartości fieldNorm uzyskanych w czasie indeksowania (przez podobieństwo computeNorm) otrzymuję identyczne wartości fieldNorm w czasie zapytania?

== AKTUALIZACJA

Ok, znalazłem cośDokumenty Lucene co wyjaśnia niektóre z moich pytań, ale nie wszystkie:

Jednak wynikowa wartość normy jest kodowana jako pojedynczy bajt przed zapisaniem. W czasie wyszukiwania wartość bajtu normy jest odczytywana z katalogu indeksu i dekodowana z powrotem do wartości normalnej. To kodowanie / dekodowanie, przy jednoczesnym zmniejszeniu rozmiaru indeksu, wiąże się z ceną utraty precyzji - nie ma gwarancji, że dekodowanie (kodowanie (x)) = x. Na przykład dekoduj (koduj (0,89)) = 0,75.

Ile jest strat dokładności? Czy istnieje minimalna luka, jaką powinniśmy wprowadzić między różnymi wartościami, aby pozostały inne nawet po ponownym obliczeniu strat precyzyjnych?

questionAnswers(1)

yourAnswerToTheQuestion