{{category 検索技術}} !!! Elasticsearch * 主に検索時のスコアの出し方について !! スコアリングの算出方式 * IDFを無効化するにはどうすればよいかという質問 ** [Elasticsearch score disable IDF|https://stackoverflow.com/questions/33208587/elasticsearch-score-disable-idf] * Elasticsearch公式 ** [Elasticsearch: The Definitive Guide 2.x » Search in Depth » Controlling Relevance » Theory Behind Relevance Scoring|https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html] Elasticsearchの検索スコア式を変える方法: * デフォルト式 {{list 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|http://www.cse.kyoto-su.ac.jp/~g0846020/keywords/tf.html] ** tf(term frequency)とは、そのままの意味。ある単語の出現頻度である。ターム頻度。ある単語tがある文書d中に現れる回数を、文書d中の全ての単語数(重複を許す)で割った値を意味する。 * [Inverse Document Frequency|http://www.cse.kyoto-su.ac.jp/~g0846020/keywords/tf-idf.html] ** tf-idf(tf-idf重み)とは、tf重みとidf重みの積で与えられる。情報検索で最も有名で良く利用される重み付けの方法である。tf-idfの値は、文書中のタームの出現頻度と、文書集合中のタームの希少さに応じて増加します。式は以下の通り。(t=ターム、d=ドキュメント)ここでも、対数の底は重要でないので、なんでも良い {{gtex W_{t,d} = log(1 + tf_{t,d}) \cdot log \frac{N}{df_t} }} * tf-idfを重みとして利用した場合の、ある文書のスコアは、以下のようになる。(q=クエリ、d=ドキュメント) {{gtex Score = \Sigma_{t \in q \cap d} tf \cdot idf_{t,d} }}