# groonga - オープンソースのカラムストア機能付き全文検索エンジン

- English

# 7.11.3.1. `scorer_tf_at_most`

注釈

スコアラーは実験的な機能です。

バージョン 5.0.1 で追加.

## 7.11.3.1.1. 概要

`scorer_tf_at_most` はTF（term frequency。単語の出現数）ベースのスコアラーです。

TF-IDFベースのスコアラーを含むTFベースのスコアラーは次のケースに対して適していません。

文書中に「They are keyword, keyword, keyword ... and keyword」というように同じキーワードが大量に含まれているとその文書のスコアーが高くなってしまいます。これは意図した挙動ではありません。検索エンジンのスパマーはこのテクニックを使うかもしれません。

`scorer_tf_at_most` はTFベースのスコアラーですが、このケースを解決できます。

`scorer_tf_at_most` はスコアーの最大値を制限します。つまり、 `scorer_tf_at_most` は1つのマッチの影響を制限することができるということです。

文書中に「They are keyword, keyword, keyword ... and keyword」というように同じキーワードが大量に含まれていても、 `scorer_tf_at_most(column, 2.0)` はスコアーの値として大きくても `2` しか返しません。

> スコアー関数だけでスコアの計算をする必要はありません。スコアー関数は検索クエリーに非常に依存しています。検索クエリーだけでなく、マッチしたレコードのメタデータも使えないか検討しましょう。

> たとえば、Googleはスコアーの計算に ページランク を使っています。あなたも、データの種類（たとえば、「メモ」データよりも「タイトル」データの方が重要など）、タグ、位置情報などを使えないか検討してみましょう。

> スコアーの計算をスコアー関数だけで考えることはやめましょう。

## 7.11.3.1.2. 構文

このスコアラーの引数は2つです。:

    scorer_tf_at_most(column, max)
    scorer_tf_at_most(index, max)

## 7.11.3.1.3. 使い方

このセクションではscorerの使い方について説明します。

使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。

サンプルスキーマ:

実行例:

    table_create Logs TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Logs message COLUMN_SCALAR Text
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Terms TABLE_PAT_KEY ShortText \
      --default_tokenizer TokenBigram \
      --normalizer NormalizerAuto
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Terms message_index COLUMN_INDEX|WITH_POSITION Logs message
    # [[0, 1337566253.89858, 0.000355720520019531], true]

サンプルデータ:

実行例:

    load --table Logs
    [
    {"message": "Notice"},
    {"message": "Notice Notice"},
    {"message": "Notice Notice Notice"},
    {"message": "Notice Notice Notice Notice"},
    {"message": "Notice Notice Notice Notice Notice"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 5]

次のように match_columns で `scorer_tf_at_most` を指定します。

実行例:

    select Logs \
      --match_columns "scorer_tf_at_most(message, 3.0)" \
      --query "Notice" \
      --output_columns "message, _score" \
      --sortby "-_score"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         5
    #       ],
    #       [
    #         [
    #           "message",
    #           "Text"
    #         ],
    #         [
    #           "_score",
    #           "Int32"
    #         ]
    #       ],
    #       [
    #         "Notice Notice Notice Notice Notice",
    #         3
    #       ],
    #       [
    #         "Notice Notice Notice Notice",
    #         3
    #       ],
    #       [
    #         "Notice Notice Notice",
    #         3
    #       ],
    #       [
    #         "Notice Notice",
    #         2
    #       ],
    #       [
    #         "Notice",
    #         1
    #       ]
    #     ]
    #   ]
    # ]

もし、文書が `Notice` という単語を3個以上含んでいたら、スコアーは `3` になります。なぜなら、この `select` ではスコアーの最大値を `3.0` と指定しているからです。

もし、文書が `Notice` という単語を1つか2つしか含んでいなかったら、スコアーは `1` か `2` になります。なぜなら、スコアーが指定された最大値 `3.0` より小さいからです。

## 7.11.3.1.4. 引数

このセクションではすべての引数について説明します。

### 7.11.3.1.4.1. 必須引数

1つだけ必須の引数があります。

#### 7.11.3.1.4.1.1. `column`

マッチ対象のデータカラムです。このデータカラムにはインデックスが張られていなければいけません。

#### 7.11.3.1.4.1.2. `index`

検索に使うインデックスカラムです。

### 7.11.3.1.4.2. 省略可能引数

省略可能な引数はありません。

## 7.11.3.1.5. 戻り値

このスコアラーは Float でスコアーの値を返します。

select は `Float` ではなく `Int32` で `_score` を返します。これは、後方互換性を維持するために `Float` から `Int32` にキャストしているためです。

スコアーは制限つきのTFで計算します。

## 7.11.3.1.6. 参考

- スコアラー