Recherche élastique - base de pondération sur un attribut

Aug 21 2020

Existe-t-il un moyen dans Elastic Search de pondérer les résultats en fonction d'un attribut autre que celui utilisé pour la requête de recherche. Par exemple, nous recherchons le champ 'name', mais tous les documents qui ont 'with_pictures' attribué à true ont un poids plus élevé.

Réponses

2 ESCoder Aug 21 2020 at 09:08

Vous pouvez utiliser le boost sur des champs individuels, qui seront boostés automatiquement - compter davantage pour le score de pertinence - au moment de la requête, avec le paramètre boost

Ajout d'un exemple de travail avec des données d'index, un mappage et une requête de recherche

Mappage d'index :

{
  "mappings": {
    "properties": {
      "with_pictures": {
        "type": "boolean",
        "boost": 2 
      },
      "name": {
        "type": "keyword"
      }
    }
  }
}

Données d'index :

{
    "name": "A",
    "with_pictures": false
}

{
    "name": "A",
    "with_pictures": true
}
{
    "name": "B",
    "with_pictures": true
}

Requête de recherche :

{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "should": [

              {
                "term": {
                  "name": "A"
                }
              },
              {
                "term": {
                  "with_pictures": true
                }
              }
            ]
          }
        }
      ]
    }
  }
}

Résultat de la recherche:

 "hits": [
      {
        "_index": "fd_cb1",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.4100108,
        "_source": {
          "name": "A",
          "with_pictures": true
        }
      },
      {
        "_index": "fd_cb1",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.9400072,
        "_source": {
          "name": "B",
          "with_pictures": true
        }
      },
      {
        "_index": "fd_cb1",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.4700036,
        "_source": {
          "name": "A",
          "with_pictures": false
        }
      }
    ]

Score de documents satisfaisant à la fois aux conditions de nameet with_propertiesayant le score le plus élevé. Mais le document ayant name: Bet with_pictures: trueayant un score supérieur à name: Aet with_pictures: false( à cause du boost appliqué sur lewith_pictures

Vous pouvez également référencer une requête de score de fonction qui vous permet de modifier le score des documents récupérés par une requête.