Elasticsearch自定义功能得分

时间:2016-06-21 08:47:07

标签: elasticsearch

我正在尝试使用自定义函数进行搜索以修改文档分数。 我有一个存储在医院内的专业的映射,每个专业都优先考虑: 类似的东西:

hospital:{
  name: 'Fortis', 
  specialities: [
   {
   name: 'Cardiology',
   priority: 10
  },
   {
   name: 'Oncology',
   priority: 15
  }
]
}

现在我有一个功能评分:

functions: [{
     filter: {terms: {'specialities.name' => params[:search_text]}},
     script_score: {script: "_score * doc['specialities.priority'].value"}
                        },

我有一个过滤查询,可以将搜索文本与任何专业相匹配。 就像我搜索Oncology一样,它会匹配,然后我指定了一个script_score来优先考虑该专业并将其添加到文档的最终得分。

但是,它所遇到的第一个专业的优先级为10,过滤器匹配的得分为1,最终得分为11而不是21(肿瘤学的优先级 + 1为过滤匹配)

1 个答案:

答案 0 :(得分:1)

我使用elasticsearch中的嵌套映射解决了这个问题。 Lucene内部没有默认存储对象映射的概念,所以如果我希望为每个专业存储优先级,我应该有这样的映射:

/p{L}

参考:https://www.elastic.co/guide/en/elasticsearch/reference/2.0/nested.html

之后,我能够使用嵌套查询定义功能得分,我的查询如下所示:

hospital: {
  properties: {
    specialities: {
      type: nested,
      properties: {
        name: {
          type: 'string'
        }priority: {
          type: 'long'
        }
      }
    }
  }
}