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żanieDefaultSimilarity
jestcomputeNorm
metoda podczas indeksowania rzeczy, zauważyłem, że dla 2 konkretnych dokumentów zwraca:
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 BTo 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 BDla 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?