# 7.11.3.1. `scorer_tf_at_most`

Note

This scorer is an experimental feature.

New in version 5.0.1.

## 7.11.3.1.1. Summary

`scorer_tf_at_most` is a scorer based on TF (term frequency).

TF based scorer includes TF-IDF based scorer has a problem for the following case:

If document contains many same keywords such as “They are keyword, keyword, keyword … and keyword”, the document has high score. It’s not expected. Search engine spammer may use the technique.

`scorer_tf_at_most` is a TF based scorer but it can solve the case.

`scorer_tf_at_most` limits the maximum score value. It means that `scorer_tf_at_most` limits effect of a match.

If document contains many same keywords such as “They are keyword, keyword, keyword … and keyword”, `scorer_tf_at_most(column, 2.0)` returns at most `2` as score.

> You don’t need to resolve scoring only by score function. Score function is highly depends on search query. You may be able to use metadata of matched record.

> For example, Google uses PageRank for scoring. You may be able to use data type (“title” data are important rather than “memo” data), tag, geolocation and so on.

> Please stop to think about only score function for scoring.

## 7.11.3.1.2. Syntax

This scorer has two parameters:

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

## 7.11.3.1.3. Usage

This section describes how to use this scorer.

Here are a schema definition and sample data to show usage.

Sample schema:

Execution example:

    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]

Sample data:

Execution example:

    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]

You specify `scorer_tf_at_most` in match_columns like the following:

Execution example:

    select Logs \
      --match_columns "scorer_tf_at_most(message, 3.0)" \
      --query "Notice" \
      --output_columns "message, _score" \
      --sort_keys "-_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
    #       ]
    #     ]
    #   ]
    # ]

If a document has three or more `Notice` terms, its score is `3`. Because the `select` specify `3.0` as the max score.

If a document has one or two `Notice` terms, its score is `1` or `2`. Because the score is less than `3.0` specified as the max score.

## 7.11.3.1.4. Parameters

This section describes all parameters.

### 7.11.3.1.4.1. Required parameters

There is only one required parameter.

#### 7.11.3.1.4.1.1. `column`

The data column that is match target. The data column must be indexed.

#### 7.11.3.1.4.1.2. `index`

The index column to be used for search.

### 7.11.3.1.4.2. Optional parameters

There is no optional parameter.

## 7.11.3.1.5. Return value

This scorer returns score as Float32.

select returns `_score` as `Int32` not `Float`. Because it casts to `Int32` from `Float` for keeping backward compatibility.

Score is computed as TF with limitation.

## 7.11.3.1.6. See also

- Scorer