1

Elasticsearch を使用して特定の年齢の人を検索するにはどうすればよいですか? したがって、年齢として 28 を入力すると、28 歳の人に最高のスコアが表示されますが、27 歳の人も表示されますが、スコアは低くなります。生年月日はyyyy-mm-ddという形式で保存されているので、年齢を日付に換算する必要がありますが、問題ありません。

これまでのところ、次のものがあります。

{
    "query": {
        "fuzzy": {
            "birthdate": {
                "value": "1985-10-01",
                "min_similarity": "1096d"
            }
        }
    }
}

1096d の min_similarity は、1985 年 10 月 1 日に生まれた人々 +/- 3 年を意味します。

1982 年から 1988 年の間に生まれたすべての人が表示されます。生年月日が 1985-10-01 に最も近いエントリの最高スコアを取得するにはどうすればよいですか?

4

2 に答える 2

4

スクリプトを使用してカスタム スコアを計算できます。このスクリプトは、SimpleDateFormat を使用して日付 (1985-10-01) を解析し、その日付 (ミリ秒) からドキュメントの日付 (ミリ秒) を引いた絶対値を計算します。最初に最小値 (目標日に最も近い) が必要なため、デフォルトの降順ではなく、スコアの昇順で並べ替えます。

{
  "query": {
    "custom_score": {
      "query": {
        "fuzzy": {
          "birthdate": {
            "value": "1985-10-01",
            "min_similarity": "1096d"
          }
        }
      },
      "script": "abs(new \
java.text.SimpleDateFormat('yyyy-MM-dd').parse('1985-10-01').getTime() - \
doc['birthdate'].date.getMillis())"
    }
  },
  "sort": [
      { "_score": "asc" }
  ]
}

カスタム スコアリングの詳細については、http: //www.elasticsearch.org/guide/reference/query-dsl/custom-score-query/ をご覧ください。

于 2013-10-02T16:10:08.283 に答える