Client-side libraries for personalized product filtering and ranking

From Open Food Facts wiki
Jump to navigation Jump to search

Summary

Client-side libraries for personalized product filtering and ranking is the 3rd of the 4 sub-tasks of the Project:Personalized_Search funded by the NGI0 Discovery Fund managed by NlNet.

Overview

Open-food-facts-personalized-search-project-overview.png

Diagram source: https://vecta.io/app/edit/-M2XyVv8ZoaLNrW-zQoT

  1. The Open Food Facts mobile app (and 3rd party apps) make generic search requests that do not contain user preferences
  2. The server returns a big number of generic results
  3. The app uses the user preferences stored locally to personalize the search results

User preferences

The user preferences are stored locally on the client (mobile app or browser).

User preferences format

To make it easier to develop libraries to show / edit / store preferences, and to use them to rank products, we define a standard format to save user preferences.

The preferences are saved in name / value pairs (hash table / associative array) of attribute ids mapping to string values.

The list of attribute ids will be sent by the server, along with localized names, descriptions, warnings etc.

String values:

  • "unset" : the user has not set a preference for the attribute (in ranking, treated like "not_important")
  • "not_important"
  • "important"
  • "very_important"
  • "mandatory"

The user preferences structure may not contain all possible attributes (e.g. if the server adds new attributes). In that case unexisting values are considered "unset".

Notes:

  • String values are used instead of 0, 1, 2, 3, 4 etc. so that the JSON is clearer to understand for humans, and so that we have the flexibility to add other values later (e.g. "somewhat_important")

Example

{
  "nutriscore": "very_important",
  "nova": "not_important",
  "labels_organic": "very_important",
  "labels_fair_trade": "important"
}