2013-10-02 71 views
1

如何使用elasticsearch搜索特定年龄段的人? 因此,如果我按年龄输入28,我希望28岁的人有最高的分数,但也希望27岁的人能够显示,但得分较低。 出生日期的格式为yyyy-mm-dd,所以我必须将年龄转换为日期,但这不是问题。使用Elasticsearch查找特定日期附近的日期条目

我见到目前为止以下内容:

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

的1096d的min_similarity意味着谁是出生于1985年10月+/- 3年第1人。

因此,所有出生于1982年到1988年之间的人都会被展示 - 这很好,但他们都有1.0分。我怎样才能得到最接近1985年10月1日的生日的最高分?

回答

3

您可以使用脚本计算自定义分数。该脚本使用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/

+0

哇!这效果很好!感谢您的想法如何完成并提供所需的代码! 在你的代码的脚本部分有2个换行符与“\”。为了让代码工作,我必须删除换行符和斜线。也许你从代码中删除它们,这样每个人都可以复制它。 – oliverspies

+0

doc链接已破坏:( –