[検索技術]
Elasticsearch
- 主に検索時のスコアの出し方について
スコアリングの算出方式
- IDFを無効化するにはどうすればよいかという質問
Elasticsearchの検索スコア式を変える方法:
- デフォルト式
double tf = Math.sqrt(doc.freq); // Elasticsearchに格納されている時点でドキュメントには出現頻度(=doc_freq)がついているのかなぁ double idf = Math.log((field.docCount+1.0)/(term.docFreq+1.0)) + 1.0; // double norm = 1/Math.sqrt(doc.length); // return query.boost * tf * idf * norm;
- 用語の意味
- TF = Term Frequency
- IDF = Inverse Document Frequency
- Term Frequency
- tf(term frequency)とは、そのままの意味。ある単語の出現頻度である。ターム頻度。ある単語tがある文書d中に現れる回数を、文書d中の全ての単語数(重複を許す)で割った値を意味する。
- Inverse Document Frequency
- tf-idf(tf-idf重み)とは、tf重みとidf重みの積で与えられる。情報検索で最も有名で良く利用される重み付けの方法である。tf-idfの値は、文書中のタームの出現頻度と、文書集合中のタームの希少さに応じて増加します。式は以下の通り。(t=ターム、d=ドキュメント)ここでも、対数の底は重要でないので、なんでも良い
W_{t,d} = log(1 + tf_{t,d}) \cdot log \frac{N}{df_t}
- tf-idfを重みとして利用した場合の、ある文書のスコアは、以下のようになる。(q=クエリ、d=ドキュメント)
Score = \Sigma_{t \in q \cap d} tf \cdot idf_{t,d}