簡體   English   中英

通過整數字段提升結果

[英]boost results by integer field

我正在嘗試創建目的地並自動完成目的地,我想通過人氣整數字段提高搜索結果。

我正在嘗試使用這個function_score查詢

'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的城市時,例如巴亞爾塔港。 當我寫“ Puerto Va”時,我得到以下結果:

1.-瓦萊達奧斯塔2.-洛佩斯港3.-布里斯托爾-弗吉尼亞州和其他許多國家(但不包括瓦拉塔港)

重要的是要強調,在此查詢中將列出功能分數和field_value_factor,以期達到預期效果(返回第一個位於vallarta的位置)。

我想用一個整數值增加熱門城市的容量。

有什么建議嗎?

謝謝!

默認情況下, field_value_factor將由字段的值乘以自然得分popularity 因此,如果Puerto VallartaPuerto Vallarta的值為0,則其分數將始終為0。它將匹配,但永遠不會出現在第一個結果中。

另外,您的收益將呈線性增長,這當然不是您想要的,因為熱門城市將完全壓倒結果列表。

然后,您應該在此處使用字段值因子doc的屬性modifier

如果將其設置為log2p則它將按預期工作。 修改器log2p將在應用對數函數之前,將popularity字段的值加2。 這樣,在2個受歡迎的城市和4個受歡迎的城市之間的提升差異就會很明顯。 但是隨着人氣分數的提高,差異會減小

例如:

popularity 2 => log(4) => 0.6
popularity 4 => log(6) => 0.77
popularity 20 => log(22) => 1.34
popularity 22 => log(24) => 1.38

將此添加到您的查詢:

                'field_value_factor' => [
                    'field'=>'popularity',
                    'modifier' => 'log2p' <== add this
                ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM