повысить результаты с помощью целочисленного поля - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать и автозаполнять места назначения и хочу повысить результаты с помощью целочисленного поля популярности.

Я пытаюсь с помощью этого запроса 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'
                    ]
                ],
            ],

Mapping &настройки:

'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.-Валь д'Аоста 2.-Пуэрто-Лопес 3.-Бристоль - В.А. и многие другие ... (но не Пуэрто-Вальярта)

Важно подчеркнуть, что без оценки функции и field_value_factor этот запрос работает, как ожидать (возврат в первую позицию, пуэрто-вальярта.)

Я хочу добавить возможность повышения популярности городов сцелочисленное значение.

Есть предложения?

Спасибо!

1 Ответ

0 голосов
/ 05 декабря 2018

По умолчанию ваш field_value_factor будет умножать натуральную оценку на значение поля popularity.Таким образом, если значение равно 0 для Puerto Vallarta, тогда его счет всегда будет равен 0. Он будет совпадать, но никогда не будет в первых результатах.

Кроме того, ваше повышение будет линейным, это, конечно, не то, что вам нужно, поскольку популярные города полностью сократят список результатов.

Затем следует использовать свойство modifier фактора значения поля документ здесь .

Если установить значение log2p, оно должно работать как положено.Модификатор log2p добавит 2 к значению поля popularity перед применением функции журнала.Тогда разница в ускорении между городом популярности 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
                ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...