2015-09-28 38 views
13

我有一個查詢(以及它的一部分 - 剩下的就是不重要的像分頁):Elasticsearch - 具有較高的價值提升嵌套查詢

"query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "is_active": true 
       } 
      } 
      ], 
      "should": [ 
      { 
       "bool": { 
       "must": [ 
        { 
        "nested": { 
         "path": "skills", 
         "query": { 
         "bool": { 
          "must": [ 
          { 
           "bool": { 
           "must": [ 
            { 
            "range": { 
             "skills.value": { 
             "gte": "2" 
             } 
            } 
            }, 
            { 
            "term": { 
             "skills.skill.name": "php" 
            } 
            } 
           ] 
           } 
          } 
          ] 
         } 
         } 
        } 
        } 
       ], 
       "boost": 2 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 

這是用於搜索個人資料,其中有一個技能「PHP」與價值2個或更多。用戶可以搜索多個技能=>值對。 它工作正常,但我有一個問題:

如何提高skill.value相匹配的技能,只是爲了讓PHP值爲3的人在搜索結果中比擁有PHP 2的人更高如果兩者都是正確的匹配。

回答

3

我建議使用function_score做到這一點,更具體的field_value_factor function這允許使用在評分計算字段值(與用來乘以字段值可選的因素):獲得問題

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "is_active": true 
       } 
      } 
      ], 
      "should": [ 
      { 
       "nested": { 
       "path": "skills", 
       "query": { 
        "function_score": { 
        "query": { 
         "bool": { 
         "must": [ 
          { 
          "range": { 
           "skills.value": { 
           "gte": "2" 
           } 
          } 
          }, 
          { 
          "term": { 
           "skills.skill.name": "php" 
          } 
          } 
         ] 
         } 
        }, 
        "functions": [ 
         { 
         "field_value_factor": { 
          "field": "skills.value", 
          "factor": 2 
         } 
         } 
        ] 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

: :「TransportError:TransportError(500,u'search_phase_execution_exception',u'org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData can not to cast to org.elasticsearch.index.fielddata.IndexNumericFieldData')」 –