2013-10-02 70 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鏈接已破壞:( –