elasticsearch 通过整型字段提升结果
我正在尝试创建和自动完成目的地,我想通过一个流行整数字段来提高结果 我正在尝试使用此函数\u分数查询elasticsearch 通过整型字段提升结果,elasticsearch,boost,autocomplete,elasticsearch,Boost,Autocomplete,我正在尝试创建和自动完成目的地,我想通过一个流行整数字段来提高结果 我正在尝试使用此函数\u分数查询 'query' => [ 'function_score' => [ 'query' => [ "bool" => [ "should" => [
'query' => [
'function_score' => [
'query' => [
"bool" => [
"should" => [
[
"multi_match"=>[
"query"=>$text,
"fields"=>[
"destination_name_*"
],
"type"=>"most_fields",
"boost" => 2
]
],
[
"multi_match"=>[
"query"=>$text,
"fields"=>[
"destination_name_*"
],
"fuzziness" => "1",
"prefix_length"=> 2
]
],
[
"multi_match"=>[
"query"=>$text,
"fields"=>[
"destination_name_*.exact"
],
"boost" => 2
]
]
]
]
],
'field_value_factor' => [
'field'=>'popularity'
]
],
],
映射和设置:
'settings' => [
'analysis' => [
'filter' => [
'ngram_filter' => [
'type' => 'edge_ngram',
'min_gram' => 2,
'max_gram' => 20,
]
],
'analyzer' => [
'ngram_analyzer' => [
'type' => 'custom',
"tokenizer" => "standard",
'filter' => ['lowercase', 'ngram_filter'],
]
]
],
],
'mappings' =>[
'doc' => [
"properties"=> [
"destination_name_en"=> [
"type"=> "text",
"term_vector"=> "yes",
"analyzer"=> "ngram_analyzer",
"search_analyzer"=> "standard",
"fields" => [
"exact" => [
"type" => "text",
"analyzer" => "standard"
]
]
],
"destination_name_es"=> [
"type"=> "text",
"term_vector"=> "yes",
"analyzer"=> "ngram_analyzer",
"search_analyzer"=> "standard",
"fields" => [
"exact" => [
"type" => "text",
"analyzer" => "standard"
]
]
],
"destination_name_pt"=> [
"type"=> "text",
"term_vector"=> "yes",
"analyzer"=> "ngram_analyzer",
"search_analyzer"=> "standard",
"fields" => [
"exact" => [
"type" => "text",
"analyzer" => "standard"
]
]
],
"popularity"=> [
"type"=> "integer",
]
]
]
]
我将坎昆的人气值设为10,当我开始写ca时,第一个选项是坎昆。这项工作如预期
但问题是,当我试图找到另一个受欢迎度值为0的城市,比如巴利亚塔港。当我写入时,我得到以下结果:
1.-瓦尔·德奥斯塔
-波多洛佩兹
弗吉尼亚州布里斯托尔
还有很多其他的。。。但不是瓦拉塔港
重要的是要强调,在没有函数分数和字段值因素的情况下,该查询如何在第一个位置puerto vallarta预期回报
我想用一个整数值来增加热门城市的容量
有什么建议吗
谢谢 默认情况下,您的字段值因子将自然分数乘以字段流行度值。因此,如果Puerto Vallarta的值为0,则其得分将始终为0。它将匹配,但永远不会出现在第一个结果中
再加上你的提升将是线性的,这肯定不是你想要的,因为热门城市将完全压倒结果列表
然后应该使用字段值因子的属性修饰符
如果您将其设置为log2p,它应该可以按预期工作。在应用log函数之前,修饰符log2p将在popularity字段的值中添加2。那么2人气城市和4人气城市之间的增长差异将是合理的。但是,当受欢迎程度分数上升时,两者之间的差异会减小
例:
将此添加到您的查询:
'field_value_factor' => [
'field'=>'popularity',
'modifier' => 'log2p' <== add this
]
感谢现在我得到了预期的结果。你真是个骗子!
'field_value_factor' => [
'field'=>'popularity',
'modifier' => 'log2p' <== add this
]