66 votes

ElasticSearch - renforcer la pertinence en fonction de la valeur du champ

Besoin de trouver un moyen dans ElasticSearch pour booster la pertinence d'un document basé sur une valeur d'un champ. Plus précisément, il y a un champ spécial dans mes documents où la hausse de la valeur du champ est, les plus pertinentes sur le doc qui le contient doit être, indépendamment de la recherche.

Examiner le document suivant de la structure:

{
    "_all" : {"enabled" : "true"},
    "properties" : {
        "_id":            {"type" : "string",  "store" : "yes", "index" : "not_analyzed"},
        "first_name":     {"type" : "string",  "store" : "yes", "index" : "yes"},
        "last_name":      {"type" : "string",  "store" : "yes", "index" : "yes"},
        "boosting_field": {"type" : "integer", "store" : "yes", "index" : "yes"}
        }
}

J'aimerais documents avec une plus grande boosting_field de la valeur à être de nature plus pertinents que ceux qui ont un faible boosting_field valeur. C'est juste un point de départ -- la correspondance entre la requête et les autres champs seront également pris en compte dans la détermination de la dernière note de pertinence de chaque document dans la recherche. Mais, toutes choses étant égales par ailleurs, plus la stimulation de champ, plus la pertinence du document.

Quelqu'un a une idée sur comment faire?

Merci beaucoup!

72voto

javanna Points 24751

Vous pouvez stimuler lors de l'indexation ou de la requête. D'habitude, je préfère requête à relancer, même si elle fait des requêtes un peu plus lent, sinon j'aurais besoin d'indexer chaque fois que je veux changer mon stimuler les facteurs, qui normalement besoin d'affiner et doivent être assez flexibles.

Il y a différentes façons d'appliquer de la requête stimuler à l'aide de la elasticsearch requête LIS:

Les trois premières requêtes sont particulièrement utiles si vous voulez donner un spécifique coup de pouce pour les documents qui correspondent à des requêtes spécifiques ou des filtres. Par exemple, si vous souhaitez augmenter seuls les documents publiés au cours du dernier mois. Vous pouvez utiliser cette approche avec votre boosting_field mais vous devez définir manuellement certains boosting_field intervalles et de leur donner un autre coup de pouce, ce qui n'est pas super.

La meilleure solution serait d'utiliser un Custom Score de Requête, ce qui permet de faire une requête et de personnaliser son score à l'aide d'un script. Il est très puissant, avec le script, vous pouvez directement modifier le score lui-même. Tout d'abord, j'avais l'échelle de la boosting_field valeurs à une valeur de 0 à 1, par exemple, de sorte que votre score final ne devient pas un grand nombre. Afin de faire que vous avez besoin de prédire ce sont plus ou moins les valeurs minimum et maximum que le champ peut contenir. Disons minimum de 0 et le maximum de 100000 par exemple. Si vous redimensionnez la boosting_field de la valeur à un nombre entre 0 et 1, puis vous pouvez ajouter le résultat au résultat comme ceci:

{
    "query" : {
        "custom_score" : {
            "query" : {
                "match_all" : {}
            },
            "script" : "_score + (1 * doc.boosting_field.doubleValue / 100000)"
        }
    }
}

Vous pouvez également envisager d'utiliser le boosting_field comme un facteur de boost (_score * plutôt que d' _score +), mais alors vous devrez changer l'échelle pour un intervalle avec un minimum de valeur 1 (il suffit d'ajouter un +1).

Vous pouvez même régler le résultat de la modification de son importance, l'ajout d'un poids à la valeur que vous utilisez pour influencer le score. Vous allez avoir besoin d'encore plus si vous avez besoin de combiner plusieurs stimuler les facteurs réunis afin de leur donner un poids différent.

3voto

HolgT Points 311

si vous souhaitez éviter de renforcer chaque fois la requête, vous pouvez l’ajouter à votre mappage en ajoutant directement "boost: factor".

Votre mapping peut alors ressembler à ceci:

 {
    "_all" : {"enabled" : "true"},
    "properties" : {
        "_id":            {"type" : "string",  "store" : "yes", "index" : "not_analyzed"},
        "first_name":     {"type" : "string",  "store" : "yes", "index" : "yes"},
        "last_name":      {"type" : "string",  "store" : "yes", "index" : "yes"},
        "boosting_field": {"type" : "integer", "store" : "yes", "index" : "yes", "boost" : 10.0,}
        }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X