2016-09-26 16 views
0

我一直試圖解決這個問題好幾個小時,但似乎沒有改變function_score衰變函數的返回值。它始終是1。它看起來不能得到我指定的字段的整數?Elasticsearch function_score decay不工作,總是返回1

的數據模型看起來像這樣(顯然假):

{ 
    "basics": { 
    "name": "Mr Augustus Flybynight (Jim)", 
    "name_pref": "Jim", 
    "location": { 
     "city": "Melbourne", 
     "postalCode": "3040", 
     "meta": { 
     "country": "Australia" 
     }, 
     "region": "VIC", 
     "address": "iytiytiyt, tyiuyti" 
    }, 
    "email": "[email protected]", 
    "applicantNumber": "11882", 
    "name_first": "Augustus", 
    "meta": { 
     "alternateContact": "", 
     "lastModified": 1473353751, 
     "alternateName": "", 
     "notificationType": "-1", 
     "alternatePhones": [ 

     ], 
     "gender": "M" 
    }, 
    "name_last": "Flybynight", 
    "phone": "44556677" 
    } 
} 

我有這個實體,唯一的區別是他們的時間戳(basics.meta.lastModified)的3個重複。我正在努力創造一個'更接近更好'的功能分數,讓最新的技術達到頂峯。我們尚未將時間戳映射爲日期,但將其映射爲整數。

當試圖以下列

{ 
    "query": { 
    "function_score": { 
     "functions": [ 
     { 
      "gauss": { 
      "basics.meta.lastModified": { 
       "origin": 1474868635, // now 
       "offset": 86400, // one day 
       "scale": 604800, // seven days 
       "decay": 0.5 
      } 
      }, 
      "weight": 2 
     } 
     ], 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "match": { 
       "_all": "augustus flybynight" 
       } 
      }, 
      { 
       "match": { 
       "basics.all_names.all_names_identifier_whitespace": { 
        "query": "augustus flybynight", 
        "boost": 2 
       } 
       } 
      }, 
      { 
       "match": { 
       "basics.email.email_identifier_keyword": { 
        "query": "augustus flybynight", 
        "boost": 3 
       } 
       } 
      }, 
      { 
       "match": { 
       "basics.applicantNumber.applicantNumber_identifier_keyword": { 
        "query": "augustus flybynight", 
        "boost": 3 
       } 
       } 
      }, 
      { 
       "wildcard": { 
       "basics.email.email_identifier_keyword": { 
        "wildcard": "augustus flybynight*", 
        "boost": 2 
       } 
       } 
      }, 
      { 
       "wildcard": { 
       "basics.all_names.all_names_identifier_whitespace": { 
        "wildcard": "augustus flybynight*" 
       } 
       } 
      } 
      ], 
      "must": [] 
     } 
     } 
    } 
    }, 
    "size": 25, 
    "from": 0, 
    "min_score": 0.2 
} 

查詢但這總是返回「1」的功能評分,然後乘以該查詢並不會對其產生影響。這是最奇怪的事情。

當的解釋看,這就是所返回的內容:

{ 
    "value": 1, 
    "description": "min of:", 
    "details": [ 
    { 
     "value": 1, 
     "description": "product of:", 
     "details": [ 
     { 
      "value": 1, 
      "description": "Function for field basics.meta.lastModified:", 
      "details": [ 
      { 
       "value": 1, 
       "description": "max(0.0, ((2.0 - MIN[0.0])/2.0)", 
       "details": [ 

       ] 
      } 
      ] 
     }, 
     { 
      "value": 1, 
      "description": "weight", 
      "details": [ 

      ] 
     } 
     ] 
    }, 
    { 
     "value": 3.4028235e+38, 
     "description": "maxBoost", 
     "details": [ 

     ] 
    } 
    ] 
} 

好像「MIN [0.0]」是應該返回時間戳的一部分,但它不是,而不是返回0,使衰變函數總是1.如果我使衰減參數更嚴格,如原點:0,偏移量:0,比例尺:1和衰減:0.5,我希望function_score接近0,但它仍然是1.

請幫忙。我一直在嘗試一切,網上似乎沒有很多例子。任何建議都會受到歡迎。

+1

這可能是由於嵌套字段。這看起來像一個類似的問題:http://stackoverflow.com/a/34467377/689625 – jay

+0

@jay是的,這是。一個糟糕的映射是罪魁禍首。不能相信這花費了我很長時間才找到它,而ES沒有提及它:/ –

回答

1

對於那些觸及相同問題的人,我終於找到了罪魁禍首。

似乎有人沒有正確設置映射,因爲basics.meta屬性被設置爲嵌套類型,但由於它沒有像這樣填充(你會認爲這會在索引數據時造成問題?),當試圖訪問其中的數據時,它總是返回MIN[0.0],因爲它無法找到該屬性的值。

所以是的,如果你曾經遇到過這個問題,請仔細看看你的映射,而不是象我一樣浪費整整一天。