gpt4 book ai didi

elasticsearch - Elasticsearch自定义功能得分

转载 作者:行者123 更新时间:2023-12-02 23:29:36 25 4
gpt4 key购买 nike

我正在尝试使用自定义功能进行搜索以修改文档分数。
我有一个映射,其中存储了医院内的专业,每个专业都有一个优先级:
就像是:

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"}
},

我有一个过滤器查询,以使搜索文本与任何专业相匹配。
就像我搜索肿瘤学一样,它将匹配,然后我指定了一个script_score来优先处理该专业并将其添加到文档的最终分数中。

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

最佳答案

我在Elasticsearch中使用嵌套映射解决了它。
Lucene内部没有默认情况下存储对象映射的概念,因此,如果我希望为每个专业存储优先级,我应该有一个这样的映射:

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

引用: https://www.elastic.co/guide/en/elasticsearch/reference/2.0/nested.html

之后,我能够使用嵌套查询定义函数得分,而我的查询如下所示:
  "query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"nested": {
"path": "specialities",
"query": {
"function_score": {
"score_mode": "sum",
"boost_mode": "sum",
"filter": {
"terms": {
"specialities.name.raw": ["Oncology"]
}
},
"functions": [
{
"field_value_factor": {
"field": "specialities.priority"
}
}
]
}
}
}
}
]
}
}
}
}

关于elasticsearch - Elasticsearch自定义功能得分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37939620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com