Repository: hhursev/recipe-scrapers
Pull request #1128 (2024-05-06 23:48:27)

Updated keyword functionality
Reopening the changes from #1059 with improvements & doc updates

jayaddison: Ok, I guess the keywords here seem less spammy than I feared when reverting the change.
jknndy: > Ok, I guess the keywords here seem less spammy than I feared when reverting the change.

A few are spammy but overall i think its best to leave as is for the time being

Patch:
diff --git a/README.rst b/README.rst
index 4b131747..d9aacafe 100644
--- a/README.rst
+++ b/README.rst
@@ -60,6 +60,7 @@ then:
     scraper.canonical_url()  # not always available
     scraper.equipment()  # not always available
     scraper.cooking_method()  # not always available
+    scraper.keywords()  # not always available
 
 You also have an option to scrape html-like content
 
diff --git a/docs/in-depth-guide-scraper-functions.md b/docs/in-depth-guide-scraper-functions.md
index 22ee37cb..b9a924a7 100644
--- a/docs/in-depth-guide-scraper-functions.md
+++ b/docs/in-depth-guide-scraper-functions.md
@@ -331,3 +331,12 @@ Returns the method of cooking the recipe.
 >>> scraper.cooking_method()
 'Stovetop'
 ```
+
+### `keywords() -> list`
+
+Returns a `list` of keywords associated with a recipe.
+
+```py
+>>> scraper.keywords()
+['easy', 'quick', 'dinner']
+```
diff --git a/recipe_scrapers/_abstract.py b/recipe_scrapers/_abstract.py
index bc9fa297..15f6c690 100644
--- a/recipe_scrapers/_abstract.py
+++ b/recipe_scrapers/_abstract.py
@@ -109,6 +109,10 @@ class AbstractScraper:
         """Nutrients of the recipe."""
         raise NotImplementedError("This should be implemented.")
 
+    def keywords(self):
+        """Keywords or tags used to describe the recipe"""
+        raise NotImplementedError("This should be implemented.")
+
     def language(self):
         """Language the recipe is written in."""
         candidate_languages = OrderedDict()
diff --git a/recipe_scrapers/_schemaorg.py b/recipe_scrapers/_schemaorg.py
index 3f098ccb..5a35bf1e 100644
--- a/recipe_scrapers/_schemaorg.py
+++ b/recipe_scrapers/_schemaorg.py
@@ -10,7 +10,7 @@ import extruct
 from recipe_scrapers.settings import settings
 
 from ._exceptions import SchemaOrgException
-from ._utils import get_minutes, get_yields, normalize_string
+from ._utils import csv_to_tags, get_minutes, get_yields, normalize_string
 
 SCHEMA_ORG_HOST = "schema.org"
 
@@ -322,3 +322,14 @@ class SchemaOrg:
         if cooking_method and isinstance(cooking_method, list):
             cooking_method = cooking_method[0]
         return normalize_string(cooking_method)
+
+    def keywords(self):
+        keywords = self.data.get("keywords")
+        if keywords is None:
+            raise SchemaOrgException("No keywords data in SchemaOrg")
+        if keywords:
+            if isinstance(keywords, list):
+                keywords = ", ".join(keywords)
+            keywords = normalize_string(keywords)
+            keywords = csv_to_tags(keywords)
+        return keywords
diff --git a/recipe_scrapers/_utils.py b/recipe_scrapers/_utils.py
index 935ba30f..6144193a 100644
--- a/recipe_scrapers/_utils.py
+++ b/recipe_scrapers/_utils.py
@@ -232,6 +232,18 @@ def normalize_string(string):
     )
 
 
+def csv_to_tags(csv, lowercase=False):
+    raw_tags = csv.split(",")
+    seen = set()
+    tags = []
+    for raw_tag in raw_tags:
+        tag = raw_tag.strip()
+        if tag and tag.lower() not in seen:
+            seen.add(tag.lower())
+            tags.append(tag.lower() if lowercase else tag)
+    return tags
+
+
 def url_path_to_dict(path):
     pattern = (
         r"^"
diff --git a/recipe_scrapers/plugins/schemaorg_fill.py b/recipe_scrapers/plugins/schemaorg_fill.py
index eb119ec6..bf3c2d0b 100644
--- a/recipe_scrapers/plugins/schemaorg_fill.py
+++ b/recipe_scrapers/plugins/schemaorg_fill.py
@@ -37,6 +37,7 @@ class SchemaOrgFillPlugin(PluginInterface):
         "description",
         "cook_time",
         "prep_time",
+        "keywords",
         "ratings_count",
     )
 


Test patch:
diff --git a/tests/__init__.py b/tests/__init__.py
index 6150be32..6c69cde2 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -30,6 +30,7 @@ OPTIONAL_TESTS = [
     "nutrients",
     "prep_time",
     "cooking_method",
+    "keywords",
     "ratings",
     "reviews",
     "equipment",
diff --git a/tests/library/test_utils.py b/tests/library/test_utils.py
index 1123332b..55b55dc9 100644
--- a/tests/library/test_utils.py
+++ b/tests/library/test_utils.py
@@ -90,6 +90,7 @@ class TestUtils(unittest.TestCase):
             "ingredients",
             "instructions",
             "instructions_list",
+            "keywords",
             "language",
             "nutrients",
             "prep_time",
diff --git a/tests/test_data/101cookbooks.com/onehundredonecookbooks.json b/tests/test_data/101cookbooks.com/onehundredonecookbooks.json
index 94a649d2..da150618 100644
--- a/tests/test_data/101cookbooks.com/onehundredonecookbooks.json
+++ b/tests/test_data/101cookbooks.com/onehundredonecookbooks.json
@@ -60,5 +60,8 @@
   "site_name": "101 Cookbooks",
   "title": "Broccoli Soup with Coconut Milk",
   "total_time": 20,
-  "yields": "8 servings"
+  "yields": "8 servings",
+  "keywords": [
+    "broccoli soup"
+  ]
 }
diff --git a/tests/test_data/750g.com/g750g.json b/tests/test_data/750g.com/g750g.json
index aff0dee7..dd05d6cc 100644
--- a/tests/test_data/750g.com/g750g.json
+++ b/tests/test_data/750g.com/g750g.json
@@ -56,6 +56,10 @@
   "title": "Salade de carottes cuites et crues à l'orange",
   "total_time": 35,
   "yields": "6 servings",
+  "keywords": [
+    "salade de carottes",
+    "salade de carottes cuites"
+  ],
   "description": "La petite salade détox parfaite pour un déjeuner vitaminé au coeur de l'hiver",
   "cook_time": 15,
   "prep_time": 20
diff --git a/tests/test_data/aberlehome.com/aberlehome.json b/tests/test_data/aberlehome.com/aberlehome.json
index 2c1d2887..b632dab1 100644
--- a/tests/test_data/aberlehome.com/aberlehome.json
+++ b/tests/test_data/aberlehome.com/aberlehome.json
@@ -71,6 +71,12 @@
   "title": "Sourdough Croissants",
   "total_time": 1335,
   "yields": "10 servings",
+  "keywords": [
+    "sourdough croissants",
+    "sourdough croissant",
+    "homemade croissants",
+    "sourdough croissants no yeast"
+  ],
   "category": "Sourdough Recipes",
   "cook_time": 15,
   "prep_time": 60,
diff --git a/tests/test_data/abuelascounter.com/abuelascounter_1.json b/tests/test_data/abuelascounter.com/abuelascounter_1.json
index 84abd00e..f62f4f05 100644
--- a/tests/test_data/abuelascounter.com/abuelascounter_1.json
+++ b/tests/test_data/abuelascounter.com/abuelascounter_1.json
@@ -62,5 +62,18 @@
   "total_time": 105,
   "yields": "6 servings",
   "cook_time": 90,
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "abuela's",
+    "abuela's counter",
+    "alita oliva",
+    "cuban",
+    "cuban tradition",
+    "entree",
+    "hosting",
+    "roasted chicken",
+    "sunday dinner",
+    "tradition",
+    "traditional"
+  ]
 }
diff --git a/tests/test_data/abuelascounter.com/abuelascounter_2.json b/tests/test_data/abuelascounter.com/abuelascounter_2.json
index 3660b9f8..ccd72171 100644
--- a/tests/test_data/abuelascounter.com/abuelascounter_2.json
+++ b/tests/test_data/abuelascounter.com/abuelascounter_2.json
@@ -72,5 +72,16 @@
   "total_time": 45,
   "yields": "10 servings",
   "cook_time": 30,
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "abuelau0026#039;s",
+    "dessert",
+    "dessert ideas",
+    "easy recipes",
+    "hosting",
+    "hosting thanksgiving",
+    "thanksgiving",
+    "tradition",
+    "traditional"
+  ]
 }
diff --git a/tests/test_data/acouplecooks.com/acouplecooks.json b/tests/test_data/acouplecooks.com/acouplecooks.json
index 905ecc5c..be5be407 100644
--- a/tests/test_data/acouplecooks.com/acouplecooks.json
+++ b/tests/test_data/acouplecooks.com/acouplecooks.json
@@ -51,6 +51,9 @@
   "total_time": 8,
   "yields": "4 servings",
   "cooking_method": "Stovetop",
+  "keywords": [
+    "Garlic Butter Shrimp"
+  ],
   "cook_time": 3,
   "description": "This garlic butter shrimp has HUGE flavor in under 10 minutes! A fast and easy dinner for weeknights or entertaining, it will become your go-to.",
   "cuisine": "Shrimp",
diff --git a/tests/test_data/addapinch.com/addapinch_1.json b/tests/test_data/addapinch.com/addapinch_1.json
index b7f221f0..b6e34cf3 100644
--- a/tests/test_data/addapinch.com/addapinch_1.json
+++ b/tests/test_data/addapinch.com/addapinch_1.json
@@ -71,5 +71,15 @@
   "total_time": 45,
   "yields": "24 servings",
   "cook_time": 30,
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "best chocolate cake",
+    "chocolate cake",
+    "chocolate cake recipe",
+    "classic chocolate cake",
+    "dairy free chocolate cake",
+    "easy chocolate cake",
+    "egg free chocolate cake",
+    "gluten-free chocolate cake"
+  ]
 }
diff --git a/tests/test_data/addapinch.com/addapinch_2.json b/tests/test_data/addapinch.com/addapinch_2.json
index 8c641dac..deec9c74 100644
--- a/tests/test_data/addapinch.com/addapinch_2.json
+++ b/tests/test_data/addapinch.com/addapinch_2.json
@@ -81,6 +81,9 @@
     "Pastry Blender",
     "Grater/ Zester"
   ],
+  "keywords": [
+    "citrus scones"
+  ],
   "cook_time": 20,
   "prep_time": 10
 }
diff --git a/tests/test_data/ah.nl/albertheijn.json b/tests/test_data/ah.nl/albertheijn.json
index f4359b6a..64743cc0 100644
--- a/tests/test_data/ah.nl/albertheijn.json
+++ b/tests/test_data/ah.nl/albertheijn.json
@@ -56,5 +56,12 @@
   "site_name": null,
   "title": "Rijkgevulde vegan pastasalade",
   "total_time": 20,
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "veganistisch",
+    "vooraf te maken",
+    "salade",
+    "hoofdgerecht",
+    "koken"
+  ]
 }
diff --git a/tests/test_data/akispetretzikis.com/akispetretzikis.json b/tests/test_data/akispetretzikis.com/akispetretzikis.json
index 6e406ecf..25820653 100644
--- a/tests/test_data/akispetretzikis.com/akispetretzikis.json
+++ b/tests/test_data/akispetretzikis.com/akispetretzikis.json
@@ -72,5 +72,11 @@
   "total_time": 40,
   "yields": "10 servings",
   "cook_time": 25,
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "Lemon",
+    "chicken",
+    "with",
+    "artichokes"
+  ]
 }
diff --git a/tests/test_data/alltommat.se/alltomat_1.json b/tests/test_data/alltommat.se/alltomat_1.json
index 35f19a7d..ab77ce11 100644
--- a/tests/test_data/alltommat.se/alltomat_1.json
+++ b/tests/test_data/alltommat.se/alltomat_1.json
@@ -49,6 +49,9 @@
   "title": "Brioche-hamburgerbröd",
   "total_time": 155,
   "yields": "12 servings",
+  "keywords": [
+    "sections/recept"
+  ],
   "cook_time": 135,
   "description": "Recept på briochehamburgerbröd. Perfekta hamburgerbröd som är lätt söta och fluffiga. Inkråmet är mjukt och luftigt och tar upp smakerna från en saftig ­ham­burgare bra.",
   "prep_time": 20
diff --git a/tests/test_data/alltommat.se/alltomat_2.json b/tests/test_data/alltommat.se/alltomat_2.json
index e6f0f98a..8a3b22c7 100644
--- a/tests/test_data/alltommat.se/alltomat_2.json
+++ b/tests/test_data/alltommat.se/alltomat_2.json
@@ -112,5 +112,10 @@
   "title": "Köttbullar med potatismos, gräddsås, gurka och lingon",
   "total_time": 50,
   "yields": "4 servings",
+  "keywords": [
+    "sections/recept",
+    "topic/recept",
+    "topic/mat"
+  ],
   "description": "Recept på köttbullar med potatismos. Klassisk husmanskost när den är som allra bäst. Blir det köttbullar över är det goda att ha kalla på en macka. Vill du äta vegetariskt byts nötfärsen ut mot fryst och tinad, formbar vegofärs och kalvfonden mot koncentrerad grönsaksfond."
 }
diff --git a/tests/test_data/altonbrown.com/altonbrown_1.json b/tests/test_data/altonbrown.com/altonbrown_1.json
index 046a3768..6909943f 100644
--- a/tests/test_data/altonbrown.com/altonbrown_1.json
+++ b/tests/test_data/altonbrown.com/altonbrown_1.json
@@ -55,5 +55,10 @@
     "Digital instant-read thermometer",
     "2 (9-inch) round aluminum cake pans"
   ],
+  "keywords": [
+    "Baking",
+    "Desserts",
+    "Entertaining"
+  ],
   "prep_time": 120
 }
diff --git a/tests/test_data/altonbrown.com/altonbrown_2.json b/tests/test_data/altonbrown.com/altonbrown_2.json
index 4b54b6cb..3c738eca 100644
--- a/tests/test_data/altonbrown.com/altonbrown_2.json
+++ b/tests/test_data/altonbrown.com/altonbrown_2.json
@@ -79,6 +79,11 @@
     "Charcoal grill (See note)",
     "12 8-inch wooden skewers, smoked in water (See other note)"
   ],
+  "keywords": [
+    "Grill",
+    "Pork",
+    "skewer"
+  ],
   "cook_time": 10,
   "prep_time": 30
 }
diff --git a/tests/test_data/amazingribs.com/amazingribs_1.json b/tests/test_data/amazingribs.com/amazingribs_1.json
index d15a763c..d8e58d0d 100644
--- a/tests/test_data/amazingribs.com/amazingribs_1.json
+++ b/tests/test_data/amazingribs.com/amazingribs_1.json
@@ -58,6 +58,12 @@
     "sausage grinder",
     "sausage stuffer"
   ],
+  "keywords": [
+    "brisket",
+    "brisket sausage",
+    "sausage",
+    "smoked sausage"
+  ],
   "cook_time": 120,
   "description": "In the Lone Star state, smoked sausage is as central to barbecue as brisket. There is no standard recipe, but natural casing (the guts) always hold the ground meat mixture. My favorite blend leans more on pork than beef and includes lots of black pepper. IMPORTANT: Before you get started, read our article on The Science of Sausage Making.",
   "cuisine": "American",
diff --git a/tests/test_data/amazingribs.com/amazingribs_2.json b/tests/test_data/amazingribs.com/amazingribs_2.json
index 457b0b05..80e2a126 100644
--- a/tests/test_data/amazingribs.com/amazingribs_2.json
+++ b/tests/test_data/amazingribs.com/amazingribs_2.json
@@ -51,6 +51,11 @@
   "equipment": [
     "4 cups wood chunks or chips (about 8 ounces (226 g))"
   ],
+  "keywords": [
+    "brisket burnt ends",
+    "burnt ends",
+    "burnt ends recipe"
+  ],
   "cook_time": 600,
   "description": "Make mouthwatering smoked burnt end nuggets with this easy-to-follow recipe.",
   "cuisine": "American",
diff --git a/tests/test_data/ambitiouskitchen.com/ambitiouskitchen.json b/tests/test_data/ambitiouskitchen.com/ambitiouskitchen.json
index 2d4a0625..1119fa20 100644
--- a/tests/test_data/ambitiouskitchen.com/ambitiouskitchen.json
+++ b/tests/test_data/ambitiouskitchen.com/ambitiouskitchen.json
@@ -90,6 +90,9 @@
   "title": "Vegetarian Spinach Pumpkin Lasagna",
   "total_time": 70,
   "yields": "12 servings",
+  "keywords": [
+    "pumpkin lasagna"
+  ],
   "cook_time": 40,
   "description": "Incredible vegetarian spinach pumpkin lasagna with layers of melty cheese and pumpkin flavors. This healthy pumpkin lasagna recipe has a full bag of spinach for extra veggies and makes the best freezer-friendly dinner!",
   "prep_time": 30
diff --git a/tests/test_data/arla.se/arla_1.json b/tests/test_data/arla.se/arla_1.json
index a5de6628..a2bf03f3 100644
--- a/tests/test_data/arla.se/arla_1.json
+++ b/tests/test_data/arla.se/arla_1.json
@@ -69,5 +69,8 @@
   "site_name": "Arla",
   "title": "Reuben sandwich",
   "total_time": 40,
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "Smörgås"
+  ]
 }
diff --git a/tests/test_data/arla.se/arla_2.json b/tests/test_data/arla.se/arla_2.json
index 17742152..2f5ebb53 100644
--- a/tests/test_data/arla.se/arla_2.json
+++ b/tests/test_data/arla.se/arla_2.json
@@ -73,5 +73,8 @@
   "site_name": "Arla",
   "title": "Trifle på äpple med smulkrisp och vaniljglass",
   "total_time": null,
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "Smulpaj"
+  ]
 }
diff --git a/tests/test_data/averiecooks.com/averiecooks.json b/tests/test_data/averiecooks.com/averiecooks.json
index e3b94e71..ac2c63ca 100644
--- a/tests/test_data/averiecooks.com/averiecooks.json
+++ b/tests/test_data/averiecooks.com/averiecooks.json
@@ -55,6 +55,13 @@
   "title": "Balsamic Watermelon Cucumber Salad",
   "total_time": 20,
   "yields": "2 servings",
+  "keywords": [
+    "watermelon cucumber salad",
+    "watermelon goat cheese salad",
+    "watermelon and cucumber salad",
+    "watermelon salad balsamic",
+    "watermelon arugula salad"
+  ],
   "cook_time": 15,
   "description": "An EASY, healthy, and light salad with watermelon, cucumber, arugula, goat cheese, candied nuts, and drizzled with a homemade balsamic glaze!! A PERFECT summer salad for those days when it's too hot to cook!!",
   "cuisine": "American",
diff --git a/tests/test_data/baking-sense.com/bakingsense_1.json b/tests/test_data/baking-sense.com/bakingsense_1.json
index 7d792bbe..63ab44ad 100644
--- a/tests/test_data/baking-sense.com/bakingsense_1.json
+++ b/tests/test_data/baking-sense.com/bakingsense_1.json
@@ -89,6 +89,10 @@
     "Cooling Rack",
     "Half Sheet Pans"
   ],
+  "keywords": [
+    "buttermilk",
+    "sourdough"
+  ],
   "cook_time": 40,
   "prep_time": 20
 }
diff --git a/tests/test_data/baking-sense.com/bakingsense_2.json b/tests/test_data/baking-sense.com/bakingsense_2.json
index 7da7eb10..3516d4ad 100644
--- a/tests/test_data/baking-sense.com/bakingsense_2.json
+++ b/tests/test_data/baking-sense.com/bakingsense_2.json
@@ -87,6 +87,11 @@
     "Cake Boards",
     "Sieve"
   ],
+  "keywords": [
+    "chocolate cake",
+    "mousse",
+    "strawberry cake"
+  ],
   "cook_time": 30,
   "prep_time": 120
 }
diff --git a/tests/test_data/bakingmischief.com/bakingmischief_1.json b/tests/test_data/bakingmischief.com/bakingmischief_1.json
index 0c3d2787..b2d08dda 100644
--- a/tests/test_data/bakingmischief.com/bakingmischief_1.json
+++ b/tests/test_data/bakingmischief.com/bakingmischief_1.json
@@ -106,5 +106,8 @@
   "total_time": 190,
   "yields": "4 servings",
   "cook_time": 160,
-  "prep_time": 30
+  "prep_time": 30,
+  "keywords": [
+    "Barbacoa Burrito Bowl"
+  ]
 }
diff --git a/tests/test_data/bakingmischief.com/bakingmischief_2.json b/tests/test_data/bakingmischief.com/bakingmischief_2.json
index fdc84e4a..3c4bfeb2 100644
--- a/tests/test_data/bakingmischief.com/bakingmischief_2.json
+++ b/tests/test_data/bakingmischief.com/bakingmischief_2.json
@@ -77,5 +77,9 @@
   "total_time": 90,
   "yields": "4 servings",
   "cook_time": 25,
-  "prep_time": 20
+  "prep_time": 20,
+  "keywords": [
+    "Mini Carrot Cake",
+    "Small Carrot Cake"
+  ]
 }
diff --git a/tests/test_data/bbcgoodfood.com/bbcgoodfood.json b/tests/test_data/bbcgoodfood.com/bbcgoodfood.json
index 290d63e1..cd7795bd 100644
--- a/tests/test_data/bbcgoodfood.com/bbcgoodfood.json
+++ b/tests/test_data/bbcgoodfood.com/bbcgoodfood.json
@@ -55,5 +55,15 @@
   "total_time": 30,
   "yields": "2 servings",
   "cook_time": 20,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "Courgette",
+    "Easy",
+    "Elena Silcock",
+    "Fibre",
+    "Meatballs",
+    "Midweek meals",
+    "Quick",
+    "Spaghetti"
+  ]
 }
diff --git a/tests/test_data/bbcgoodfood.com/bbcgoodfood_groups.json b/tests/test_data/bbcgoodfood.com/bbcgoodfood_groups.json
index 7b9d742b..4a0b9c4a 100644
--- a/tests/test_data/bbcgoodfood.com/bbcgoodfood_groups.json
+++ b/tests/test_data/bbcgoodfood.com/bbcgoodfood_groups.json
@@ -69,5 +69,25 @@
   "yields": "12 items",
   "cook_time": 20,
   "cuisine": "British",
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "Josh Eagleton",
+    "30-60 minutes",
+    "400 kcal or less",
+    "Biscuit recipes",
+    "Cup cakes",
+    "Cupcake",
+    "Frosting",
+    "Good Food",
+    "Halloween recipes",
+    "Icing",
+    "Kids recipes",
+    "Party recipes",
+    "Spooky recipes",
+    "Sweet",
+    "Sweet recipe",
+    "Sweet recipes",
+    "Sweets",
+    "Vanilla extract"
+  ]
 }
diff --git a/tests/test_data/bestrecipes.com.au/bestrecipes.json b/tests/test_data/bestrecipes.com.au/bestrecipes.json
index bd1b9c28..8552625f 100644
--- a/tests/test_data/bestrecipes.com.au/bestrecipes.json
+++ b/tests/test_data/bestrecipes.com.au/bestrecipes.json
@@ -53,6 +53,38 @@
   "cook_time": 40,
   "prep_time": 15,
   "yields": "6 servings",
+  "keywords": [
+    "meat pie",
+    "pie",
+    "aussie",
+    "australian",
+    "mince",
+    "pastry",
+    "baking",
+    "australia day",
+    "autumn",
+    "beef mince",
+    "beef stock",
+    "dinner",
+    "egg",
+    "family friendly",
+    "freezer friendly",
+    "kid friendly",
+    "lunch",
+    "main",
+    "onion",
+    "plain flour",
+    "puff pastry",
+    "savoury",
+    "shortcrust pastry",
+    "spring",
+    "stock",
+    "summer",
+    "tomato sauce",
+    "winter",
+    "worcestershire sauce",
+    "budget club"
+  ],
   "category": "dinner, lunch, main",
   "cuisine": "australian",
   "ratings": 4.8,
diff --git a/tests/test_data/bettybossi.ch/bettybossi.json b/tests/test_data/bettybossi.ch/bettybossi.json
index a57393aa..b6a5f2f5 100644
--- a/tests/test_data/bettybossi.ch/bettybossi.json
+++ b/tests/test_data/bettybossi.ch/bettybossi.json
@@ -69,5 +69,20 @@
   "total_time": 90,
   "yields": "12 servings",
   "cook_time": 50,
-  "prep_time": 40
+  "prep_time": 40,
+  "keywords": [
+    "biscuits au beurre",
+    "beurre",
+    "fromage frais double crème",
+    "mascarpone",
+    "séré demi-gras",
+    "œufs",
+    "sucre",
+    "sucre vanillé",
+    "citron bio",
+    "liqueur au cassis",
+    "farine",
+    "myrtilles surgelées",
+    "jus de citron"
+  ]
 }
diff --git a/tests/test_data/bettycrocker.com/bettycrocker_1.json b/tests/test_data/bettycrocker.com/bettycrocker_1.json
index 3a316fa3..a2db7684 100644
--- a/tests/test_data/bettycrocker.com/bettycrocker_1.json
+++ b/tests/test_data/bettycrocker.com/bettycrocker_1.json
@@ -51,6 +51,9 @@
   "title": "Éclair Bars",
   "total_time": 290,
   "yields": "24 servings",
+  "keywords": [
+    "éclair bars"
+  ],
   "description": "We turned the classic, cream-filled French pastry into an oh-so-easy bar! With a flaky crescent base, a layer of silky vanilla pudding and a topping of rich chocolate ganache, this is a special dessert that’s guaranteed to impress.",
   "cuisine": "French",
   "prep_time": 15
diff --git a/tests/test_data/bettycrocker.com/bettycrocker_2.json b/tests/test_data/bettycrocker.com/bettycrocker_2.json
index 6cde5129..e936f6b0 100644
--- a/tests/test_data/bettycrocker.com/bettycrocker_2.json
+++ b/tests/test_data/bettycrocker.com/bettycrocker_2.json
@@ -68,6 +68,9 @@
   "title": "Strawberry-Pretzel Salad",
   "total_time": 400,
   "yields": "12 servings",
+  "keywords": [
+    "strawberry-pretzel salad"
+  ],
   "description": "This phenomenal berry dish is a great option if you need a sweet treat and your oven is already full of tasty dishes. The irresistible blend of creamy, crunchy, sweet and salty makes it a hit for any season and occasion. With a little prep and refrigeration time, you'll be enjoying your Strawberry Pretzel Salad as the perfect after-meal dessert.",
   "prep_time": 20
 }
diff --git a/tests/test_data/biancazapatka.com/biancazapatka_1.json b/tests/test_data/biancazapatka.com/biancazapatka_1.json
index 1758287b..2f65b224 100644
--- a/tests/test_data/biancazapatka.com/biancazapatka_1.json
+++ b/tests/test_data/biancazapatka.com/biancazapatka_1.json
@@ -90,5 +90,15 @@
   "total_time": 35,
   "yields": "4 servings",
   "cook_time": 10,
-  "prep_time": 25
+  "prep_time": 25,
+  "keywords": [
+    "Asia Noodles",
+    "Asian Food",
+    "Bowl",
+    "Noodle Salad",
+    "Peanut Sauce",
+    "Rice Noodles",
+    "Tempeh",
+    "Vegetables"
+  ]
 }
diff --git a/tests/test_data/biancazapatka.com/biancazapatka_2.json b/tests/test_data/biancazapatka.com/biancazapatka_2.json
index 3a76529a..ddaac95b 100644
--- a/tests/test_data/biancazapatka.com/biancazapatka_2.json
+++ b/tests/test_data/biancazapatka.com/biancazapatka_2.json
@@ -101,5 +101,11 @@
   "total_time": 65,
   "yields": "12 servings",
   "cook_time": 55,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "Blueberries",
+    "Blueberry Cake",
+    "Loaf Cake",
+    "Vegan Cake"
+  ]
 }
diff --git a/tests/test_data/bigoven.com/bigoven_1.json b/tests/test_data/bigoven.com/bigoven_1.json
index 3ce5520a..87faa34d 100644
--- a/tests/test_data/bigoven.com/bigoven_1.json
+++ b/tests/test_data/bigoven.com/bigoven_1.json
@@ -94,6 +94,15 @@
   "title": "No-Knead Herb Focaccia",
   "total_time": 720,
   "yields": "24 servings",
+  "keywords": [
+    "white meat free",
+    "nut free",
+    "contains gluten",
+    "red meat free",
+    "shellfish free",
+    "dairy free",
+    "pescatarian"
+  ],
   "description": "Our No-Knead Herb Focaccia is impossibly easy. And impossibly delicious. It'll leave you scratching your head and wondering how so few ingredients and such little effort can produce something so exquisitely satisfying. But, don't take our word for it -- bake some up tonight.",
   "cook_time": 695,
   "cuisine": "Italian",
diff --git a/tests/test_data/bigoven.com/bigoven_2.json b/tests/test_data/bigoven.com/bigoven_2.json
index 620e8c38..271827e9 100644
--- a/tests/test_data/bigoven.com/bigoven_2.json
+++ b/tests/test_data/bigoven.com/bigoven_2.json
@@ -80,6 +80,34 @@
   "site_name": "BigOven.com",
   "title": "White Chocolate Raspberry Cupcakes",
   "total_time": 25,
+  "keywords": [
+    "patdessert",
+    "sumdessert",
+    "kid friendly",
+    "bake",
+    "desserts",
+    "raspberry",
+    "american",
+    "snack",
+    "summer",
+    "sweet",
+    "vd",
+    "4desserts",
+    "nf",
+    "easter",
+    "mom",
+    "vegetarian",
+    "white meat free",
+    "nut free",
+    "contains cheese",
+    "contains gluten",
+    "red meat free",
+    "contains fish",
+    "shellfish free",
+    "contains dairy",
+    "contains eggs",
+    "pescatarian"
+  ],
   "yields": "8 servings",
   "description": "delicious bite-sized bits of raspberry goodness",
   "cook_time": 10,
diff --git a/tests/test_data/bluejeanchef.com/bluejeanchef_1.json b/tests/test_data/bluejeanchef.com/bluejeanchef_1.json
index 99e0f21c..c7312001 100644
--- a/tests/test_data/bluejeanchef.com/bluejeanchef_1.json
+++ b/tests/test_data/bluejeanchef.com/bluejeanchef_1.json
@@ -79,5 +79,11 @@
   "total_time": 22,
   "yields": "6 servings",
   "cook_time": 12,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "Chicken",
+    "Pasta",
+    "One Pot Meal",
+    "Quick and Easy"
+  ]
 }
diff --git a/tests/test_data/bluejeanchef.com/bluejeanchef_2.json b/tests/test_data/bluejeanchef.com/bluejeanchef_2.json
index f306c244..e5eaf904 100644
--- a/tests/test_data/bluejeanchef.com/bluejeanchef_2.json
+++ b/tests/test_data/bluejeanchef.com/bluejeanchef_2.json
@@ -73,5 +73,14 @@
   "title": "No Bake Layered Cheesecake",
   "total_time": 510,
   "yields": "12 servings",
-  "prep_time": 30
+  "prep_time": 30,
+  "keywords": [
+    "cheesecake",
+    "no bake desserts",
+    "blueberries",
+    "summer desserts",
+    "raspberries",
+    "Cream Cheese",
+    "berry desserts"
+  ]
 }
diff --git a/tests/test_data/bonappetit.com/bonappetit.json b/tests/test_data/bonappetit.com/bonappetit.json
index 419fa75b..474b13ba 100644
--- a/tests/test_data/bonappetit.com/bonappetit.json
+++ b/tests/test_data/bonappetit.com/bonappetit.json
@@ -54,5 +54,14 @@
   "title": "Pork Chops with Celery Salad",
   "total_time": null,
   "yields": "4 servings",
+  "keywords": [
+    "celery",
+    "almond",
+    "pork chop",
+    "main",
+    "sear",
+    "dinner",
+    "web"
+  ],
   "description": "Rich butter-basted pork offset by a bright, crunchy salad comes together quick and easy."
 }
diff --git a/tests/test_data/bongeats.com/bongeats.json b/tests/test_data/bongeats.com/bongeats.json
index ae2e2c2f..88afc920 100644
--- a/tests/test_data/bongeats.com/bongeats.json
+++ b/tests/test_data/bongeats.com/bongeats.json
@@ -76,5 +76,12 @@
   "site_name": null,
   "title": "Lau Chingri",
   "total_time": 60,
-  "yields": "5 servings"
+  "yields": "5 servings",
+  "keywords": [
+    "lau chingri",
+    "bottle gourd sabzi",
+    "bottle gourd with shrimp",
+    "bengali bottle gourd recipe",
+    "bengali lau recipe"
+  ]
 }
diff --git a/tests/test_data/bowlofdelicious.com/bowlofdelicious.json b/tests/test_data/bowlofdelicious.com/bowlofdelicious.json
index 87b1394b..34f65e6b 100644
--- a/tests/test_data/bowlofdelicious.com/bowlofdelicious.json
+++ b/tests/test_data/bowlofdelicious.com/bowlofdelicious.json
@@ -62,6 +62,11 @@
   "equipment": [
     "Nonstick Skillet"
   ],
+  "keywords": [
+    "Ahi tuna recipe",
+    "How to cook ahi tuna",
+    "Seared ahi tuna medium rare"
+  ],
   "cook_time": 5,
   "cuisine": "Seafood",
   "prep_time": 1
diff --git a/tests/test_data/breadtopia.com/breadtopia.json b/tests/test_data/breadtopia.com/breadtopia.json
index 39bad79f..c529a691 100644
--- a/tests/test_data/breadtopia.com/breadtopia.json
+++ b/tests/test_data/breadtopia.com/breadtopia.json
@@ -111,5 +111,10 @@
   "yields": "12 servings",
   "category": "Recipes",
   "cook_time": 30,
-  "prep_time": 60
+  "prep_time": 60,
+  "keywords": [
+    "Bread",
+    "Sourdough",
+    "Yeast"
+  ]
 }
diff --git a/tests/test_data/budgetbytes.com/budgetbytes.json b/tests/test_data/budgetbytes.com/budgetbytes.json
index 029a0cfb..86c2fc03 100644
--- a/tests/test_data/budgetbytes.com/budgetbytes.json
+++ b/tests/test_data/budgetbytes.com/budgetbytes.json
@@ -56,6 +56,11 @@
   "equipment": [
     "Cast Iron Skillet"
   ],
+  "keywords": [
+    "Burger Seasoning",
+    "Cheese Burger",
+    "Smash Burger"
+  ],
   "description": "If you love a meaty, juicy burger patty with loads of crispy edges and tons of smoky crooks and crannies for your favorite sauce or cheese to sink into, this Smash Burger recipe is for you!",
   "cook_time": 30,
   "cuisine": "American",
diff --git a/tests/test_data/budgetbytes.com/budgetbytes_groups.json b/tests/test_data/budgetbytes.com/budgetbytes_groups.json
index dc2aa22d..995be1e3 100644
--- a/tests/test_data/budgetbytes.com/budgetbytes_groups.json
+++ b/tests/test_data/budgetbytes.com/budgetbytes_groups.json
@@ -65,6 +65,10 @@
   "title": "Creamy Coconut Curry Lentils with Spinach",
   "total_time": 45,
   "yields": "4 servings",
+  "keywords": [
+    "meal prep",
+    "Vegan Dinner"
+  ],
   "description": "These rich, creamy, and earthy Coconut Curry Lentils are an easy and delicious vegan option for dinner or weekly meal prep!",
   "cook_time": 40,
   "cuisine": "Indian",
diff --git a/tests/test_data/castironketo.net/castironketo.json b/tests/test_data/castironketo.net/castironketo.json
index cce9b865..de7f7343 100644
--- a/tests/test_data/castironketo.net/castironketo.json
+++ b/tests/test_data/castironketo.net/castironketo.json
@@ -63,6 +63,11 @@
   "title": "Keto Jalapeño Popper Casserole with Chicken",
   "total_time": 45,
   "yields": "6 servings",
+  "keywords": [
+    "keto",
+    "keto casserole",
+    "low carb"
+  ],
   "description": "Keto Jalapeño Popper Casserole with Chicken: A deliciously creamy and spicy low-carb dish with shredded chicken, cream cheese, jalapenos, and bacon.",
   "cook_time": 15,
   "cuisine": "American",
diff --git a/tests/test_data/chefkoch.de/chefkoch.json b/tests/test_data/chefkoch.de/chefkoch.json
index a578cd42..296d09a4 100644
--- a/tests/test_data/chefkoch.de/chefkoch.json
+++ b/tests/test_data/chefkoch.de/chefkoch.json
@@ -68,5 +68,16 @@
   "site_name": "Chefkoch.de",
   "title": "Saftiger Hackbraten im Ofen",
   "total_time": 85.0,
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "Fleisch",
+    "Hauptspeise",
+    "Rind",
+    "Saucen",
+    "Schwein",
+    "Braten",
+    "Resteverwertung",
+    "ketogen",
+    "Low Carb"
+  ]
 }
diff --git a/tests/test_data/chefsavvy.com/chefsavvy.json b/tests/test_data/chefsavvy.com/chefsavvy.json
index 84489630..d0dcf482 100644
--- a/tests/test_data/chefsavvy.com/chefsavvy.json
+++ b/tests/test_data/chefsavvy.com/chefsavvy.json
@@ -62,5 +62,11 @@
   "total_time": 310,
   "yields": "4 servings",
   "cook_time": 300,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "Chuck Roast",
+    "Garlic",
+    "Sesame",
+    "Slow Cooker Broccoli Beef"
+  ]
 }
diff --git a/tests/test_data/comidinhasdochef.com/comidinhasdochef.json b/tests/test_data/comidinhasdochef.com/comidinhasdochef.json
index c765806f..058e8947 100644
--- a/tests/test_data/comidinhasdochef.com/comidinhasdochef.json
+++ b/tests/test_data/comidinhasdochef.com/comidinhasdochef.json
@@ -70,6 +70,9 @@
   "title": "Coxa de Frango na Fritadeira Elétrica",
   "total_time": 30,
   "yields": "5 servings",
+  "keywords": [
+    "Coxa de Frango na Fritadeira Elétrica"
+  ],
   "description": "Você vai aprender hoje como fazer coxa de frango na fritadeira elétrica sem erros! Nós sabemos que há muitas pessoas com medo de usar a fritadeira elétrica, que não precisa ir óleo para fritar, porque o frango pode acabar ficando muito frito e seco, sem aquela suculência gostosa que todos nós amamos em um frango frito, né? Por isso, nós aqui do Comidinhas do Chef testamos algumas receitas e desenvolvemos esta especialmente para você, com um passo a passo certeiro para a coxa de frango ficar no ponto ideal, com aquela casquinha levemente crocante externa e bem gostosa, mas ainda muito saboroso por dentro. Para isso, é só seguir a nossa receita de coxa de frango na fritadeira elétrica, que você vai acertar em cheio na hora de preparar aí na sua casa também! O resultado fica simplesmente maravilhoso e vai dar vontade de fazer as coxas de frango somente assim de agora em diante.",
   "cook_time": 25,
   "cuisine": "Brasileira",
diff --git a/tests/test_data/cookieandkate.com/cookieandkate.json b/tests/test_data/cookieandkate.com/cookieandkate.json
index 2d15fd9a..30c886e2 100644
--- a/tests/test_data/cookieandkate.com/cookieandkate.json
+++ b/tests/test_data/cookieandkate.com/cookieandkate.json
@@ -66,6 +66,9 @@
   "total_time": 40,
   "yields": "6 servings",
   "cooking_method": "Stovetop and baked",
+  "keywords": [
+    "Broccoli Cheddar Frittata"
+  ],
   "description": "This spinach, broccoli and cheddar frittata recipe is a simple breakfast, brunch or dinner! It's vegetarian and gluten free. Recipe yields 6 large or 8 more modest slices.",
   "cook_time": 25,
   "cuisine": "American",
diff --git a/tests/test_data/cooking.nytimes.com/nytimes.json b/tests/test_data/cooking.nytimes.com/nytimes.json
index 149cc24e..279486e7 100644
--- a/tests/test_data/cooking.nytimes.com/nytimes.json
+++ b/tests/test_data/cooking.nytimes.com/nytimes.json
@@ -64,6 +64,12 @@
   "title": "Cacio e Pepe Crackers",
   "total_time": 45,
   "yields": "160 servings",
+  "keywords": [
+    "butter",
+    "cheddar",
+    "flour",
+    "pecorino"
+  ],
   "description": "These quick, easy crackers are a crispy twist on the classic pasta dish, and an excellent cocktail hour snack. Rolling the freshly made dough between sheets of parchment expedites chilling, then cutting crackers with a pastry wheel (or pizza cutter) reduces waste. Do grate your own cheese for this instead of using store-bought, pre-grated cheese, as it plays an integral role in making the dough moist. These cheesy crackers can be kept simple, allowing cheese and pepper to dominate, or gussied up with any combination of onion powder, ground mustard or garlic powder, depending on your preference. This recipe makes a large batch, but the crackers will keep for up to one month, depending on your snack habits.",
   "cook_time": 45,
   "cuisine": "american"
diff --git a/tests/test_data/cooking.nytimes.com/nytimes_groups.json b/tests/test_data/cooking.nytimes.com/nytimes_groups.json
index 40b93b85..3737af7b 100644
--- a/tests/test_data/cooking.nytimes.com/nytimes_groups.json
+++ b/tests/test_data/cooking.nytimes.com/nytimes_groups.json
@@ -85,6 +85,16 @@
   "site_name": "NYT Cooking",
   "title": "Crispy Potato Tacos",
   "total_time": 75,
+  "keywords": [
+    "cheddar",
+    "cilantro",
+    "corn tortilla",
+    "freezer friendly",
+    "make-ahead",
+    "potato",
+    "tomato",
+    "vegetarian"
+  ],
   "yields": "4 servings",
   "description": "Potato tacos, or tacos de papa, as they are known in Mexico, make the perfect meal for those times when you find yourself with an excess of potatoes and a package of tortillas on hand. Tortillas are an endlessly versatile pantry item. In this recipe, adapted from “Tenderheart” by Hetty Lui McKinnon (Alfred A. Knopf, 2023), they are stuffed with potato and cheese for a deeply satisfying meal or light snack. Cooking the potatoes whole, skin intact, prevents them from absorbing too much water, and the skin also adds a nice texture to the filling. Shortcuts are always available: If you’ve got leftover mashed potatoes, you can use them and skip the first step.",
   "cook_time": 60,
diff --git a/tests/test_data/copykat.com/copykat.json b/tests/test_data/copykat.com/copykat.json
index a6c1c0cb..139aa4fe 100644
--- a/tests/test_data/copykat.com/copykat.json
+++ b/tests/test_data/copykat.com/copykat.json
@@ -66,5 +66,10 @@
   "yields": "10 servings",
   "cook_time": 30,
   "cuisine": "American",
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "Beef Tips and Gravy",
+    "Instant Pot Recipes",
+    "Slow Cooker Recipes"
+  ]
 }
diff --git a/tests/test_data/countryliving.com/countryliving.json b/tests/test_data/countryliving.com/countryliving.json
index 189c13a0..f963290b 100644
--- a/tests/test_data/countryliving.com/countryliving.json
+++ b/tests/test_data/countryliving.com/countryliving.json
@@ -50,6 +50,11 @@
   "title": "Honey-Apple Baked Brie with Fried Sage",
   "total_time": 35,
   "yields": "4 servings",
+  "keywords": [
+    "appetizers",
+    "autumn",
+    "cocktail party"
+  ],
   "description": "This elegant appetizer is a sure-fire way to treat your guests.",
   "prep_time": 35
 }
diff --git a/tests/test_data/cucchiaio.it/cucchiaio.json b/tests/test_data/cucchiaio.it/cucchiaio.json
index 37b6cf07..5e92242b 100644
--- a/tests/test_data/cucchiaio.it/cucchiaio.json
+++ b/tests/test_data/cucchiaio.it/cucchiaio.json
@@ -51,5 +51,9 @@
   "ratings_count": 7,
   "site_name": "Il Cucchiaio d'Argento",
   "title": "Pesce spada al miele millefiori, pomodorini e patatine novelle",
+  "keywords": [
+    "Pesce spada al miele millefiori",
+    "pomodorini e patatine novelle"
+  ],
   "description": "Quella del pesce spada al miele millefiori, pomodorini e patatine novelle è la ricetta originale di un secondo piatto sano e leggero. Un abbinamento inusuale che conquista grazie alla freschezza dei sapori ben equilibrati e alla facilità di esecuzione."
 }
diff --git a/tests/test_data/cybercook.com.br/cybercook.json b/tests/test_data/cybercook.com.br/cybercook.json
index 1c1b37e2..e74b2bb5 100644
--- a/tests/test_data/cybercook.com.br/cybercook.json
+++ b/tests/test_data/cybercook.com.br/cybercook.json
@@ -53,7 +53,19 @@
   "title": "Strogonoff de Frango",
   "total_time": 30,
   "yields": "4 servings",
-  "description": "Já experimentou essa maravilhosa receita de Strogonoff de Frango da Leticia? No CyberCook você encontra essa e outras receitas. Saiba nessa dica incrível",
-  "cook_time": 30,
-  "prep_time": 30
+  "keywords": [
+    "Sal",
+    "Receitas de Strogonoff",
+    "Receitas com Caldo",
+    "Peito de Frango",
+    "Creme de Leite",
+    "Caldo de Galinha",
+    "Russa",
+    "Cozinha Internacional",
+    "Receitas Salgadas",
+    "Frango",
+    "Aves",
+    "Pratos principais",
+    "Receitas de Frango Xadrez"
+  ]
 }
diff --git a/tests/test_data/delish.com/delish_1.json b/tests/test_data/delish.com/delish_1.json
index f4f707b0..e4a11b14 100644
--- a/tests/test_data/delish.com/delish_1.json
+++ b/tests/test_data/delish.com/delish_1.json
@@ -66,6 +66,15 @@
   "title": "Pumpkin Cheesecake Roll",
   "total_time": 60,
   "yields": "8 servings",
+  "keywords": [
+    "pumpkin roll",
+    "pumpkin desserts",
+    "fall desserts",
+    "swiss roll",
+    "cream cheese frosting",
+    "thanksgiving desserts",
+    "pumpkin cake"
+  ],
   "description": "The pumpkin roll's iconic swirls make it a staple stunning dessert during the fall season—learn how to perfect it with our easy recipe.",
   "prep_time": 30
 }
diff --git a/tests/test_data/delish.com/delish_2.json b/tests/test_data/delish.com/delish_2.json
index 0c9c5210..23a6564a 100644
--- a/tests/test_data/delish.com/delish_2.json
+++ b/tests/test_data/delish.com/delish_2.json
@@ -75,6 +75,13 @@
   "title": "Apple Cookies",
   "total_time": 100,
   "yields": "20 servings",
+  "keywords": [
+    "autumn",
+    "baking",
+    "dessert",
+    "nut-free",
+    "vegetarian"
+  ],
   "description": "Apple cookies are packed with grated Granny Smith apples and topped with lemony apple pie spice icing.",
   "prep_time": 20
 }
diff --git a/tests/test_data/delish.com/delish_rogue_ol.json b/tests/test_data/delish.com/delish_rogue_ol.json
index d929aad1..b8d6fac1 100644
--- a/tests/test_data/delish.com/delish_rogue_ol.json
+++ b/tests/test_data/delish.com/delish_rogue_ol.json
@@ -60,6 +60,15 @@
   "title": "Baileys Cheesecake",
   "total_time": 480,
   "yields": "10 servings",
+  "keywords": [
+    "baileys cheesecake",
+    "chocolate ganache cheesecake",
+    "baileys desserts",
+    "st patricks day desserts",
+    "st patricks day cheesecake",
+    "boozy cheesecake recipes",
+    "cheesecake recipes"
+  ],
   "description": "Looking for the perfect Baileys cheesecake recipe? This Baileys Cheesecake is the best.",
   "cuisine": "American",
   "prep_time": 25
diff --git a/tests/test_data/downshiftology.com/downshiftology.json b/tests/test_data/downshiftology.com/downshiftology.json
index 831a1341..6894c071 100644
--- a/tests/test_data/downshiftology.com/downshiftology.json
+++ b/tests/test_data/downshiftology.com/downshiftology.json
@@ -73,6 +73,10 @@
     "Metal Skewers",
     "Lodge Indoor Grill"
   ],
+  "keywords": [
+    "easy chicken kabobs",
+    "Greek chicken kabobs"
+  ],
   "description": "These Greek chicken kabobs are a summer grilling staple! They're juicy, flavorful, and best served with my homemade tzatziki sauce.",
   "cook_time": 25,
   "cuisine": "Greek",
diff --git a/tests/test_data/eatwell101.com/eatwell101.json b/tests/test_data/eatwell101.com/eatwell101.json
index 00f593cd..7913ce91 100644
--- a/tests/test_data/eatwell101.com/eatwell101.json
+++ b/tests/test_data/eatwell101.com/eatwell101.json
@@ -73,5 +73,17 @@
   "total_time": 40,
   "yields": "4 servings",
   "cook_time": 20,
-  "prep_time": 20
+  "prep_time": 20,
+  "keywords": [
+    "chicken",
+    "dinner",
+    "gluten free cooking",
+    "gluten free main dishes",
+    "keto",
+    "keto main dishes",
+    "low-carb",
+    "meatballs",
+    "Most Popular Recipes",
+    "turkey"
+  ]
 }
diff --git a/tests/test_data/eatwhattonight.com/eatwhattonight.json b/tests/test_data/eatwhattonight.com/eatwhattonight.json
index d74b5421..f19f0d8b 100644
--- a/tests/test_data/eatwhattonight.com/eatwhattonight.json
+++ b/tests/test_data/eatwhattonight.com/eatwhattonight.json
@@ -56,5 +56,9 @@
   "yields": "2 servings",
   "cook_time": 15,
   "cuisine": "Chinese",
-  "prep_time": 30
+  "prep_time": 30,
+  "keywords": [
+    "Chicken",
+    "Ginger"
+  ]
 }
diff --git a/tests/test_data/elavegan.com/elavegan_1.json b/tests/test_data/elavegan.com/elavegan_1.json
index 6a74b279..5c9d2360 100644
--- a/tests/test_data/elavegan.com/elavegan_1.json
+++ b/tests/test_data/elavegan.com/elavegan_1.json
@@ -73,5 +73,12 @@
   "total_time": 30,
   "yields": "6 servings",
   "cook_time": 20,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "creamy",
+    "curry",
+    "dal",
+    "dhal",
+    "lentils"
+  ]
 }
diff --git a/tests/test_data/elavegan.com/elavegan_2.json b/tests/test_data/elavegan.com/elavegan_2.json
index 5df46630..5c4bb1e3 100644
--- a/tests/test_data/elavegan.com/elavegan_2.json
+++ b/tests/test_data/elavegan.com/elavegan_2.json
@@ -95,6 +95,14 @@
     "Kitchen scale",
     "8x8 pan"
   ],
+  "keywords": [
+    "coffee crumble cake",
+    "dairy-free cake",
+    "gluten free coffee cake",
+    "streusel cake",
+    "vegan coffee cake",
+    "vegan crumb cake"
+  ],
   "cook_time": 40,
   "prep_time": 15
 }
diff --git a/tests/test_data/errenskitchen.com/errenskitchen.json b/tests/test_data/errenskitchen.com/errenskitchen.json
index ac85a406..5182a645 100644
--- a/tests/test_data/errenskitchen.com/errenskitchen.json
+++ b/tests/test_data/errenskitchen.com/errenskitchen.json
@@ -73,5 +73,10 @@
   "total_time": 30,
   "yields": "4 servings",
   "cook_time": 20,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "Creamy Sun-Dried Tomato Pasta",
+    "Creamy Sun-Dried Tomato Pasta with Chicken",
+    "Sun-Dried Tomato Pasta"
+  ]
 }
diff --git a/tests/test_data/farmhouseonboone.com/farmhouseonboone.json b/tests/test_data/farmhouseonboone.com/farmhouseonboone.json
index 53829815..32be1db3 100644
--- a/tests/test_data/farmhouseonboone.com/farmhouseonboone.json
+++ b/tests/test_data/farmhouseonboone.com/farmhouseonboone.json
@@ -80,6 +80,12 @@
   "title": "Sourdough Croissants",
   "total_time": 900,
   "yields": "12 servings",
+  "keywords": [
+    "baking",
+    "sourdough croissants",
+    "croissants",
+    "sourdough crescent rolls"
+  ],
   "description": "Flaky, buttery sourdough croissants are one of the most decadent sourdough recipes ever. These make the perfect brunch sandwich bread, a fancy breakfast, or a wonderful holiday roll.",
   "cook_time": 30,
   "cuisine": "French",
diff --git a/tests/test_data/feastingathome.com/feastingathome.json b/tests/test_data/feastingathome.com/feastingathome.json
index 128cc6b8..87da6ae6 100644
--- a/tests/test_data/feastingathome.com/feastingathome.json
+++ b/tests/test_data/feastingathome.com/feastingathome.json
@@ -77,6 +77,11 @@
   "language": "en-US",
   "site_name": "Feasting At Home",
   "cooking_method": "stovetop",
+  "keywords": [
+    "tomato risotto",
+    "vegetarian risotto",
+    "shrimp risotto"
+  ],
   "category": "vegetarian",
   "nutrients": {
     "servingSize": "1 ½ cup serving without shrimp",
diff --git a/tests/test_data/fifteenspatulas.com/fifteenspatulas.json b/tests/test_data/fifteenspatulas.com/fifteenspatulas.json
index 7508699f..97fe1cd2 100644
--- a/tests/test_data/fifteenspatulas.com/fifteenspatulas.json
+++ b/tests/test_data/fifteenspatulas.com/fifteenspatulas.json
@@ -56,6 +56,10 @@
   "title": "Creme Brulee",
   "total_time": 420,
   "yields": "6 servings",
+  "keywords": [
+    "creme brulee",
+    "orange creme brulee"
+  ],
   "description": "This Orange Creme Brulee is a twist on the classic creamy custard, with aromatic and flavorful orange throughout. It's a great make ahead dessert!",
   "cook_time": 40,
   "cuisine": "French",
diff --git a/tests/test_data/food.com/food.json b/tests/test_data/food.com/food.json
index 455039f2..1de3d55f 100644
--- a/tests/test_data/food.com/food.json
+++ b/tests/test_data/food.com/food.json
@@ -55,6 +55,18 @@
   "title": "Chicken Noodle Soup With Carrots, Parsnips and Dill",
   "total_time": 45,
   "yields": "4 servings",
+  "keywords": [
+    "Chicken",
+    "Poultry",
+    "Vegetable",
+    "Meat",
+    "Spring",
+    "Winter",
+    "Weeknight",
+    "< 60 Mins",
+    "Beginner Cook",
+    "Easy"
+  ],
   "ratings_count": 2,
   "description": "This is a variation on my family's favorite chicken soup that I have already posted here. Lots of carrots and parsnips give it more of a sweet savor. The parsley actually balances the sweetness, though. To balance this effect, use the optional parsley, which is just slightly bitter. Sometimes I also add a diced turnip if I have one. For the noodles, I like to use tagliolini nests, which you can usually find in the imported pasta section. I prefer a thin noodle for this soup, but you can certainly use whatever is your preference.",
   "prep_time": 45
diff --git a/tests/test_data/food52.com/food52.json b/tests/test_data/food52.com/food52.json
index 5892a004..d97ea49a 100644
--- a/tests/test_data/food52.com/food52.json
+++ b/tests/test_data/food52.com/food52.json
@@ -58,6 +58,14 @@
   "title": "Sticky Pomegranate & Black Pepper Chicken Wings",
   "total_time": 1520,
   "yields": "4 servings",
+  "keywords": [
+    "Pomegranate",
+    "Chicken",
+    "Roast",
+    "Brine",
+    "Walnut",
+    "Game Day"
+  ],
   "description": "These sticky, oven-roasted wings—with pomegranate molasses, warm spices, and toasted walnuts—are inspired by fesenjan, a Northern Iranian stew.",
   "cook_time": 80,
   "cuisine": "American",
diff --git a/tests/test_data/foodfidelity.com/foodfidelity.json b/tests/test_data/foodfidelity.com/foodfidelity.json
index 1a2bf6e5..f4c4fbe1 100644
--- a/tests/test_data/foodfidelity.com/foodfidelity.json
+++ b/tests/test_data/foodfidelity.com/foodfidelity.json
@@ -57,5 +57,9 @@
   "total_time": 7,
   "yields": "2 servings",
   "cook_time": 5,
-  "prep_time": 2
+  "prep_time": 2,
+  "keywords": [
+    "oatmeal",
+    "strawberry oatmeal"
+  ]
 }
diff --git a/tests/test_data/foodfidelity.com/foodfidelity_groups.json b/tests/test_data/foodfidelity.com/foodfidelity_groups.json
index e8bdbc55..3c082483 100644
--- a/tests/test_data/foodfidelity.com/foodfidelity_groups.json
+++ b/tests/test_data/foodfidelity.com/foodfidelity_groups.json
@@ -87,5 +87,8 @@
   "total_time": 35,
   "yields": "4 servings",
   "cook_time": 20,
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "couscous"
+  ]
 }
diff --git a/tests/test_data/forktospoon.com/forktospoon.json b/tests/test_data/forktospoon.com/forktospoon.json
index 50eafde6..80d7de35 100644
--- a/tests/test_data/forktospoon.com/forktospoon.json
+++ b/tests/test_data/forktospoon.com/forktospoon.json
@@ -68,6 +68,9 @@
     "Cooking Spray",
     "Parchment Paper"
   ],
+  "keywords": [
+    "Air Fryer Parmeasn Tomatoes"
+  ],
   "cook_time": 10,
   "prep_time": 10
 }
diff --git a/tests/test_data/franzoesischkochen.de/franzoesischkochen.json b/tests/test_data/franzoesischkochen.de/franzoesischkochen.json
index 743b5d13..881863f5 100644
--- a/tests/test_data/franzoesischkochen.de/franzoesischkochen.json
+++ b/tests/test_data/franzoesischkochen.de/franzoesischkochen.json
@@ -58,6 +58,15 @@
   "title": "Tourte mit Feigen und Confit de canard",
   "total_time": 90,
   "yields": null,
+  "keywords": [
+    "Fleisch",
+    "Hauptspeisen",
+    "Herbst",
+    "Quiche",
+    "Traditionelle Rezepte",
+    "Weihnachten / Hauptspeisen",
+    "Wintergerichte"
+  ],
   "description": "Ein einfaches Rezept mit Schritt-für-Schritt-Fotos und vielen Tipps über das Thema: Tourte mit Feigen und Confit de canard",
   "cook_time": 30,
   "cuisine": "French",
diff --git a/tests/test_data/godt.no/godt.json b/tests/test_data/godt.no/godt.json
index 1d9919c4..25795499 100644
--- a/tests/test_data/godt.no/godt.json
+++ b/tests/test_data/godt.no/godt.json
@@ -39,5 +39,11 @@
   "title": "Grove pannekaker - Perfekt middag",
   "total_time": 60,
   "yields": "6 servings",
+  "keywords": [
+    "Pannekaker og vafler",
+    "Hverdag",
+    "Vegetar",
+    "Enkel"
+  ],
   "description": "Grove pannekaker er en hit hos både store og små! Middagspannekaker kan serveres med salte eller søte toppinger og gjør seg godt i matpakken. Se oppskrift her!"
 }
diff --git a/tests/test_data/gonnawantseconds.com/gonnawantseconds.json b/tests/test_data/gonnawantseconds.com/gonnawantseconds.json
index 66189a6c..1dd25b32 100644
--- a/tests/test_data/gonnawantseconds.com/gonnawantseconds.json
+++ b/tests/test_data/gonnawantseconds.com/gonnawantseconds.json
@@ -60,5 +60,11 @@
   "yields": "4 servings",
   "cook_time": 30,
   "cuisine": "Mexican",
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "How DO I Make White Chicken Enchiladas Recipe",
+    "How To Make White Chicken Enchiladas Recipe",
+    "White Chicken Enchiladas",
+    "White Chicken Enchiladas Recipe"
+  ]
 }
diff --git a/tests/test_data/goodfooddiscoveries.com/goodfooddiscoveries.json b/tests/test_data/goodfooddiscoveries.com/goodfooddiscoveries.json
index 4d2f6fcf..c84e3516 100644
--- a/tests/test_data/goodfooddiscoveries.com/goodfooddiscoveries.json
+++ b/tests/test_data/goodfooddiscoveries.com/goodfooddiscoveries.json
@@ -55,5 +55,11 @@
   "title": "Lemon Risotto",
   "total_time": 30,
   "yields": "4 servings",
-  "cuisine": "Italian"
+  "cuisine": "Italian",
+  "keywords": [
+    "lemon",
+    "lemon risotto",
+    "parmesan",
+    "risotto"
+  ]
 }
diff --git a/tests/test_data/goodhousekeeping.com/goodhousekeeping_1.json b/tests/test_data/goodhousekeeping.com/goodhousekeeping_1.json
index 26d8c89f..d5e556e1 100644
--- a/tests/test_data/goodhousekeeping.com/goodhousekeeping_1.json
+++ b/tests/test_data/goodhousekeeping.com/goodhousekeeping_1.json
@@ -48,5 +48,12 @@
   "total_time": 20,
   "yields": "4 servings",
   "cook_time": 15,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "pumpkin soup",
+    "pumpkin soup recipe",
+    "easy pumpkin soup",
+    "how to make pumpkin soup",
+    "pumpkin recipes"
+  ]
 }
diff --git a/tests/test_data/goodhousekeeping.com/goodhousekeeping_2.json b/tests/test_data/goodhousekeeping.com/goodhousekeeping_2.json
index 3a1950e6..4979a493 100644
--- a/tests/test_data/goodhousekeeping.com/goodhousekeeping_2.json
+++ b/tests/test_data/goodhousekeeping.com/goodhousekeeping_2.json
@@ -67,5 +67,12 @@
   "total_time": 30,
   "yields": "4 servings",
   "cook_time": 20,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "dinner",
+    "vegetarian",
+    "fajitas",
+    "vegetarian fajitas",
+    "halloumi"
+  ]
 }
diff --git a/tests/test_data/goodhousekeeping.com/goodhousekeeping_3.json b/tests/test_data/goodhousekeeping.com/goodhousekeeping_3.json
index 6b47c90d..0d09d197 100644
--- a/tests/test_data/goodhousekeeping.com/goodhousekeeping_3.json
+++ b/tests/test_data/goodhousekeeping.com/goodhousekeeping_3.json
@@ -44,5 +44,8 @@
   "total_time": 200,
   "yields": "8 servings",
   "cook_time": 195,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "Food News/Products"
+  ]
 }
diff --git a/tests/test_data/goodhousekeeping.com/goodhousekeeping_4.json b/tests/test_data/goodhousekeeping.com/goodhousekeeping_4.json
index 32979ab7..8afe847b 100644
--- a/tests/test_data/goodhousekeeping.com/goodhousekeeping_4.json
+++ b/tests/test_data/goodhousekeeping.com/goodhousekeeping_4.json
@@ -88,5 +88,13 @@
   "total_time": 85,
   "yields": "10 servings",
   "cook_time": 40,
-  "prep_time": 45
+  "prep_time": 45,
+  "keywords": [
+    "baking",
+    "dessert",
+    "cheesecake",
+    "jaffa cake",
+    "jaffa cake cheesecake",
+    "chocolate orange cheesecake"
+  ]
 }
diff --git a/tests/test_data/greatbritishchefs.com/greatbritishchefs.json b/tests/test_data/greatbritishchefs.com/greatbritishchefs.json
index 91829ad5..558a72d9 100644
--- a/tests/test_data/greatbritishchefs.com/greatbritishchefs.json
+++ b/tests/test_data/greatbritishchefs.com/greatbritishchefs.json
@@ -60,5 +60,8 @@
   "language": "en",
   "site_name": "Great British Chefs",
   "title": "Picadillo",
-  "total_time": 50
+  "total_time": 50,
+  "keywords": [
+    "easy"
+  ]
 }
diff --git a/tests/test_data/halfbakedharvest.com/halfbakedharvest_groups.json b/tests/test_data/halfbakedharvest.com/halfbakedharvest_groups.json
index 74dd86a4..af6681db 100644
--- a/tests/test_data/halfbakedharvest.com/halfbakedharvest_groups.json
+++ b/tests/test_data/halfbakedharvest.com/halfbakedharvest_groups.json
@@ -76,5 +76,10 @@
   "title": "Street Corn Pasta Salad",
   "total_time": 30,
   "yields": "8 servings",
-  "cuisine": "American,Mexican"
+  "cuisine": "American,Mexican",
+  "keywords": [
+    "30 minute meal",
+    "quick and easy",
+    "summer pasta"
+  ]
 }
diff --git a/tests/test_data/handletheheat.com/handletheheat.json b/tests/test_data/handletheheat.com/handletheheat.json
index 9e1fc007..eb2985cb 100644
--- a/tests/test_data/handletheheat.com/handletheheat.json
+++ b/tests/test_data/handletheheat.com/handletheheat.json
@@ -49,6 +49,10 @@
   "title": "Best Ever Chewy Brownies",
   "total_time": 45,
   "yields": "9 servings",
+  "keywords": [
+    "brownies",
+    "chewy brownies"
+  ],
   "description": "The BEST Chewy Brownies are just as chewy as the boxed brownies but packed with way more chocolate flavor. One bowl recipe made in less than 1 hour!",
   "cook_time": 30,
   "cuisine": "American",
diff --git a/tests/test_data/hassanchef.com/hassanchef.json b/tests/test_data/hassanchef.com/hassanchef.json
index 3de91155..fba375e8 100644
--- a/tests/test_data/hassanchef.com/hassanchef.json
+++ b/tests/test_data/hassanchef.com/hassanchef.json
@@ -133,6 +133,11 @@
   "title": "Chicken lollipop recipe",
   "total_time": 30,
   "yields": "2 servings",
+  "keywords": [
+    "Chicken lollipop recipe",
+    "chicken lollipop gravy",
+    "Chicken lollipop masala"
+  ],
   "description": "Chicken lollipop are made from chicken wings. Cut them into lollipop shape and coated with a spicy batter and deep fried till crisp golden. It can be served as masala chicken lollipop, chicken lollipop gravy or dry chicken lollipop.",
   "cook_time": 15,
   "cuisine": "Indo Chinese",
diff --git a/tests/test_data/hellofresh.com/hellofresh.json b/tests/test_data/hellofresh.com/hellofresh.json
index aee1785a..ccb9f48a 100644
--- a/tests/test_data/hellofresh.com/hellofresh.json
+++ b/tests/test_data/hellofresh.com/hellofresh.json
@@ -53,5 +53,9 @@
   "title": "Thai Style Pork Rice Bowl with Green Beans, Coriander and Rice",
   "total_time": 50,
   "yields": "2 servings",
+  "keywords": [
+    "Spicy",
+    "SEO"
+  ],
   "description": "In its home country, this tasty Thai dish is known as Moo Pad Krapow. We can't help thinking that 'krapow' sounds like one of the captions from a 1960's Batman fight, but it's actually the name for a particularly lovely herb: Thai basil. It's fragrant, sweet and spicy with a slight aniseed flavour and really brings this stir-fry alive. Holy basil, Batman! It's dinner-dinner-dinner-dinner time!"
 }
diff --git a/tests/test_data/hellofresh.com/hellofresh_adhoc.json b/tests/test_data/hellofresh.com/hellofresh_adhoc.json
index 402e776f..c8b44d40 100644
--- a/tests/test_data/hellofresh.com/hellofresh_adhoc.json
+++ b/tests/test_data/hellofresh.com/hellofresh_adhoc.json
@@ -57,5 +57,8 @@
   "title": "Chakchouka au chèvre frais avec du piment, des œufs et du persil",
   "total_time": 65,
   "yields": "2 servings",
+  "keywords": [
+    "Végétarien"
+  ],
   "description": "La chakchouka est l'un de nos plats végétariens préférés. Vous avez énormément de possibilité avec ce plat, par exemple en variant le type de fromage utilisé. Les œufs sont pleins de bons nutriments, tels que des vitamines, des minéraux et bien sûr des protéines - un choix végétarien nutritif."
 }
diff --git a/tests/test_data/hersheyland.com/herseyland.json b/tests/test_data/hersheyland.com/herseyland.json
index 281d8f8d..c434999b 100644
--- a/tests/test_data/hersheyland.com/herseyland.json
+++ b/tests/test_data/hersheyland.com/herseyland.json
@@ -71,5 +71,14 @@
     "Oven",
     "Wire Rack"
   ],
+  "keywords": [
+    "Beginner",
+    "Birthdays",
+    "HERSHEY'S",
+    "Evergreen",
+    "Milk Chocolate",
+    "HERSHEY'S Cocoa",
+    "Cake"
+  ],
   "prep_time": 15
 }
diff --git a/tests/test_data/im-worthy.com/imworthy.json b/tests/test_data/im-worthy.com/imworthy.json
index 275e5fe1..80d8a247 100644
--- a/tests/test_data/im-worthy.com/imworthy.json
+++ b/tests/test_data/im-worthy.com/imworthy.json
@@ -52,5 +52,14 @@
   "total_time": 25,
   "yields": "4 servings",
   "cook_time": 15,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "almond flour pancakes",
+    "almond flour recipes",
+    "healthy breakfast pancakes",
+    "healthy Breakfast Recipe",
+    "pancakes using almond flour",
+    "pancakes with almond flour",
+    "Vegan Almond Flour Pancakes"
+  ]
 }
diff --git a/tests/test_data/indianhealthyrecipes.com/indianhealthyrecipes.json b/tests/test_data/indianhealthyrecipes.com/indianhealthyrecipes.json
index 5a4aa544..c3696e3b 100644
--- a/tests/test_data/indianhealthyrecipes.com/indianhealthyrecipes.json
+++ b/tests/test_data/indianhealthyrecipes.com/indianhealthyrecipes.json
@@ -70,6 +70,10 @@
   "title": "Banana Cake Recipe",
   "total_time": 50,
   "yields": "16 servings",
+  "keywords": [
+    "Banana cake",
+    "banana cake recipe"
+  ],
   "description": "Soft, moist & fluffy banana cake - Easy to make and tastes delicious. Serve it with milk or as a snack with some melted chocolate drizzled over it.",
   "cook_time": 40,
   "cuisine": "world",
diff --git a/tests/test_data/izzycooking.com/izzycooking.json b/tests/test_data/izzycooking.com/izzycooking.json
index c5384c1d..87f35369 100644
--- a/tests/test_data/izzycooking.com/izzycooking.json
+++ b/tests/test_data/izzycooking.com/izzycooking.json
@@ -60,5 +60,10 @@
   "total_time": 35,
   "yields": "16 servings",
   "cook_time": 25,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "mini cheesecakes",
+    "oreo cheesecake bites",
+    "oreo cheesecake cupcakes"
+  ]
 }
diff --git a/tests/test_data/jamieoliver.com/jamieoliver.json b/tests/test_data/jamieoliver.com/jamieoliver.json
index f8ab4ef2..f6c36529 100644
--- a/tests/test_data/jamieoliver.com/jamieoliver.json
+++ b/tests/test_data/jamieoliver.com/jamieoliver.json
@@ -55,6 +55,22 @@
   "title": "Bloomin' brilliant brownies",
   "total_time": 40,
   "yields": "20 servings",
+  "keywords": [
+    "chocolate",
+    "brownies",
+    "brownie",
+    "vegetarian",
+    "sweets and desserts",
+    "baking",
+    "cooking",
+    "chocolate brownies",
+    "party food",
+    "baking and desserts",
+    "Christmas",
+    "Dinner Party",
+    "non-promotable",
+    "Popular"
+  ],
   "description": "This is a great little recipe for easy, fail-safe, gloriously gooey chocolate brownies",
   "cuisine": "https://schema.org/VegetarianDiet"
 }
diff --git a/tests/test_data/jimcooksfoodgood.com/jimcooksfoodgood.json b/tests/test_data/jimcooksfoodgood.com/jimcooksfoodgood.json
index 45919abd..1a89ff71 100644
--- a/tests/test_data/jimcooksfoodgood.com/jimcooksfoodgood.json
+++ b/tests/test_data/jimcooksfoodgood.com/jimcooksfoodgood.json
@@ -50,6 +50,9 @@
   "title": "German Potato Salad",
   "total_time": 40,
   "yields": "8 servings",
+  "keywords": [
+    "#healthyrecipe"
+  ],
   "description": "German Potato Salad",
   "cook_time": 30,
   "cuisine": "American",
diff --git a/tests/test_data/joyfoodsunshine.com/joyfoodsunshine.json b/tests/test_data/joyfoodsunshine.com/joyfoodsunshine.json
index 10df7f7d..5ee09b5f 100644
--- a/tests/test_data/joyfoodsunshine.com/joyfoodsunshine.json
+++ b/tests/test_data/joyfoodsunshine.com/joyfoodsunshine.json
@@ -70,6 +70,19 @@
     "Pizza Peel",
     "Pizza scissors"
   ],
+  "keywords": [
+    "best pizza dough",
+    "best pizza dough recipe",
+    "easy homemade pizza dough",
+    "easy pizza dough",
+    "homemade pizza dough",
+    "homemade pizza dough recipe",
+    "how to make pizza dough",
+    "pizza crust",
+    "pizza crust recipe",
+    "pizza dough",
+    "pizza dough recipe"
+  ],
   "description": "This is the best pizza dough recipe ever. It's easy to makewith 5 ingredients and doesn't need to rise - which means you can have a freshhot homemade pizza on the table in 30 minutes.",
   "cook_time": 25,
   "cuisine": "American,Italian",
diff --git a/tests/test_data/justataste.com/justataste.json b/tests/test_data/justataste.com/justataste.json
index eefa4394..c199905e 100644
--- a/tests/test_data/justataste.com/justataste.json
+++ b/tests/test_data/justataste.com/justataste.json
@@ -67,6 +67,11 @@
   "title": "Baked Chicken and Cheese Taquitos (Oven or Air Fryer)",
   "total_time": 55,
   "yields": "6 servings",
+  "keywords": [
+    "chicken",
+    "lime juice",
+    "paprika"
+  ],
   "description": "Ditch the deep-fryer and forget the freezer aisle in favor of this fast, fresh and family favorite recipe for Baked Chicken and Cheese Taquitos.",
   "cook_time": 25,
   "cuisine": "Mexican",
diff --git a/tests/test_data/justonecookbook.com/justonecookbook.json b/tests/test_data/justonecookbook.com/justonecookbook.json
index 0755d5a1..8cd6ac7b 100644
--- a/tests/test_data/justonecookbook.com/justonecookbook.json
+++ b/tests/test_data/justonecookbook.com/justonecookbook.json
@@ -80,5 +80,8 @@
   "total_time": 30,
   "yields": "9 servings",
   "cook_time": 15,
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "japanese rice"
+  ]
 }
diff --git a/tests/test_data/kennymcgovern.com/kennymcgovern.json b/tests/test_data/kennymcgovern.com/kennymcgovern.json
index 46faeeb3..603f4a65 100644
--- a/tests/test_data/kennymcgovern.com/kennymcgovern.json
+++ b/tests/test_data/kennymcgovern.com/kennymcgovern.json
@@ -59,5 +59,11 @@
   "yields": "1 serving",
   "cook_time": 6,
   "cuisine": "American",
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "chicken",
+    "crispy chicken",
+    "kfc",
+    "fried chicken"
+  ]
 }
diff --git a/tests/test_data/kingarthurbaking.com/kingarthur.json b/tests/test_data/kingarthurbaking.com/kingarthur.json
index 0291018b..b607fcc6 100644
--- a/tests/test_data/kingarthurbaking.com/kingarthur.json
+++ b/tests/test_data/kingarthurbaking.com/kingarthur.json
@@ -72,6 +72,13 @@
   "title": "Spiced Rye Ginger Cookies",
   "total_time": 35,
   "yields": "22 cookies",
+  "keywords": [
+    "Drop cookies",
+    "Cinnamon",
+    "Rye",
+    "Spice",
+    "Quick & easy"
+  ],
   "description": "Cinnamon, cardamom, ginger, and rye bring a fresh twist to old-fashioned ginger cookies. With their bendy centers and slightly crunchy edges, these cookies are the perfect combination of soft and crispy. Made quickly and all in one bowl, these cookies — with their complex texture and alluringly spicy flavor — are a welcome addition to any cookie occasion. Spiced Rye Ginger Cookies are a part of The New Classics: Holiday Cookies collection. Check out the full lineup of all 14 cookies here.",
   "cook_time": 15,
   "prep_time": 20
diff --git a/tests/test_data/kitchenstories.com/kitchenstories.json b/tests/test_data/kitchenstories.com/kitchenstories.json
index 555fdccc..3de15666 100644
--- a/tests/test_data/kitchenstories.com/kitchenstories.json
+++ b/tests/test_data/kitchenstories.com/kitchenstories.json
@@ -44,5 +44,32 @@
   "ratings_count": 4,
   "site_name": "Kitchen Stories",
   "title": "Special strawberry jam with matcha",
-  "total_time": 80
+  "total_time": 80,
+  "keywords": [
+    "Brand Content",
+    "easter",
+    "vegetarian",
+    "valentines day",
+    "vegan",
+    "sweet",
+    "berries",
+    "gluten free",
+    "crowd pleaser",
+    "prepare ahead",
+    "pescetarian",
+    "comfort food",
+    "brunch",
+    "breakfast",
+    "lactose free",
+    "alcohol free",
+    "Meatless",
+    "Neff Großgeräte",
+    "mothers-day",
+    "sauces and dips",
+    "spring",
+    "summer",
+    "base",
+    "2022-05",
+    "confidence"
+  ]
 }
diff --git a/tests/test_data/kochbar.de/kochbar.json b/tests/test_data/kochbar.de/kochbar.json
index 328fe8c8..d0ba5667 100644
--- a/tests/test_data/kochbar.de/kochbar.json
+++ b/tests/test_data/kochbar.de/kochbar.json
@@ -86,5 +86,13 @@
   "yields": "2 servings",
   "cook_time": 40,
   "cuisine": "Europa",
-  "prep_time": 30
+  "prep_time": 30,
+  "keywords": [
+    "Ligurisches Hühnerragout mit Zucchini – Spezzatino con zucchine",
+    "Hühnerbrust",
+    "ohne Knochen",
+    "Knoblauchzehen",
+    "frisch",
+    "Zitronensaft"
+  ]
 }
diff --git a/tests/test_data/lecker.de/lecker_1.json b/tests/test_data/lecker.de/lecker_1.json
index 3820b622..f5317026 100644
--- a/tests/test_data/lecker.de/lecker_1.json
+++ b/tests/test_data/lecker.de/lecker_1.json
@@ -61,5 +61,25 @@
   "site_name": "lecker.de",
   "title": "Gemüsepfanne mit Hähnchen, Zuckerschoten und Brokkoli",
   "total_time": 25,
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "Hähnchen",
+    "Geflügel",
+    "Fleisch",
+    "Zutaten",
+    "Mittagessen",
+    "Mahlzeit",
+    "Rezepte",
+    "Abendbrot",
+    "Low Carb",
+    "Gesundes Essen",
+    "Hauptgerichte",
+    "Menüs",
+    "Brokkoli",
+    "Kohl",
+    "Gemüse",
+    "Zuckerschoten",
+    "Gemüsepfanne",
+    "Pfannengerichte"
+  ]
 }
diff --git a/tests/test_data/lecremedelacrumb.com/lecremedelacrumb.json b/tests/test_data/lecremedelacrumb.com/lecremedelacrumb.json
index 9b41c9e1..debd0ad6 100644
--- a/tests/test_data/lecremedelacrumb.com/lecremedelacrumb.json
+++ b/tests/test_data/lecremedelacrumb.com/lecremedelacrumb.json
@@ -58,6 +58,12 @@
   "title": "Instant Pot Shredded Chicken Tacos",
   "total_time": 35,
   "yields": "4 servings",
+  "keywords": [
+    "Chicken",
+    "healthy",
+    "instant pot",
+    "slow cooker"
+  ],
   "description": "These are the BEST Instant Pot Shredded Chicken Tacos, hands down. You'll love how quick, easy, and healthy this recipe is!",
   "cook_time": 20,
   "cuisine": "Mexican",
diff --git a/tests/test_data/lekkerensimpel.com/lekkerensimpel_1.json b/tests/test_data/lekkerensimpel.com/lekkerensimpel_1.json
index ad1d613d..0d54cdde 100644
--- a/tests/test_data/lekkerensimpel.com/lekkerensimpel_1.json
+++ b/tests/test_data/lekkerensimpel.com/lekkerensimpel_1.json
@@ -47,5 +47,9 @@
   "title": "Poké bowl met kip",
   "total_time": 35,
   "yields": "2 servings",
-  "cook_time": 35
+  "cook_time": 35,
+  "keywords": [
+    "bowl",
+    "kip"
+  ]
 }
diff --git a/tests/test_data/lifestyleofafoodie.com/lifestyleofafoodie_1.json b/tests/test_data/lifestyleofafoodie.com/lifestyleofafoodie_1.json
index 85beb1f7..0d51972b 100644
--- a/tests/test_data/lifestyleofafoodie.com/lifestyleofafoodie_1.json
+++ b/tests/test_data/lifestyleofafoodie.com/lifestyleofafoodie_1.json
@@ -55,5 +55,11 @@
   "title": "Frozen strawberry margaritas",
   "total_time": 5,
   "yields": "4 servings",
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "blended srawberry margaritas",
+    "blended strawberry margarita",
+    "frozen strawberry margarita",
+    "frozen strawberry margaritas"
+  ]
 }
diff --git a/tests/test_data/lifestyleofafoodie.com/lifestyleofafoodie_2.json b/tests/test_data/lifestyleofafoodie.com/lifestyleofafoodie_2.json
index 367b04c4..ba95a9e3 100644
--- a/tests/test_data/lifestyleofafoodie.com/lifestyleofafoodie_2.json
+++ b/tests/test_data/lifestyleofafoodie.com/lifestyleofafoodie_2.json
@@ -42,6 +42,13 @@
   "equipment": [
     "Ninja air fryer"
   ],
+  "keywords": [
+    "air fryer",
+    "air fryer frozen french fries",
+    "air fryer recipe",
+    "crinkle fries",
+    "french fries"
+  ],
   "cook_time": 12,
   "prep_time": 1
 }
diff --git a/tests/test_data/livelytable.com/livelytable_2.json b/tests/test_data/livelytable.com/livelytable_2.json
index 8c90d118..22666336 100644
--- a/tests/test_data/livelytable.com/livelytable_2.json
+++ b/tests/test_data/livelytable.com/livelytable_2.json
@@ -82,6 +82,11 @@
   "title": "Easy Chipotle Shrimp Tacos",
   "total_time": 15,
   "yields": "6 servings",
+  "keywords": [
+    "chipotle shrimp tacos",
+    "easy chipotle shrimp tacos",
+    "healthy shrimp tacos recipe"
+  ],
   "cooking_method": "stovetop",
   "description": "These easy chipotle shrimp tacos with a quick cilantro jalapeño sauce are flavorful, healthy and come together in just 15 minutes! They're perfect for weeknight dinners! (gluten-free)",
   "cook_time": 5,
diff --git a/tests/test_data/lovingitvegan.com/lovingitvegan.json b/tests/test_data/lovingitvegan.com/lovingitvegan.json
index ffacb541..29d54560 100644
--- a/tests/test_data/lovingitvegan.com/lovingitvegan.json
+++ b/tests/test_data/lovingitvegan.com/lovingitvegan.json
@@ -57,5 +57,10 @@
   "total_time": 10,
   "yields": "2 servings",
   "cuisine": "American,Vegan",
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "kale smoothie",
+    "smoothies",
+    "vegan kale smoothie"
+  ]
 }
diff --git a/tests/test_data/maangchi.com/maangchi.json b/tests/test_data/maangchi.com/maangchi.json
index dbff977e..acc3ad04 100644
--- a/tests/test_data/maangchi.com/maangchi.json
+++ b/tests/test_data/maangchi.com/maangchi.json
@@ -87,5 +87,16 @@
   "yields": "4 servings",
   "cooking_method": "Double frying",
   "cook_time": 14,
-  "prep_time": 20
+  "prep_time": 20,
+  "keywords": [
+    "fried chicken with sweet sour sauce",
+    "유린기",
+    "Korean Chinese cuisine",
+    "Korean cooking",
+    "Korean cuisine",
+    "Maangchi yuringi recipe",
+    "Pepper fried chicken",
+    "Sweet sour pepper fried chicken",
+    "yuringi recipe"
+  ]
 }
diff --git a/tests/test_data/madensverden.dk/madensverden.json b/tests/test_data/madensverden.dk/madensverden.json
index 4736123f..b39aee5b 100644
--- a/tests/test_data/madensverden.dk/madensverden.json
+++ b/tests/test_data/madensverden.dk/madensverden.json
@@ -57,5 +57,8 @@
   "site_name": "Madens Verden",
   "title": "Rabarbertrifli",
   "total_time": 30,
-  "yields": "6 servings"
+  "yields": "6 servings",
+  "keywords": [
+    "rabarber"
+  ]
 }
diff --git a/tests/test_data/madsvin.com/madsvin.json b/tests/test_data/madsvin.com/madsvin.json
index ef6a61d8..df29e8ac 100644
--- a/tests/test_data/madsvin.com/madsvin.json
+++ b/tests/test_data/madsvin.com/madsvin.json
@@ -48,5 +48,10 @@
   "total_time": 20,
   "yields": "10 servings",
   "cook_time": 15,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "pandekage",
+    "pandekage opskrift",
+    "Pandekager"
+  ]
 }
diff --git a/tests/test_data/marmiton.org/marmiton.json b/tests/test_data/marmiton.org/marmiton.json
index 5cfeb16c..c4cf1a6a 100644
--- a/tests/test_data/marmiton.org/marmiton.json
+++ b/tests/test_data/marmiton.org/marmiton.json
@@ -56,6 +56,22 @@
   "title": "Ratatouille",
   "total_time": 80,
   "yields": "4 servings",
+  "keywords": [
+    "Ratatouille",
+    "aubergine",
+    "courgette",
+    "poivron",
+    "oignon",
+    "tomate",
+    "huile d'olive",
+    "thym",
+    "feuille de laurier",
+    "poivre",
+    "sel",
+    "ail",
+    "facile",
+    "moyen"
+  ],
   "description": "aubergine, courgette, poivron, oignon, tomate, huile d'olive, thym, feuille de laurier, poivre, sel, ail",
   "cook_time": 55,
   "cuisine": "Plat principal",
diff --git a/tests/test_data/marthastewart.com/marthastewart.json b/tests/test_data/marthastewart.com/marthastewart.json
index e6a88c6e..463baac4 100644
--- a/tests/test_data/marthastewart.com/marthastewart.json
+++ b/tests/test_data/marthastewart.com/marthastewart.json
@@ -40,6 +40,16 @@
   "title": "Breaded Chicken Breasts",
   "total_time": 25,
   "yields": "4 servings",
+  "keywords": [
+    "breaded chicken breasts",
+    "Breadcrumbs",
+    "Chicken cutlets",
+    "Dinner",
+    "Dredge",
+    "Fry",
+    "Lunch",
+    "Main course"
+  ],
   "description": "Learn how to make breaded chicken breasts in under 30 minutes. Our easy three-step method for fried chicken cutlets makes easy and delicious weeknight dinners.",
   "cuisine": "American",
   "prep_time": 25
diff --git a/tests/test_data/matprat.no/matprat_1.json b/tests/test_data/matprat.no/matprat_1.json
index 7b300b57..c97242d4 100644
--- a/tests/test_data/matprat.no/matprat_1.json
+++ b/tests/test_data/matprat.no/matprat_1.json
@@ -88,5 +88,17 @@
   "yields": "6 servings",
   "cook_time": 80,
   "cuisine": "Internasjonal",
-  "prep_time": 80
+  "prep_time": 80,
+  "keywords": [
+    "Butter chicken",
+    "smørkylling",
+    "kylling",
+    "murgh makhani",
+    "curry",
+    "gurkemeie",
+    "indisk",
+    "indisk gryte",
+    "basmatiris",
+    "koriander"
+  ]
 }
diff --git a/tests/test_data/matprat.no/matprat_2.json b/tests/test_data/matprat.no/matprat_2.json
index 61fd5532..5efe56e6 100644
--- a/tests/test_data/matprat.no/matprat_2.json
+++ b/tests/test_data/matprat.no/matprat_2.json
@@ -47,5 +47,14 @@
   "title": "Mangosalat",
   "total_time": 20,
   "yields": "4 servings",
-  "cuisine": "Internasjonal"
+  "cuisine": "Internasjonal",
+  "keywords": [
+    "mangosalat med lime",
+    "mango",
+    "rødløk",
+    "pasjonsfrukt",
+    "olivenolje",
+    "salt",
+    "pepper"
+  ]
 }
diff --git a/tests/test_data/melskitchencafe.com/melskitchencafe.json b/tests/test_data/melskitchencafe.com/melskitchencafe.json
index e171bdf8..9293420b 100644
--- a/tests/test_data/melskitchencafe.com/melskitchencafe.json
+++ b/tests/test_data/melskitchencafe.com/melskitchencafe.json
@@ -58,5 +58,14 @@
   "total_time": 150,
   "yields": "50 servings",
   "cook_time": 20,
-  "prep_time": 130
+  "prep_time": 130,
+  "keywords": [
+    "anise extract",
+    "butter",
+    "corn syrup",
+    "food coloring",
+    "granulated sugar",
+    "sweetened condensed milk",
+    "vanilla extract"
+  ]
 }
diff --git a/tests/test_data/mindmegette.hu/mindmegette.json b/tests/test_data/mindmegette.hu/mindmegette.json
index 61d326ae..dfa1adfb 100644
--- a/tests/test_data/mindmegette.hu/mindmegette.json
+++ b/tests/test_data/mindmegette.hu/mindmegette.json
@@ -41,6 +41,22 @@
   "title": "Tepsis krumpli céklával és répával",
   "total_time": 45,
   "yields": "4 servings",
+  "keywords": [
+    "Tepsis krumpli céklával és répával",
+    "vegetáriánus",
+    "klasszikus",
+    "ebéd-vacsora otthonra",
+    "átlagos",
+    "egyszerű",
+    "45 perc",
+    "egytálétel",
+    "köret",
+    "krumplis",
+    "tepsis",
+    "céklás",
+    "burgonya",
+    "rozmaringos - MME"
+  ],
   "description": "Egy finom Tepsis krumpli céklával és répával ebédre vagy vacsorára? Tepsis krumpli céklával és répával Receptek a Mindmegette.hu Recept gyűjteményében!",
   "cook_time": 45
 }
diff --git a/tests/test_data/minimalistbaker.com/minimalistbaker.json b/tests/test_data/minimalistbaker.com/minimalistbaker.json
index 1a48eebe..f46e2764 100644
--- a/tests/test_data/minimalistbaker.com/minimalistbaker.json
+++ b/tests/test_data/minimalistbaker.com/minimalistbaker.json
@@ -56,5 +56,8 @@
   "total_time": 40,
   "yields": "8 servings",
   "cuisine": "Gluten-Free,Italian-Inspired,Vegan",
-  "prep_time": 40
+  "prep_time": 40,
+  "keywords": [
+    "vegan ricotta"
+  ]
 }
diff --git a/tests/test_data/ministryofcurry.com/ministryofcurry.json b/tests/test_data/ministryofcurry.com/ministryofcurry.json
index 6f717be3..33cbb580 100644
--- a/tests/test_data/ministryofcurry.com/ministryofcurry.json
+++ b/tests/test_data/ministryofcurry.com/ministryofcurry.json
@@ -81,6 +81,10 @@
   "equipment": [
     "Slow Cooker"
   ],
+  "keywords": [
+    "chicken tikka masala",
+    "slow cooker"
+  ],
   "cook_time": 240,
   "prep_time": 30
 }
diff --git a/tests/test_data/misya.info/misya.json b/tests/test_data/misya.info/misya.json
index ed667450..c82ccb8d 100644
--- a/tests/test_data/misya.info/misya.json
+++ b/tests/test_data/misya.info/misya.json
@@ -52,6 +52,10 @@
   "title": "Tortino cuore caldo",
   "total_time": 35,
   "yields": "6 servings",
+  "keywords": [
+    "tortino cuore caldo",
+    "ricetta tortino cuore caldo"
+  ],
   "description": "Il tortino dal cuore caldo (o lava cake) è una delle ricette dolci che preferisco: dolce e scioglievole al punto giusto e sempre di effetto. Ne avevo già fatta una versione con il cioccolato fondente anni fa, e quest'anno ho pensato di proporne una nuova, fatta con il cioccolato bianco e romanticamente colorata di rosso, un dolce di un buono ma di un buono che mi ha conquistato al primo assaggio. A che stanno i vostri preparativi per domenica? Già scelto il menu di San Valentino? Se vi manca ancora il dolce potreste optare per questo romanticissimo e delizioso tortino rosso dal cuore morbido, una vera chicca per gli amanti del cioccolato bianco! Mi raccomando solo di stare attenti alla cottura, l'unica vera difficoltà di questo dolce. Quindi vi consiglio di fare la prova tirando via dal forno un solo tortino per poi passare agli altri. Ragazze io scappo, oggi ho un venerdì infuocato ;)",
   "cook_time": 15,
   "cuisine": "Italiana",
diff --git a/tests/test_data/mob.co.uk/mob_1.json b/tests/test_data/mob.co.uk/mob_1.json
index 336c9532..62bc72b9 100644
--- a/tests/test_data/mob.co.uk/mob_1.json
+++ b/tests/test_data/mob.co.uk/mob_1.json
@@ -58,5 +58,13 @@
   "nutrients": {
     "servingSize": "4"
   },
-  "ratings": "4.647"
+  "ratings": "4.647",
+  "keywords": [
+    "chilli cheese paratha",
+    "indian cheese paratha",
+    "indian paratha recipe",
+    "cheese paratha recipe",
+    "chilli cheese paratha recipe",
+    "cheesy paratha recipe"
+  ]
 }
diff --git a/tests/test_data/momswithcrockpots.com/momswithcrockpots.json b/tests/test_data/momswithcrockpots.com/momswithcrockpots.json
index e32e9a87..45eb3c9f 100644
--- a/tests/test_data/momswithcrockpots.com/momswithcrockpots.json
+++ b/tests/test_data/momswithcrockpots.com/momswithcrockpots.json
@@ -61,6 +61,9 @@
   "equipment": [
     "6 Qt Crockpot"
   ],
+  "keywords": [
+    "holiday"
+  ],
   "description": "Shared Hundreds of Thousands of times this Crockpot Macaroni & Cheese Recipe is a keeper! Try this delicious homestyle dish today!",
   "cook_time": 210,
   "cuisine": "American",
diff --git a/tests/test_data/mybakingaddiction.com/mybakingaddiction.json b/tests/test_data/mybakingaddiction.com/mybakingaddiction.json
index 5ea0cba8..b3ee1260 100644
--- a/tests/test_data/mybakingaddiction.com/mybakingaddiction.json
+++ b/tests/test_data/mybakingaddiction.com/mybakingaddiction.json
@@ -74,6 +74,13 @@
   "title": "Chocolate Zucchini Bread",
   "total_time": 75,
   "yields": "2 servings",
+  "keywords": [
+    "Bread",
+    "Chocolate",
+    "Coconut",
+    "Summer Recipes",
+    "Zucchini"
+  ],
   "description": "Chocolate zucchini bread is quick, delicious, and the perfect use for the last of your summer zucchini. Enjoy a slice with your morning coffee or serve it up for dessert.",
   "cook_time": 60,
   "prep_time": 15
diff --git a/tests/test_data/mykitchen101en.com/mykitchen101en.json b/tests/test_data/mykitchen101en.com/mykitchen101en.json
index 17a20c09..3f8b8ef2 100644
--- a/tests/test_data/mykitchen101en.com/mykitchen101en.json
+++ b/tests/test_data/mykitchen101en.com/mykitchen101en.json
@@ -69,6 +69,11 @@
   "equipment": [
     "2 mini muffin pans"
   ],
+  "keywords": [
+    "mini cupcakes",
+    "mini egg cakes",
+    "mini egg sponge cakes"
+  ],
   "description": "Baked mini egg sponge cakes, a traditional food that kids love. Mini cupcakes with rich egg fragrance made with just a few simple ingredients.",
   "cook_time": 25,
   "cuisine": "Worldwide",
diff --git a/tests/test_data/norecipes.com/norecipes_1.json b/tests/test_data/norecipes.com/norecipes_1.json
index 5959ba49..a3eef229 100644
--- a/tests/test_data/norecipes.com/norecipes_1.json
+++ b/tests/test_data/norecipes.com/norecipes_1.json
@@ -57,5 +57,11 @@
   "total_time": 27,
   "yields": "6 servings",
   "cook_time": 22,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "cake",
+    "cheesecake",
+    "party food",
+    "sweets"
+  ]
 }
diff --git a/tests/test_data/norecipes.com/norecipes_2.json b/tests/test_data/norecipes.com/norecipes_2.json
index dc12c849..b055851e 100644
--- a/tests/test_data/norecipes.com/norecipes_2.json
+++ b/tests/test_data/norecipes.com/norecipes_2.json
@@ -82,5 +82,10 @@
   "total_time": 30,
   "yields": "4 servings",
   "cook_time": 10,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "easy",
+    "orange",
+    "quick"
+  ]
 }
diff --git a/tests/test_data/nosalty.hu/nosalty.json b/tests/test_data/nosalty.hu/nosalty.json
index 8417ecc0..37563d69 100644
--- a/tests/test_data/nosalty.hu/nosalty.json
+++ b/tests/test_data/nosalty.hu/nosalty.json
@@ -76,5 +76,24 @@
   "site_name": "NoSalty",
   "title": "Aranygaluska ahogy a nagymamám készíti",
   "total_time": 90,
-  "yields": "6 servings"
+  "yields": "6 servings",
+  "keywords": [
+    "vasárnapi ebéd",
+    "szüret",
+    "ebéd",
+    "uzsonna",
+    "vacsora",
+    "ovo-lakto vegetáriánus",
+    "vegetáriánus",
+    "Finomliszt",
+    "Friss élesztő",
+    "Vaj",
+    "Tej",
+    "Cukor",
+    "Tojássárgája",
+    "Dió",
+    "Vanília",
+    "közepes",
+    "ráérős"
+  ]
 }
diff --git a/tests/test_data/nrk.no/nrkmat_1.json b/tests/test_data/nrk.no/nrkmat_1.json
index 45fbd9b2..8ffb5b96 100644
--- a/tests/test_data/nrk.no/nrkmat_1.json
+++ b/tests/test_data/nrk.no/nrkmat_1.json
@@ -57,5 +57,9 @@
   "language": "nb-NO",
   "site_name": "NRK",
   "title": "Honningmarinert grillet kylling med rosmarinpoteter",
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "Grill",
+    "Kylling/Fugl"
+  ]
 }
diff --git a/tests/test_data/nrk.no/nrkmat_2.json b/tests/test_data/nrk.no/nrkmat_2.json
index 225a95ae..74712b5b 100644
--- a/tests/test_data/nrk.no/nrkmat_2.json
+++ b/tests/test_data/nrk.no/nrkmat_2.json
@@ -48,5 +48,9 @@
   "language": "nb-NO",
   "site_name": "NRK",
   "title": "Kikertsuppe med eple og karri",
-  "yields": "2 servings"
+  "yields": "2 servings",
+  "keywords": [
+    "Suppe",
+    "Grønnsaker"
+  ]
 }
diff --git a/tests/test_data/number-2-pencil.com/number2pencil_2.json b/tests/test_data/number-2-pencil.com/number2pencil_2.json
index 4684735d..fe3ae396 100644
--- a/tests/test_data/number-2-pencil.com/number2pencil_2.json
+++ b/tests/test_data/number-2-pencil.com/number2pencil_2.json
@@ -89,5 +89,8 @@
   "total_time": 45,
   "yields": "12 servings",
   "cook_time": 15,
-  "prep_time": 30
+  "prep_time": 30,
+  "keywords": [
+    "Strawberry Shortcake"
+  ]
 }
diff --git a/tests/test_data/ohsheglows.com/ohsheglows.json b/tests/test_data/ohsheglows.com/ohsheglows.json
index 14e5f19b..124ae7cf 100644
--- a/tests/test_data/ohsheglows.com/ohsheglows.json
+++ b/tests/test_data/ohsheglows.com/ohsheglows.json
@@ -54,6 +54,15 @@
   "title": "Obsession-Worthy Peanut Butter Cookie Ice Cream",
   "total_time": 22,
   "yields": "8 cups",
+  "keywords": [
+    "Vegan",
+    "Gluten-Free",
+    "Oil-Free",
+    "Freezer Friendly",
+    "Kid Friendly",
+    "Make-Ahead",
+    "Party Favourite"
+  ],
   "description": "This is my favourite kind of summer indulgence! My reader-favourite Flourless Peanut Butter Cookies meet my dreamy homemade peanut butter and coconut milk ice cream in this cooling summer treat. Chewy coconut, snappy chocolate chips, and tender bites of soft peanut butter cookies blend perfectly with a creamy vanilla and peanut butter vegan ice cream. If I’d known how simple it was to make my own vegan ice cream (only 5 ingredients!), I would’ve invested in an ice cream machine long ago. Well, I’m making up for lost time now!",
   "cook_time": 12,
   "cuisine": "Canadian",
diff --git a/tests/test_data/omnivorescookbook.com/omnivorescookbook_1.json b/tests/test_data/omnivorescookbook.com/omnivorescookbook_1.json
index e0fe4e7c..0c61734e 100644
--- a/tests/test_data/omnivorescookbook.com/omnivorescookbook_1.json
+++ b/tests/test_data/omnivorescookbook.com/omnivorescookbook_1.json
@@ -54,5 +54,8 @@
   "total_time": 15,
   "yields": "2 servings",
   "cook_time": 5,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "home style"
+  ]
 }
diff --git a/tests/test_data/omnivorescookbook.com/omnivorescookbook_2.json b/tests/test_data/omnivorescookbook.com/omnivorescookbook_2.json
index b346b7b8..6de24ef8 100644
--- a/tests/test_data/omnivorescookbook.com/omnivorescookbook_2.json
+++ b/tests/test_data/omnivorescookbook.com/omnivorescookbook_2.json
@@ -86,5 +86,8 @@
   "total_time": 35,
   "yields": "4 servings",
   "cook_time": 15,
-  "prep_time": 20
+  "prep_time": 20,
+  "keywords": [
+    "restaurant-style"
+  ]
 }
diff --git a/tests/test_data/onceuponachef.com/onceuponachef_1.json b/tests/test_data/onceuponachef.com/onceuponachef_1.json
index fcb8a4ea..6e79bf1b 100644
--- a/tests/test_data/onceuponachef.com/onceuponachef_1.json
+++ b/tests/test_data/onceuponachef.com/onceuponachef_1.json
@@ -67,5 +67,16 @@
   "total_time": 90,
   "yields": "2 loaves",
   "cook_time": 65,
-  "prep_time": 20
+  "prep_time": 20,
+  "keywords": [
+    "After School Snack",
+    "Comfort Food",
+    "Fall",
+    "For the Host/Hostess",
+    "Halloween",
+    "Potluck",
+    "Pumpkin",
+    "Thanksgiving",
+    "Winter"
+  ]
 }
diff --git a/tests/test_data/onceuponachef.com/onceuponachef_2.json b/tests/test_data/onceuponachef.com/onceuponachef_2.json
index 05e49b68..d6c87349 100644
--- a/tests/test_data/onceuponachef.com/onceuponachef_2.json
+++ b/tests/test_data/onceuponachef.com/onceuponachef_2.json
@@ -80,5 +80,23 @@
   "site_name": "Once Upon a Chef",
   "title": "Black Bean & Corn Salad with Chipotle-Honey Vinaigrette",
   "total_time": 30,
-  "yields": "6 servings"
+  "yields": "6 servings",
+  "keywords": [
+    "Avocados",
+    "Bbq",
+    "Beans",
+    "Chipotle Chiles",
+    "Cookbook Recipe",
+    "Corn",
+    "Father's Day",
+    "Homemade Salad Dressings",
+    "July 4th",
+    "Labor Day",
+    "Limes",
+    "Memorial Day",
+    "Peppers",
+    "Picnic",
+    "Potluck",
+    "Summer"
+  ]
 }
diff --git a/tests/test_data/paleorunningmomma.com/paleorunningmomma.json b/tests/test_data/paleorunningmomma.com/paleorunningmomma.json
index 5f480828..0d7a1f9c 100644
--- a/tests/test_data/paleorunningmomma.com/paleorunningmomma.json
+++ b/tests/test_data/paleorunningmomma.com/paleorunningmomma.json
@@ -72,6 +72,15 @@
   "title": "Paleo Beef Stroganoff {Whole30, Keto}",
   "total_time": 40,
   "yields": "6 servings",
+  "keywords": [
+    "beef",
+    "dinner",
+    "keto",
+    "low carb",
+    "paleo",
+    "stroganoff",
+    "whole30"
+  ],
   "description": "This hearty and savory paleo beef stroganoff is made all in one skillet for a quick, delicious and cozy weeknight meal. It’s Whole30 compliant, low carb and keto and perfect served over sautéed cauliflower rice or your favorite veggie noodles!",
   "cook_time": 30,
   "cuisine": "Gluten-free,keto,Paleo,Whole30",
diff --git a/tests/test_data/persnicketyplates.com/persnicketyplates.json b/tests/test_data/persnicketyplates.com/persnicketyplates.json
index 3e08045e..bac38b3b 100644
--- a/tests/test_data/persnicketyplates.com/persnicketyplates.json
+++ b/tests/test_data/persnicketyplates.com/persnicketyplates.json
@@ -62,5 +62,10 @@
   "total_time": 125,
   "yields": "8 servings",
   "cook_time": 120,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "Crock pot hawaiian meatballs",
+    "Crockpot hawaiian meatballs",
+    "Slow cooker hawaiian meatballs"
+  ]
 }
diff --git a/tests/test_data/pickuplimes.com/pickuplimes.json b/tests/test_data/pickuplimes.com/pickuplimes.json
index 58cf4e27..33a2ece2 100644
--- a/tests/test_data/pickuplimes.com/pickuplimes.json
+++ b/tests/test_data/pickuplimes.com/pickuplimes.json
@@ -87,5 +87,13 @@
   "site_name": "Pick Up Limes",
   "title": "Vegan \"Honey\" Mustard Tofu Wraps",
   "total_time": 30,
-  "yields": "5 servings"
+  "yields": "5 servings",
+  "keywords": [
+    "peanut free",
+    "tree nut free",
+    "sesame free",
+    "vegan",
+    "vegetarian",
+    "plant-based"
+  ]
 }
diff --git a/tests/test_data/pinchofyum.com/pinchofyum.json b/tests/test_data/pinchofyum.com/pinchofyum.json
index c6564727..a7de0a6f 100644
--- a/tests/test_data/pinchofyum.com/pinchofyum.json
+++ b/tests/test_data/pinchofyum.com/pinchofyum.json
@@ -58,6 +58,13 @@
   "total_time": 45,
   "yields": "4 servings",
   "cooking_method": "Stovetop",
+  "keywords": [
+    "broccoli cheese soup",
+    "broccoli cheddar soup",
+    "soup season",
+    "broccoli cheddar",
+    "Panera broccoli cheese soup"
+  ],
   "category": "Soup",
   "cook_time": 30,
   "cuisine": "American",
diff --git a/tests/test_data/pingodoce.pt/pingodoce.json b/tests/test_data/pingodoce.pt/pingodoce.json
index 4586f017..09355106 100644
--- a/tests/test_data/pingodoce.pt/pingodoce.json
+++ b/tests/test_data/pingodoce.pt/pingodoce.json
@@ -65,5 +65,12 @@
   "title": "Arroz de tamboril",
   "total_time": 60,
   "yields": "4 servings",
-  "prep_time": 60
+  "prep_time": 60,
+  "keywords": [
+    "arroz",
+    "camarão",
+    "marisco",
+    "peixe",
+    "pimento"
+  ]
 }
diff --git a/tests/test_data/pinkowlkitchen.com/pinkowlkitchen_1.json b/tests/test_data/pinkowlkitchen.com/pinkowlkitchen_1.json
index 7e68b04c..5a2727bf 100644
--- a/tests/test_data/pinkowlkitchen.com/pinkowlkitchen_1.json
+++ b/tests/test_data/pinkowlkitchen.com/pinkowlkitchen_1.json
@@ -58,5 +58,10 @@
   "total_time": 60,
   "yields": "10 servings",
   "cook_time": 50,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "chess pie",
+    "chocolate chess pie",
+    "chocolate pie"
+  ]
 }
diff --git a/tests/test_data/pinkowlkitchen.com/pinkowlkitchen_2.json b/tests/test_data/pinkowlkitchen.com/pinkowlkitchen_2.json
index 61a8ba54..43362d37 100644
--- a/tests/test_data/pinkowlkitchen.com/pinkowlkitchen_2.json
+++ b/tests/test_data/pinkowlkitchen.com/pinkowlkitchen_2.json
@@ -59,5 +59,12 @@
   "title": "Chocolate Cream Cold Brew (Starbucks Copycat)",
   "total_time": 5,
   "yields": "1 serving",
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "chocolate cream cold brew",
+    "cold brew",
+    "iced coffee",
+    "starbucks drink",
+    "starbucks dupe"
+  ]
 }
diff --git a/tests/test_data/platingpixels.com/platingpixels_1.json b/tests/test_data/platingpixels.com/platingpixels_1.json
index b589db84..6ac91ac3 100644
--- a/tests/test_data/platingpixels.com/platingpixels_1.json
+++ b/tests/test_data/platingpixels.com/platingpixels_1.json
@@ -65,5 +65,11 @@
   "total_time": 45,
   "yields": "12 servings",
   "cook_time": 30,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "beef short ribs",
+    "Instant pot ribs",
+    "kalbi recipe",
+    "Korean short ribs"
+  ]
 }
diff --git a/tests/test_data/platingpixels.com/platingpixels_2.json b/tests/test_data/platingpixels.com/platingpixels_2.json
index 878d0106..9f61c572 100644
--- a/tests/test_data/platingpixels.com/platingpixels_2.json
+++ b/tests/test_data/platingpixels.com/platingpixels_2.json
@@ -87,5 +87,10 @@
   "total_time": 30,
   "yields": "6 servings",
   "cook_time": 15,
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "breaded fried chicken",
+    "Chicken Fried Chicken",
+    "fried chicken recipe"
+  ]
 }
diff --git a/tests/test_data/plowingthroughlife.com/plowingthroughlife_1.json b/tests/test_data/plowingthroughlife.com/plowingthroughlife_1.json
index 967c8440..0ad85ecf 100644
--- a/tests/test_data/plowingthroughlife.com/plowingthroughlife_1.json
+++ b/tests/test_data/plowingthroughlife.com/plowingthroughlife_1.json
@@ -61,5 +61,8 @@
   "total_time": 160,
   "yields": "12 servings",
   "cook_time": 150,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "Crock Pot Mac and Cheese"
+  ]
 }
diff --git a/tests/test_data/plowingthroughlife.com/plowingthroughlife_2.json b/tests/test_data/plowingthroughlife.com/plowingthroughlife_2.json
index 2867262f..e7793fdb 100644
--- a/tests/test_data/plowingthroughlife.com/plowingthroughlife_2.json
+++ b/tests/test_data/plowingthroughlife.com/plowingthroughlife_2.json
@@ -72,5 +72,8 @@
   "total_time": 35,
   "yields": "10 servings",
   "cook_time": 30,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "Canned Cinnamon Rolls with Cream"
+  ]
 }
diff --git a/tests/test_data/popsugar.com/popsugar.json b/tests/test_data/popsugar.com/popsugar.json
index 130b52d1..e7f9b159 100644
--- a/tests/test_data/popsugar.com/popsugar.json
+++ b/tests/test_data/popsugar.com/popsugar.json
@@ -66,6 +66,15 @@
   "title": "Rainbow Pasta",
   "total_time": 50,
   "yields": "6 servings",
+  "keywords": [
+    "OxiClean",
+    "Kid-Friendly Recipes",
+    "Get the Dish",
+    "Original Recipes",
+    "Dinner",
+    "Rainbow",
+    "Pasta"
+  ],
   "description": "Rainbow PastaFrom Skylar Thomson, POPSUGAR Food IngredientsFor the parmesan tuile: 4 tablespoons grated parmesan cheese Non-stick cooking spray For the pasta:",
   "cuisine": "Italian"
 }
diff --git a/tests/test_data/pressureluckcooking.com/pressureluckcooking.json b/tests/test_data/pressureluckcooking.com/pressureluckcooking.json
index 90fd2d88..dce6e785 100644
--- a/tests/test_data/pressureluckcooking.com/pressureluckcooking.json
+++ b/tests/test_data/pressureluckcooking.com/pressureluckcooking.json
@@ -69,5 +69,10 @@
   "total_time": 30,
   "yields": "6 servings",
   "cook_time": 5,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "Jeffrey's Favorite Chicken",
+    "Instant Pot",
+    "Pressure Luck"
+  ]
 }
diff --git a/tests/test_data/primaledgehealth.com/primaledgehealth.json b/tests/test_data/primaledgehealth.com/primaledgehealth.json
index b5d07d1d..c8309cb8 100644
--- a/tests/test_data/primaledgehealth.com/primaledgehealth.json
+++ b/tests/test_data/primaledgehealth.com/primaledgehealth.json
@@ -49,6 +49,16 @@
   "title": "No Bake Custard (Keto & Carnivore-Friendly)",
   "total_time": 70,
   "yields": "2 servings",
+  "keywords": [
+    "10 minutes",
+    "5 ingredients",
+    "carnivore dessert",
+    "carnivore diet dessert",
+    "carnivore-friendly dessert",
+    "keto carnivore",
+    "keto custard",
+    "no bake custard"
+  ],
   "description": "This no bake keto carnivore custard has the same great flavor and silky smooth texture as traditional custard but is less work to make! Make it yourself with just 5 ingredients and 10 minutes of prep time.",
   "cuisine": "American",
   "prep_time": 10
diff --git a/tests/test_data/przepisy.pl/przepisy.json b/tests/test_data/przepisy.pl/przepisy.json
index b8a0300a..ca744ca3 100644
--- a/tests/test_data/przepisy.pl/przepisy.json
+++ b/tests/test_data/przepisy.pl/przepisy.json
@@ -41,6 +41,14 @@
   "title": "Placki ziemniaczane",
   "total_time": 40,
   "yields": "8 servings",
+  "keywords": [
+    "Na co dzień",
+    "Ziemniaki",
+    "Warzywa",
+    "Jajka",
+    "Łagodne",
+    "Bez mięsa"
+  ],
   "description": "Jedni zajadają się plackami ziemniaczanymi posypanymi cukrem, inni z ochotą dodają do nich gęstą, kwaśną śmietanę, a jeszcze inni najbardziej cenią przepisy na placki ziemniaczane polane mięsnym gulaszem. Niewątpliwie najlepsze placki ziemniaczane to te usmażone na złoto, których chrupiąca, lekko przypieczona skórka skrywa miękki i delikatny środek. Niezależnie od tego, jakie dodatki należą do Twoich kulinarnych faworytów, poznaj naszą wersję przyrządzania tych przysmaków. Rumiane placki ziemniaczane to coś zdecydowanie więcej niż tylko potrawa charakterystyczna dla barów mlecznych. Dla kogo? Przepis na placki ziemniaczane przypadnie do gustu smakoszom ziemniaczanych potraw. Do stołu chętnie zasiądą również zwolennicy tradycyjnych dań. Kuchnia jak u mamy? Z plackami ziemniaczanymi według naszego przepisu ten efekt uzyskasz bez problemów. Masz ochotę na odrobinę nowości? Do chrupiących placuszków dodaj łososia albo krewetki – nie pożałujesz! Na jaką okazję? Placki ziemniaczane to idealna propozycja na poskromienie większego głodu. Świetnie sprawdzają się w jesiennych i zimowych miesiącach jako rozgrzewający obiad. Jak zrobić placki ziemniaczane w takiej odsłonie? Sos grzybowy, żurawina i oscypek to sezonowe, obowiązkowe dodatki. Czy wiesz, że? Ziemniaków nie musisz trzeć na drobnej tarce. Wystarczy, że zetrzesz je na grubych oczkach. Jak zrobić placki ziemniaczane tak, aby nie rozpadły się podczas smażenia, do masy ziemniaczanej dodaj jajko i odrobinę mąki. Ich postrzępione brzegi nie tylko pięknie się prezentują, ale też genialnie smakują i chrupią. Dla urozmaicenia: Pamiętaj, że przepis na placki ziemniaczane możesz dowolnie urozmaicić, serwując je z ulubionymi składnikami. Jak zrobić placki ziemniaczane, które zaskoczą wszystkich? Jeśli lubisz eksperymentować, do masy (oprócz czosnku) dorzuć ulubione zioła lub drobno pokrojone warzywa. Dzięki szpinakowi, papryce chili lub cebuli będą aromatyczne i kolorowe.",
   "prep_time": 40
 }
diff --git a/tests/test_data/rainbowplantlife.com/rainbowplantlife.json b/tests/test_data/rainbowplantlife.com/rainbowplantlife.json
index 64edbb08..bb2bafbe 100644
--- a/tests/test_data/rainbowplantlife.com/rainbowplantlife.json
+++ b/tests/test_data/rainbowplantlife.com/rainbowplantlife.json
@@ -76,6 +76,12 @@
   "title": "Vegan Brown Butter Peach Cobbler",
   "total_time": 60,
   "yields": "10 servings",
+  "keywords": [
+    "cobbler",
+    "nut-free",
+    "peach",
+    "soy-free"
+  ],
   "description": "A delicious twist on the classic Southern peach cobbler. Peaches and blueberries get swirled with vegan brown butter and cobbler, making for a cake that’s sticky and caramelized on the outside yet fluffy and tender on the inside. It’s truly the best vegan peach cobbler!",
   "cook_time": 45,
   "cuisine": "Baking,Southern",
diff --git a/tests/test_data/rainbowplantlife.com/rainbowplantlife_groups.json b/tests/test_data/rainbowplantlife.com/rainbowplantlife_groups.json
index cc39b70d..6f6d8848 100644
--- a/tests/test_data/rainbowplantlife.com/rainbowplantlife_groups.json
+++ b/tests/test_data/rainbowplantlife.com/rainbowplantlife_groups.json
@@ -89,6 +89,11 @@
   "title": "Vegan Pasta Salad",
   "total_time": 40,
   "yields": "10 servings",
+  "keywords": [
+    "pasta salad",
+    "roasted red pepper pasta",
+    "vegan pasta salad"
+  ],
   "description": "This vegan pasta salad is guaranteed to impress at all your summer BBQs and picnics! Pasta is coated in a creamy and dreamy roasted red pepper sauce and topped with a herby bread crumb topping for extra fresh flavor for an exquisite, grown-up pasta salad.",
   "cook_time": 20,
   "cuisine": "Italian-Inspired,Spanish-Inspired",
diff --git a/tests/test_data/realfood.tesco.com/realfoodtesco_1.json b/tests/test_data/realfood.tesco.com/realfoodtesco_1.json
index 502579e7..f32d47cb 100644
--- a/tests/test_data/realfood.tesco.com/realfoodtesco_1.json
+++ b/tests/test_data/realfood.tesco.com/realfoodtesco_1.json
@@ -61,6 +61,18 @@
   "title": "Roasted cauliflower tagine",
   "total_time": 30,
   "yields": "4 servings",
+  "keywords": [
+    "roasted cauliflower",
+    "cauliflower",
+    "tagine",
+    "Africa",
+    "African",
+    "Moroccan",
+    "veggie",
+    "vegetarian",
+    "healthy",
+    "freezable"
+  ],
   "description": "Bring the taste of North Africa to your midweek dinners with this fragrant spiced tagine",
   "cook_time": 25,
   "cuisine": "African",
diff --git a/tests/test_data/receitasnestle.com.br/receitasnestlebr_1.json b/tests/test_data/receitasnestle.com.br/receitasnestlebr_1.json
index 6d0ca38c..671bf702 100644
--- a/tests/test_data/receitasnestle.com.br/receitasnestlebr_1.json
+++ b/tests/test_data/receitasnestle.com.br/receitasnestlebr_1.json
@@ -46,5 +46,36 @@
   "title": "Receita de Costelinha de Porco com Batatas Salteadas no Alecrim",
   "total_time": 40,
   "yields": "5 servings",
-  "cuisine": "Local"
+  "cuisine": "Local",
+  "keywords": [
+    "Jantar",
+    "Almoço",
+    "Meal set",
+    "Local",
+    "Finais de semana",
+    "Family",
+    "Dia a Dia",
+    "Recebendo Amigos",
+    "receitas sem crustaceos",
+    "receita sem gluten",
+    "receita sem peixe",
+    "receita sem crustaceos",
+    "receita sem ovo",
+    "sem gluten",
+    "costela suína",
+    "receita do consumidor salgada",
+    "Family Dinners",
+    "receita do consumidor",
+    "sem leite",
+    "zero lactose",
+    "receita rápida",
+    "receita fácil",
+    "delicioso",
+    "fácil",
+    "familia",
+    "De outros",
+    "Batatas",
+    "Carne de porco",
+    "Da panela"
+  ]
 }
diff --git a/tests/test_data/recept.se/recept.json b/tests/test_data/recept.se/recept.json
index 7298663a..c2b0b340 100644
--- a/tests/test_data/recept.se/recept.json
+++ b/tests/test_data/recept.se/recept.json
@@ -41,6 +41,16 @@
   "title": "Chokladbollar – grundrecept",
   "total_time": 30,
   "yields": "25 servings",
+  "keywords": [
+    "laktosfri",
+    "vegetarian",
+    "vegetariansk",
+    "bak & dessert",
+    "bakverk",
+    "dop",
+    "födelsedag",
+    "utan fläsk"
+  ],
   "category": "Bak & dessert",
   "cook_time": 15,
   "nutrients": {
diff --git a/tests/test_data/reciperunner.com/reciperunner.json b/tests/test_data/reciperunner.com/reciperunner.json
index 4e81854d..d65b2e98 100644
--- a/tests/test_data/reciperunner.com/reciperunner.json
+++ b/tests/test_data/reciperunner.com/reciperunner.json
@@ -72,6 +72,14 @@
   "title": "Vanilla and Chocolate Pizzelles",
   "total_time": 30,
   "yields": "70 servings",
+  "keywords": [
+    "cookies",
+    "pizzelles",
+    "christmas",
+    "chocolate",
+    "vanilla",
+    "Italian"
+  ],
   "description": "Delicious round, flat, Italian, waffle cookies. An easy and fun cookie to make this holiday season!",
   "cook_time": 15,
   "prep_time": 15
diff --git a/tests/test_data/recipes.timesofindia.com/timesofindia.json b/tests/test_data/recipes.timesofindia.com/timesofindia.json
index d1c47de7..df519f43 100644
--- a/tests/test_data/recipes.timesofindia.com/timesofindia.json
+++ b/tests/test_data/recipes.timesofindia.com/timesofindia.json
@@ -53,6 +53,19 @@
   "title": "Stuffed Tortellini Recipe",
   "total_time": 35,
   "yields": "4 servings",
+  "keywords": [
+    "Stuffed Tortellini recipe",
+    "Italian",
+    "cook Stuffed Tortellini",
+    "Anniversary",
+    "Date",
+    "Birthday",
+    "Kitty Party",
+    "Game Night",
+    "Buffet",
+    "Pot Luck",
+    "Party"
+  ],
   "ratings_count": 2,
   "description": "Channel your inner Italian soul by indulging in this amazing pasta recipe prepared using tortellini. It's a ring-shaped pasta, which is also known as belly button because of its resemblance to a navel. It's a delicious pasta recipe that you can prepare in the comfort of your home. Stuffed Tortellini is an Italian speciality, and is prepared using roasted cherry tomatoes being coated with seasoned oil and mixing them with the pesto sauce with tortellini pasta. Be it a nice hot appetizer or a comforting weekend meal in your bed, this palatable stuffed tortellini recipe will make you love it in one go. The spicy pesto sauce gives a fiery and sizzling twist to the tortellini, making it even more irresistible for all the foodies. Check out this super-duper scrumptious and quick tortellini recipe which comes out in just half an hour and tastes delicious. If you have your friends coming over to your place in half an hour and you are confused about the special menu, don’t think anything else and just run to the kitchen and start preparing with this indulgence. Give a delicious feast to your friends and family members with the heavenly flavours of this pasta and watch them shower you with loads of compliments and praises. A beyond perfect recipe for when you are enjoying kitty party, birthday party, anniversary party, pot luck or game night. This exotic Italian recipe will bring out the Italiano within you and make all of you go, Mama Mia. (Recipe: Chef Dinesh Pandey, The Green Bistro)",
   "prep_time": 15
diff --git a/tests/test_data/recipetineats.com/recipetineats.json b/tests/test_data/recipetineats.com/recipetineats.json
index fac66b24..bfc5f6b0 100644
--- a/tests/test_data/recipetineats.com/recipetineats.json
+++ b/tests/test_data/recipetineats.com/recipetineats.json
@@ -52,6 +52,10 @@
   "title": "Vietnamese Caramel Pork",
   "total_time": 100,
   "yields": "4 servings",
+  "keywords": [
+    "Vietnamese caramel pork",
+    "Vietnamese pork recipe"
+  ],
   "description": "Recipe VIDEO above. \"Thit Kho To\" - Tender pork in a sweet savoury glaze that has quite an intense flavour. Though made using coconut water as the broth, but it doesn't have a coconut flavour at all! It looks so unimpressive right up until the end when it magically transforms into sticky caramelised pork pieces!",
   "cook_time": 90,
   "cuisine": "Vietnamese",
diff --git a/tests/test_data/redhousespice.com/redhousespice_1.json b/tests/test_data/redhousespice.com/redhousespice_1.json
index 6ab4b9ee..071b309b 100644
--- a/tests/test_data/redhousespice.com/redhousespice_1.json
+++ b/tests/test_data/redhousespice.com/redhousespice_1.json
@@ -71,6 +71,9 @@
   "title": "Easy Char Siu (Chinese BBQ pork, 叉烧)",
   "total_time": 40,
   "yields": "3 servings",
+  "keywords": [
+    "Pork"
+  ],
   "description": "Aromatic, smoky, savoury & a little sweet, Cantonese classic dish Char Siu (Chinese BBQ pork) is one of the tastiest ways to roast pork.",
   "cook_time": 35,
   "cuisine": "Chinese",
diff --git a/tests/test_data/redhousespice.com/redhousespice_2.json b/tests/test_data/redhousespice.com/redhousespice_2.json
index cc93acd2..d0db5f47 100644
--- a/tests/test_data/redhousespice.com/redhousespice_2.json
+++ b/tests/test_data/redhousespice.com/redhousespice_2.json
@@ -57,6 +57,10 @@
   "title": "Smashed Cucumber Salad (拍黄瓜)",
   "total_time": 15,
   "yields": "2 servings",
+  "keywords": [
+    "cucumber salad",
+    "smashed cucumber salad"
+  ],
   "description": "Cracked with force and seasoned with bold flavours, Chinese smashed cucumber salad is a quick, fun and refreshing dish to make.",
   "cuisine": "Chinese",
   "prep_time": 3
diff --git a/tests/test_data/ricette.giallozafferano.it/giallozafferano.json b/tests/test_data/ricette.giallozafferano.it/giallozafferano.json
index 0db2e256..be8d74ec 100644
--- a/tests/test_data/ricette.giallozafferano.it/giallozafferano.json
+++ b/tests/test_data/ricette.giallozafferano.it/giallozafferano.json
@@ -66,6 +66,23 @@
   "title": "Bavarese alle fragole",
   "total_time": 45,
   "yields": "10 servings",
+  "keywords": [
+    "ricette",
+    "ricetta",
+    "cucina",
+    "cucinare",
+    "Bavarese alle fragole",
+    "Latte intero",
+    "Tuorli",
+    "Zucchero",
+    "Baccello di vaniglia",
+    "Limoni",
+    "Sale fino",
+    "Fragole",
+    "Gelatina in fogli",
+    "Panna fresca liquida",
+    "Zucchero a velo"
+  ],
   "description": "Il bavarese alle fragole è dessert al cucchiaio fresco, preparato con crema inglese e coulis di fragole, panna montata, latte e zucchero.",
   "cook_time": 15,
   "prep_time": 30
diff --git a/tests/test_data/ricetteperbimby.it/ricetteperbimby_1.json b/tests/test_data/ricetteperbimby.it/ricetteperbimby_1.json
index 911b493f..81179418 100644
--- a/tests/test_data/ricetteperbimby.it/ricetteperbimby_1.json
+++ b/tests/test_data/ricetteperbimby.it/ricetteperbimby_1.json
@@ -35,6 +35,11 @@
   "cuisine": "Italiana",
   "title": "Crema pasticcera Bimby",
   "total_time": 15,
+  "keywords": [
+    "ricette",
+    "bimby",
+    "Crema pasticcera veloce"
+  ],
   "category": "Dolci e Dessert",
   "cook_time": 10,
   "prep_time": 5,
diff --git a/tests/test_data/ricetteperbimby.it/ricetteperbimby_2.json b/tests/test_data/ricetteperbimby.it/ricetteperbimby_2.json
index 1261e82c..60d040ab 100644
--- a/tests/test_data/ricetteperbimby.it/ricetteperbimby_2.json
+++ b/tests/test_data/ricetteperbimby.it/ricetteperbimby_2.json
@@ -82,6 +82,12 @@
   "title": "Cottage pie",
   "total_time": 90,
   "yields": "4 servings",
+  "keywords": [
+    "Forno",
+    "Dal mondo",
+    "Senza lievito",
+    "Senza uova"
+  ],
   "category": "Secondi Piatti",
   "cook_time": 70,
   "cuisine": "Francese",
diff --git a/tests/test_data/saboresajinomoto.com.br/saboresanjinomoto_1.json b/tests/test_data/saboresajinomoto.com.br/saboresanjinomoto_1.json
index 6e90b7ff..5042252a 100644
--- a/tests/test_data/saboresajinomoto.com.br/saboresanjinomoto_1.json
+++ b/tests/test_data/saboresajinomoto.com.br/saboresanjinomoto_1.json
@@ -37,6 +37,9 @@
   "title": "Purê de batata com frango",
   "total_time": 25,
   "yields": "5 servings",
+  "keywords": [
+    "AJI-NO-MOTO; Purê; Batata; Frango"
+  ],
   "description": "Uma saborosa receita de purÃª de batata com frango que rende 5 porÃ§Ãµes e vocÃª sÃ³ leva 25 minutinhos para preparar. Veja a lista de ingredientes e o modo de preparo.",
   "cook_time": 25,
   "prep_time": 25
diff --git a/tests/test_data/saboresajinomoto.com.br/saboresanjinomoto_2.json b/tests/test_data/saboresajinomoto.com.br/saboresanjinomoto_2.json
index 9fce7f56..1bd7e0ee 100644
--- a/tests/test_data/saboresajinomoto.com.br/saboresanjinomoto_2.json
+++ b/tests/test_data/saboresajinomoto.com.br/saboresanjinomoto_2.json
@@ -50,5 +50,8 @@
   "total_time": 60,
   "yields": "6 servings",
   "cook_time": 60,
-  "prep_time": 60
+  "prep_time": 60,
+  "keywords": [
+    "CREPIOCA; CALDO SAZÓN; BRÓCOLIS; FRANGO"
+  ]
 }
diff --git a/tests/test_data/sallysbakingaddiction.com/sallysbakingaddiction.json b/tests/test_data/sallysbakingaddiction.com/sallysbakingaddiction.json
index ab1cef83..15cb38b4 100644
--- a/tests/test_data/sallysbakingaddiction.com/sallysbakingaddiction.json
+++ b/tests/test_data/sallysbakingaddiction.com/sallysbakingaddiction.json
@@ -76,5 +76,9 @@
   "title": "Rosemary Garlic Pull Apart Bread",
   "total_time": 240,
   "yields": "1 serving",
-  "cooking_method": "Baking"
+  "cooking_method": "Baking",
+  "keywords": [
+    "pull apart bread",
+    "garlic bread"
+  ]
 }
diff --git a/tests/test_data/saltpepperskillet.com/saltpepperskillet.json b/tests/test_data/saltpepperskillet.com/saltpepperskillet.json
index 45044e63..56a2a394 100644
--- a/tests/test_data/saltpepperskillet.com/saltpepperskillet.json
+++ b/tests/test_data/saltpepperskillet.com/saltpepperskillet.json
@@ -60,5 +60,8 @@
   "total_time": 435,
   "yields": "4 servings",
   "cook_time": 240,
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "smoked chicken"
+  ]
 }
diff --git a/tests/test_data/seriouseats.com/seriouseats.json b/tests/test_data/seriouseats.com/seriouseats.json
index 429efdc1..2cbcfd2f 100644
--- a/tests/test_data/seriouseats.com/seriouseats.json
+++ b/tests/test_data/seriouseats.com/seriouseats.json
@@ -54,5 +54,12 @@
   "yields": "20 servings",
   "cook_time": 60,
   "cuisine": "American",
-  "prep_time": 20
+  "prep_time": 20,
+  "keywords": [
+    "Bake",
+    "crust",
+    "holiday",
+    "pastry",
+    "pie"
+  ]
 }
diff --git a/tests/test_data/simply-cookit.com/simplycookit.json b/tests/test_data/simply-cookit.com/simplycookit.json
index fca4c3df..6a3e6aba 100644
--- a/tests/test_data/simply-cookit.com/simplycookit.json
+++ b/tests/test_data/simply-cookit.com/simplycookit.json
@@ -61,5 +61,8 @@
   "title": "Gnocchi mit Zuckerschoten und getrockneten Tomaten in Parmesansauce",
   "total_time": 21,
   "yields": "4 servings",
-  "cook_time": 21
+  "cook_time": 21,
+  "keywords": [
+    "Vegetarisch"
+  ]
 }
diff --git a/tests/test_data/simplyquinoa.com/simplyquinoa.json b/tests/test_data/simplyquinoa.com/simplyquinoa.json
index a73a1e4c..a257636d 100644
--- a/tests/test_data/simplyquinoa.com/simplyquinoa.json
+++ b/tests/test_data/simplyquinoa.com/simplyquinoa.json
@@ -62,6 +62,11 @@
   "title": "The Best Gluten-Free Pancakes",
   "total_time": 20,
   "yields": "14 servings",
+  "keywords": [
+    "fluffy pancakes",
+    "healthy pancakes",
+    "vegan pancakes"
+  ],
   "description": "This is the only gluten-free pancake recipe you'll ever need! Customize it with your favorite add-ins and toppings and enjoy the epic pancake breakfast you deserve!",
   "cook_time": 15,
   "cuisine": "American",
diff --git a/tests/test_data/simplyrecipes.com/simplyrecipes_1.json b/tests/test_data/simplyrecipes.com/simplyrecipes_1.json
index 31c83361..b174739c 100644
--- a/tests/test_data/simplyrecipes.com/simplyrecipes_1.json
+++ b/tests/test_data/simplyrecipes.com/simplyrecipes_1.json
@@ -64,6 +64,19 @@
   "cook_time": 30,
   "prep_time": 15,
   "yields": "8 servings",
+  "keywords": [
+    "1-Pot",
+    "Comfort Food",
+    "Freezer-friendly",
+    "Make-ahead",
+    "Quick and Easy",
+    "American",
+    "Gluten-Free",
+    "Dinner",
+    "Soup",
+    "Favorite Fall",
+    "Favorite Winter"
+  ],
   "description": "One-Pot Chicken and Rice Soup! Throw bone-in chicken, rice, and vegetables together in a pot and simmer until they're done. It's the easiest soup ever, ready in under an hour.",
   "cuisine": "American"
 }
diff --git a/tests/test_data/simplyrecipes.com/simplyrecipes_2.json b/tests/test_data/simplyrecipes.com/simplyrecipes_2.json
index c33a86f5..f69450b7 100644
--- a/tests/test_data/simplyrecipes.com/simplyrecipes_2.json
+++ b/tests/test_data/simplyrecipes.com/simplyrecipes_2.json
@@ -77,6 +77,23 @@
   "cook_time": 30,
   "prep_time": 15,
   "yields": "6 servings",
+  "keywords": [
+    "olive oil",
+    "parsnips",
+    "vegan mayo",
+    "lemon juice",
+    "kelp",
+    "capers",
+    "chives",
+    "celery",
+    "hot dog buns",
+    "vegan butter",
+    "paprika",
+    "parsnip lobster rolls",
+    "sandwiches",
+    "vegan",
+    "cookbook"
+  ],
   "description": "Swap lobster for parsnips and you get a vegan version of the classic lobster roll from Isa Chandra Moskowitz’s book \"Fake Meat: Real Food for Vegan Appetites.\"",
   "cuisine": "American"
 }
diff --git a/tests/test_data/simplywhisked.com/simplywhisked.json b/tests/test_data/simplywhisked.com/simplywhisked.json
index 90f6245b..ca108d02 100644
--- a/tests/test_data/simplywhisked.com/simplywhisked.json
+++ b/tests/test_data/simplywhisked.com/simplywhisked.json
@@ -72,6 +72,15 @@
   "total_time": 45,
   "yields": "8 servings",
   "cooking_method": "Stovetop",
+  "keywords": [
+    "easy",
+    "dairy free",
+    "egg free",
+    "healthy",
+    "chili",
+    "beans",
+    "buffalo"
+  ],
   "description": "This buffalo chicken chili is a hearty, go-to meal that can be ready pretty quickly. The buffalo flavor is the perfect amount of spicy. Make this for your next football game, everyone will love it!",
   "cook_time": 30,
   "cuisine": "American",
diff --git a/tests/test_data/skinnytaste.com/skinnytaste.json b/tests/test_data/skinnytaste.com/skinnytaste.json
index 8e953c70..1838e81a 100644
--- a/tests/test_data/skinnytaste.com/skinnytaste.json
+++ b/tests/test_data/skinnytaste.com/skinnytaste.json
@@ -54,6 +54,13 @@
   "title": "Grilled Chicken with Spinach and Melted Mozzarella",
   "total_time": 17,
   "yields": "6 servings",
+  "keywords": [
+    "chicken breast recipes",
+    "grilled chicken",
+    "grilled chicken breast",
+    "grilled chicken recipe",
+    "Grilled Chicken with Spinach and Melted Mozzarella"
+  ],
   "description": "Grilled chicken topped with sauteed garlicky spinach, mozzarella and roasted peppers – a quick and easy chicken dish your family will love!",
   "cook_time": 15,
   "cuisine": "Italian",
diff --git a/tests/test_data/smulweb.nl/smulweb.json b/tests/test_data/smulweb.nl/smulweb.json
index fc9e180a..b80dd8e2 100644
--- a/tests/test_data/smulweb.nl/smulweb.json
+++ b/tests/test_data/smulweb.nl/smulweb.json
@@ -69,5 +69,12 @@
   "title": "Lekker! Ovenschotel spitskool champignons spekreepjes en prei",
   "total_time": 30,
   "yields": "4 servings",
-  "cook_time": 30
+  "cook_time": 30,
+  "keywords": [
+    "Recept",
+    "Lekker! Ovenschotel spitskool champignons spekreepjes en prei",
+    "Ovenschotel",
+    "Nederlands",
+    "Hartig"
+  ]
 }
diff --git a/tests/test_data/sobors.hu/sobors.json b/tests/test_data/sobors.hu/sobors.json
index 45ed28d3..0c3bba06 100644
--- a/tests/test_data/sobors.hu/sobors.json
+++ b/tests/test_data/sobors.hu/sobors.json
@@ -52,5 +52,15 @@
   "site_name": null,
   "title": "Piskótatekercs párizsi krémmel",
   "total_time": 105,
-  "yields": "6 servings"
+  "yields": "6 servings",
+  "keywords": [
+    "süti",
+    "sütemény",
+    "piskóta",
+    "piskótatekercs",
+    "csokoládékrém",
+    "párizsi krém",
+    "piskótarolád",
+    "piskótatekercs párizsi krémmel"
+  ]
 }
diff --git a/tests/test_data/spendwithpennies.com/spendwithpennies.json b/tests/test_data/spendwithpennies.com/spendwithpennies.json
index 5a5a7249..ecc4cb9e 100644
--- a/tests/test_data/spendwithpennies.com/spendwithpennies.json
+++ b/tests/test_data/spendwithpennies.com/spendwithpennies.json
@@ -62,6 +62,13 @@
   "title": "Gooey Chocolate Pudding Cake",
   "total_time": 35,
   "yields": "6 servings",
+  "keywords": [
+    "best pudding cake",
+    "chocolate lava cake",
+    "Chocolate Pudding Cake",
+    "easy chocolate pudding cake",
+    "pudding cake"
+  ],
   "description": "This Chocolate Pudding Cake is a very simple, rich chocolate dessert that comes together in just one dish!",
   "cook_time": 30,
   "cuisine": "American",
diff --git a/tests/test_data/staysnatched.com/staysnatched.json b/tests/test_data/staysnatched.com/staysnatched.json
index 0c358944..30135d37 100644
--- a/tests/test_data/staysnatched.com/staysnatched.json
+++ b/tests/test_data/staysnatched.com/staysnatched.json
@@ -76,5 +76,10 @@
   "total_time": 210,
   "yields": "7 servings",
   "cook_time": 180,
-  "prep_time": 30
+  "prep_time": 30,
+  "keywords": [
+    "chili mac and cheese",
+    "Crockpot Chili Mac",
+    "slow cooker chili mac"
+  ]
 }
diff --git a/tests/test_data/steamykitchen.com/steamykitchen_1.json b/tests/test_data/steamykitchen.com/steamykitchen_1.json
index d7691a0c..cf7f9936 100644
--- a/tests/test_data/steamykitchen.com/steamykitchen_1.json
+++ b/tests/test_data/steamykitchen.com/steamykitchen_1.json
@@ -72,6 +72,11 @@
   "title": "Instant Pot Vietnamese Chicken Pho",
   "total_time": 40,
   "yields": "4 servings",
+  "keywords": [
+    "instant pot pho",
+    "pho recipe",
+    "vietnamese pho"
+  ],
   "description": "This Vietnamese Chicken Pho is the definition of a cozy and comforting meal. In less than 1 hour you will have a nourishing bowl of warm noodle soup!",
   "cook_time": 30,
   "cuisine": "Vietnamese",
diff --git a/tests/test_data/sweetcsdesigns.com/sweetcsdesigns.json b/tests/test_data/sweetcsdesigns.com/sweetcsdesigns.json
index e069a971..34240982 100644
--- a/tests/test_data/sweetcsdesigns.com/sweetcsdesigns.json
+++ b/tests/test_data/sweetcsdesigns.com/sweetcsdesigns.json
@@ -54,6 +54,15 @@
   "title": "The Best Easy Air Fryer French Fries",
   "total_time": 85,
   "yields": "6 servings",
+  "keywords": [
+    "side dish",
+    "potatoes",
+    "instant pot french fries",
+    "air fryer french fries",
+    "easy french fries",
+    "healthy french fries",
+    "homemade french fries"
+  ],
   "description": "The Best Easy Air Fryer French Fries Recipe - delicious, crispy and crunchy french fries that taste just like your favorite restaurant - but a healthier french fry you can feel good about serving your family.",
   "cook_time": 15,
   "cuisine": "air fryer",
diff --git a/tests/test_data/sweetpeasandsaffron.com/sweetpeasandsaffron.json b/tests/test_data/sweetpeasandsaffron.com/sweetpeasandsaffron.json
index 2d752f74..f2ba0ad7 100644
--- a/tests/test_data/sweetpeasandsaffron.com/sweetpeasandsaffron.json
+++ b/tests/test_data/sweetpeasandsaffron.com/sweetpeasandsaffron.json
@@ -111,6 +111,14 @@
   "title": "7 Healthy Steel Cut Oats Recipes",
   "total_time": 25,
   "yields": "4 servings",
+  "keywords": [
+    "dairy-free",
+    "freezer",
+    "gluten-free",
+    "meal prep",
+    "oatmeal",
+    "vegan"
+  ],
   "description": "7 healthy steel cut oats recipes that are easy to make ahead and keep in the fridge or freezer for easy breakfasts. Plus instructions on how to cook steel cut oats in the Instant Pot, slow cooker or on the stovetop.",
   "cook_time": 15,
   "cuisine": "American",
diff --git a/tests/test_data/taste.com.au/tasteau_1.json b/tests/test_data/taste.com.au/tasteau_1.json
index d09c8b5d..86f90967 100644
--- a/tests/test_data/taste.com.au/tasteau_1.json
+++ b/tests/test_data/taste.com.au/tasteau_1.json
@@ -64,5 +64,26 @@
   "total_time": 70,
   "yields": "4 servings",
   "cook_time": 55,
-  "prep_time": 15
+  "prep_time": 15,
+  "keywords": [
+    "cheese",
+    "chicken",
+    "chilli",
+    "egg allergy",
+    "feta",
+    "garlic",
+    "gluten allergy",
+    "lactose allergy",
+    "milk allergy",
+    "onion",
+    "pasta",
+    "peanut allergy",
+    "spicy",
+    "tomato",
+    "wheat allergy",
+    "mexican",
+    "easy",
+    "dinner",
+    "family friendly"
+  ]
 }
diff --git a/tests/test_data/taste.com.au/tasteau_2.json b/tests/test_data/taste.com.au/tasteau_2.json
index a1572dfc..7d4f6757 100644
--- a/tests/test_data/taste.com.au/tasteau_2.json
+++ b/tests/test_data/taste.com.au/tasteau_2.json
@@ -54,5 +54,32 @@
   "title": "Vegetarian lasagne roll recipe",
   "total_time": 125,
   "cook_time": 65,
-  "prep_time": 60
+  "prep_time": 60,
+  "keywords": [
+    "cheese",
+    "egg allergy",
+    "garlic",
+    "gluten allergy",
+    "lactose allergy",
+    "lentil",
+    "milk allergy",
+    "onion",
+    "pasta",
+    "peanut allergy",
+    "pumpkin",
+    "sesame allergy",
+    "tomato",
+    "tree nut allergy",
+    "wheat allergy",
+    "zucchini",
+    "australian",
+    "dinner",
+    "main",
+    "entertaining",
+    "family friendly",
+    "weeknight",
+    "vegetarian",
+    "savoury",
+    "easy"
+  ]
 }
diff --git a/tests/test_data/tastesbetterfromscratch.com/tastesbetterfromscratch.json b/tests/test_data/tastesbetterfromscratch.com/tastesbetterfromscratch.json
index 20f90dae..8dc6da3d 100644
--- a/tests/test_data/tastesbetterfromscratch.com/tastesbetterfromscratch.json
+++ b/tests/test_data/tastesbetterfromscratch.com/tastesbetterfromscratch.json
@@ -63,6 +63,13 @@
   "title": "How to make Pulled Pork",
   "total_time": 320,
   "yields": "6 servings",
+  "keywords": [
+    "how to make pulled pork",
+    "pulled pork",
+    "pulled pork recipe",
+    "pulled pork recipe oven",
+    "slow cooker pulled pork"
+  ],
   "description": "Tender, juicy, and perfectly cooked Pulled Pork you can make in the oven, slow cooker or instant pot.",
   "cook_time": 300,
   "cuisine": "American",
diff --git a/tests/test_data/tastesoflizzyt.com/tastesoflizzyt.json b/tests/test_data/tastesoflizzyt.com/tastesoflizzyt.json
index b0fa6b0f..a7dcf6ea 100644
--- a/tests/test_data/tastesoflizzyt.com/tastesoflizzyt.json
+++ b/tests/test_data/tastesoflizzyt.com/tastesoflizzyt.json
@@ -62,6 +62,13 @@
   "title": "Soft Baked Molasses Cookies",
   "total_time": 27,
   "yields": "60 servings",
+  "keywords": [
+    "christmas cookies",
+    "cookies without eggs",
+    "easy cookies",
+    "egg free cookies",
+    "gingerbread cookies"
+  ],
   "description": "Molasses Cookies have the taste of gingerbread cookies, but are soft and thick. Roll the dough balls in sugar for the perfect sweetness!",
   "cook_time": 8,
   "cuisine": "American",
diff --git a/tests/test_data/tasty.co/tasty.json b/tests/test_data/tasty.co/tasty.json
index 3ebd985a..2b2585b9 100644
--- a/tests/test_data/tasty.co/tasty.json
+++ b/tests/test_data/tasty.co/tasty.json
@@ -73,6 +73,27 @@
   "site_name": "tasty.co",
   "title": "Red Wine-Braised Short Ribs With Cashew Cauliflower Mash Recipe by Tasty",
   "yields": "4 servings",
+  "keywords": [
+    "braised short ribs",
+    "cashew cauliflower mash",
+    "cauliflower mash",
+    "creamy cauliflower mash",
+    "dinner recipe",
+    "gluten free",
+    "gluten free recipe",
+    "goodful - recipe",
+    "healthy - goodful",
+    "healthy recipe",
+    "low carb cauliflower mash",
+    "low carb mash",
+    "low-carb",
+    "red wine",
+    "red wine braised short ribs",
+    "red wine braiser recipe",
+    "short ribs",
+    "short ribs recipe",
+    "tasty - recipe"
+  ],
   "description": "These fall-off-the-bone tender short ribs are slow-cooked in a flavorful red wine sauce and served with a creamy cashew cauliflower mash. It's a rich and satisfying dish that's perfect for a cozy night in.",
   "cuisine": "North American"
 }
diff --git a/tests/test_data/theclevercarrot.com/theclevercarrot_1.json b/tests/test_data/theclevercarrot.com/theclevercarrot_1.json
index e0fff18f..41fe998f 100644
--- a/tests/test_data/theclevercarrot.com/theclevercarrot_1.json
+++ b/tests/test_data/theclevercarrot.com/theclevercarrot_1.json
@@ -107,6 +107,15 @@
   "total_time": 930,
   "yields": "8 servings",
   "cooking_method": "Oven-Baked",
+  "keywords": [
+    "sourdough",
+    "sourdough recipes",
+    "sourdough cinnamon rolls",
+    "cinnamon rolls",
+    "best sourdough cinnamon rolls",
+    "sourdough bread",
+    "sourdough starter"
+  ],
   "description": "These soft, overnight sourdough cinnamon rolls are the perfect weekend or holiday treat! Made with a luscious sweet dough and a not-too-sweet cinnamon filing, they are guaranteed to be a huge hit.",
   "cook_time": 30,
   "cuisine": "American",
diff --git a/tests/test_data/theexpertguides.com/theexpertguides.json b/tests/test_data/theexpertguides.com/theexpertguides.json
index 66db9474..5f08d9d6 100644
--- a/tests/test_data/theexpertguides.com/theexpertguides.json
+++ b/tests/test_data/theexpertguides.com/theexpertguides.json
@@ -51,5 +51,10 @@
   "site_name": "theexpertguides",
   "title": "Coconut Milk Pasta Sauce Recipe",
   "total_time": 28,
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "coconut milk pasta",
+    "vegan coconut milk pasta sauce recipe",
+    "vegan pasta sauce"
+  ]
 }
diff --git a/tests/test_data/thekitchencommunity.org/thekitchencommunity.json b/tests/test_data/thekitchencommunity.org/thekitchencommunity.json
index 368980f0..a7ce9b92 100644
--- a/tests/test_data/thekitchencommunity.org/thekitchencommunity.json
+++ b/tests/test_data/thekitchencommunity.org/thekitchencommunity.json
@@ -57,5 +57,8 @@
   "site_name": "The Kitchen Community",
   "title": "Our BEST Crock Pot Mac and Cheese Recipe",
   "total_time": 125,
-  "yields": "8 servings"
+  "yields": "8 servings",
+  "keywords": [
+    "crockpot mac and cheese"
+  ]
 }
diff --git a/tests/test_data/thekitchenmagpie.com/thekitchenmagpie.json b/tests/test_data/thekitchenmagpie.com/thekitchenmagpie.json
index 29662152..b0bf2d57 100644
--- a/tests/test_data/thekitchenmagpie.com/thekitchenmagpie.json
+++ b/tests/test_data/thekitchenmagpie.com/thekitchenmagpie.json
@@ -60,6 +60,9 @@
   "title": "Salmon Loaf",
   "total_time": 70,
   "yields": "8 servings",
+  "keywords": [
+    "salmon loaf"
+  ],
   "description": "Skip the salmon cakes and make this great salmon loaf for dinner instead!",
   "cook_time": 60,
   "cuisine": "American",
diff --git a/tests/test_data/thekitchn.com/thekitchn.json b/tests/test_data/thekitchn.com/thekitchn.json
index 1e8043e7..58ca2dc9 100644
--- a/tests/test_data/thekitchn.com/thekitchn.json
+++ b/tests/test_data/thekitchn.com/thekitchn.json
@@ -76,6 +76,39 @@
   "title": "How To Make the Best Beef and Cheese Manicotti",
   "total_time": 65,
   "yields": "8 servings",
+  "keywords": [
+    "Beef",
+    "Casserole",
+    "children",
+    "dairy",
+    "dinner",
+    "How To",
+    "Ingredient",
+    "italian",
+    "Main Dish",
+    "Meat",
+    "pasta",
+    "Pasta & Noodles",
+    "recipe",
+    "european",
+    "Eggs",
+    "Dish Types",
+    "team:food",
+    "purpose:facebook",
+    "purpose:flipboard",
+    "purpose:instagram",
+    "purpose:pinterest",
+    "purpose:search",
+    "platform:search",
+    "platform:social",
+    "course:main dish",
+    "cuisine:europe",
+    "cuisine:italian",
+    "mainingredients:pasta",
+    "dishtype:casserole",
+    "dishtype:pasta dish",
+    "dishtype:meat dish"
+  ],
   "description": "Stuffed with fragrant garlicky ricotta, Parmesan, and savory beef, this baked manicotti is creamy, cheesy, meaty, and the perfect cozy weekend dinner.",
   "cook_time": 40,
   "cuisine": "Europe,Italian",
diff --git a/tests/test_data/themagicalslowcooker.com/themagicalslowcooker_1.json b/tests/test_data/themagicalslowcooker.com/themagicalslowcooker_1.json
index 9e060490..d4917fa2 100644
--- a/tests/test_data/themagicalslowcooker.com/themagicalslowcooker_1.json
+++ b/tests/test_data/themagicalslowcooker.com/themagicalslowcooker_1.json
@@ -55,5 +55,8 @@
   "total_time": 245,
   "yields": "6 servings",
   "cook_time": 240,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "ground beef"
+  ]
 }
diff --git a/tests/test_data/themagicalslowcooker.com/themagicalslowcooker_2.json b/tests/test_data/themagicalslowcooker.com/themagicalslowcooker_2.json
index 29a311ef..1eb589e2 100644
--- a/tests/test_data/themagicalslowcooker.com/themagicalslowcooker_2.json
+++ b/tests/test_data/themagicalslowcooker.com/themagicalslowcooker_2.json
@@ -92,5 +92,8 @@
   "total_time": 510,
   "yields": "6 servings",
   "cook_time": 480,
-  "prep_time": 30
+  "prep_time": 30,
+  "keywords": [
+    "pork pot roast"
+  ]
 }
diff --git a/tests/test_data/themodernproper.com/themodernproper.json b/tests/test_data/themodernproper.com/themodernproper.json
index 2a477f6b..66c7a636 100644
--- a/tests/test_data/themodernproper.com/themodernproper.json
+++ b/tests/test_data/themodernproper.com/themodernproper.json
@@ -92,5 +92,10 @@
   "total_time": 60,
   "yields": "8 servings",
   "cook_time": 40,
-  "prep_time": 20
+  "prep_time": 20,
+  "keywords": [
+    "swedish meatballs",
+    "fall recipe",
+    "winter recipe"
+  ]
 }
diff --git a/tests/test_data/thepioneerwoman.com/thepioneerwoman_1.json b/tests/test_data/thepioneerwoman.com/thepioneerwoman_1.json
index 9affa488..c4ae3b26 100644
--- a/tests/test_data/thepioneerwoman.com/thepioneerwoman_1.json
+++ b/tests/test_data/thepioneerwoman.com/thepioneerwoman_1.json
@@ -44,5 +44,10 @@
   "site_name": "The Pioneer Woman",
   "title": "Patty Melts",
   "total_time": 35,
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "Recipes",
+    "Cooking",
+    "Food"
+  ]
 }
diff --git a/tests/test_data/thepioneerwoman.com/thepioneerwoman_2.json b/tests/test_data/thepioneerwoman.com/thepioneerwoman_2.json
index 8592d48b..108b340a 100644
--- a/tests/test_data/thepioneerwoman.com/thepioneerwoman_2.json
+++ b/tests/test_data/thepioneerwoman.com/thepioneerwoman_2.json
@@ -72,5 +72,10 @@
   "site_name": "The Pioneer Woman",
   "title": "Pumpkin Sheet Cake With Cream Cheese Frosting",
   "total_time": 40,
-  "yields": "18 servings"
+  "yields": "18 servings",
+  "keywords": [
+    "Recipes",
+    "Cooking",
+    "Food"
+  ]
 }
diff --git a/tests/test_data/therecipecritic.com/therecipecritic.json b/tests/test_data/therecipecritic.com/therecipecritic.json
index b994f4b9..22c08fca 100644
--- a/tests/test_data/therecipecritic.com/therecipecritic.json
+++ b/tests/test_data/therecipecritic.com/therecipecritic.json
@@ -70,5 +70,9 @@
   "total_time": 25,
   "yields": "8 servings",
   "cook_time": 20,
-  "prep_time": 5
+  "prep_time": 5,
+  "keywords": [
+    "burrata appetizer",
+    "tomato and burrata appetizer"
+  ]
 }
diff --git a/tests/test_data/thespruceeats.com/thespruceeats_1.json b/tests/test_data/thespruceeats.com/thespruceeats_1.json
index 380744d4..433e400b 100644
--- a/tests/test_data/thespruceeats.com/thespruceeats_1.json
+++ b/tests/test_data/thespruceeats.com/thespruceeats_1.json
@@ -58,6 +58,10 @@
   "title": "Bell Pepper Sandwich Recipe",
   "total_time": 15,
   "yields": "1 serving",
+  "keywords": [
+    "sandwich",
+    "bell pepper"
+  ],
   "description": "Cut the carbs with this tasty bell pepper sandwich. Sweet bell pepper stands in for bread, giving the sandwich a satisfying crunch and amazing flavor!",
   "cuisine": "American",
   "prep_time": 15
diff --git a/tests/test_data/thespruceeats.com/thespruceeats_2.json b/tests/test_data/thespruceeats.com/thespruceeats_2.json
index f7615895..c6671992 100644
--- a/tests/test_data/thespruceeats.com/thespruceeats_2.json
+++ b/tests/test_data/thespruceeats.com/thespruceeats_2.json
@@ -82,6 +82,10 @@
   "title": "Peppermint Swirl Brownies",
   "total_time": 45,
   "yields": "9 servings",
+  "keywords": [
+    "peppermint",
+    "brownies"
+  ],
   "description": "A deeply chocolate-y, fudgy brownie with a bright pink swirl of peppermint deliciousness. Gorgeous to look at and scrumptious to eat.",
   "cook_time": 30,
   "cuisine": "American",
diff --git a/tests/test_data/thewoksoflife.com/thewoksoflife.json b/tests/test_data/thewoksoflife.com/thewoksoflife.json
index ccd40786..e57589c6 100644
--- a/tests/test_data/thewoksoflife.com/thewoksoflife.json
+++ b/tests/test_data/thewoksoflife.com/thewoksoflife.json
@@ -54,5 +54,8 @@
   "yields": "12 servings",
   "cook_time": 30,
   "cuisine": "Chinese",
-  "prep_time": 240
+  "prep_time": 240,
+  "keywords": [
+    "mantou"
+  ]
 }
diff --git a/tests/test_data/thinlicious.com/thinlicious.json b/tests/test_data/thinlicious.com/thinlicious.json
index 1877d0ad..a63935c7 100644
--- a/tests/test_data/thinlicious.com/thinlicious.json
+++ b/tests/test_data/thinlicious.com/thinlicious.json
@@ -60,6 +60,10 @@
   "title": "Easy Keto Hamburger Buns Recipe (That Don't Fall Apart)",
   "total_time": 17,
   "yields": "4 servings",
+  "keywords": [
+    "keto bread rolls",
+    "keto hamburger buns"
+  ],
   "description": "Bring the bun back to your burger with these easy keto hamburger buns that can bake while you grill.",
   "cook_time": 12,
   "cuisine": "Gluten Free,Grain free,Keto,LCHF,Low Carb,No Sugars,Wheat Free",
diff --git a/tests/test_data/tidymom.net/tidymom_2.json b/tests/test_data/tidymom.net/tidymom_2.json
index f5236811..343629eb 100644
--- a/tests/test_data/tidymom.net/tidymom_2.json
+++ b/tests/test_data/tidymom.net/tidymom_2.json
@@ -125,5 +125,17 @@
   "total_time": 205,
   "yields": "9 servings",
   "cook_time": 25,
-  "prep_time": 60
+  "prep_time": 60,
+  "keywords": [
+    "birthday cake",
+    "buttercream",
+    "buttermilk",
+    "cake",
+    "cake decorating",
+    "Chocolate",
+    "cinnamon",
+    "cream cheese",
+    "cream cheese frosting",
+    "red velvet"
+  ]
 }
diff --git a/tests/test_data/tine.no/tineno.json b/tests/test_data/tine.no/tineno.json
index 5ba8e299..bbd3f808 100644
--- a/tests/test_data/tine.no/tineno.json
+++ b/tests/test_data/tine.no/tineno.json
@@ -71,5 +71,8 @@
   "site_name": "TINE",
   "title": "Rask kylling tikka masala",
   "total_time": 30,
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "kylling"
+  ]
 }
diff --git a/tests/test_data/tudogostoso.com.br/tudogostoso.json b/tests/test_data/tudogostoso.com.br/tudogostoso.json
index 03c56fcc..12b88886 100644
--- a/tests/test_data/tudogostoso.com.br/tudogostoso.json
+++ b/tests/test_data/tudogostoso.com.br/tudogostoso.json
@@ -35,6 +35,9 @@
   "title": "Caipirinha - Original",
   "total_time": 5,
   "yields": "1 serving",
+  "keywords": [
+    "Receita de Caipirinha - Original"
+  ],
   "description": "Descubra agora o segredo da caipirinha original, uma receita cl&aacute;ssica que vai transportar voc&ecirc; para um sabor aut&ecirc;ntico do Brasil! Com apenas tr&ecirc;s ingredientes e alguns passos simples, voc&ecirc; poder&aacute; preparar essa deliciosa bebida refrescante em minutos. O equil&iacute;brio perfeito entre lim&atilde;o, a&ccedil;&uacute;car e cacha&ccedil;a ir&aacute; surpreender seu paladar.",
   "prep_time": 5
 }
diff --git a/tests/test_data/twopeasandtheirpod.com/twopeasandtheirpod_1.json b/tests/test_data/twopeasandtheirpod.com/twopeasandtheirpod_1.json
index 25ba8729..80eb1cca 100644
--- a/tests/test_data/twopeasandtheirpod.com/twopeasandtheirpod_1.json
+++ b/tests/test_data/twopeasandtheirpod.com/twopeasandtheirpod_1.json
@@ -78,6 +78,9 @@
   "title": "Chicken Taquitos",
   "total_time": 40,
   "yields": "20 servings",
+  "keywords": [
+    "taquitos"
+  ],
   "description": "These easy Baked Chicken Taquitos are stuffed with chicken and cheese and make a great appetizer or meal. These homemade taquitos are a family favorite! Plus, learn how to make taquitos you can freeze for later!",
   "cook_time": 25,
   "cuisine": "Mexican",
diff --git a/tests/test_data/twopeasandtheirpod.com/twopeasandtheirpod_2.json b/tests/test_data/twopeasandtheirpod.com/twopeasandtheirpod_2.json
index b5f9812f..b4faf53c 100644
--- a/tests/test_data/twopeasandtheirpod.com/twopeasandtheirpod_2.json
+++ b/tests/test_data/twopeasandtheirpod.com/twopeasandtheirpod_2.json
@@ -57,6 +57,9 @@
   "title": "Mango Salad",
   "total_time": 10,
   "yields": "6 servings",
+  "keywords": [
+    "mango"
+  ],
   "description": "Mango Salad- ripe juicy mangoes with jicama, cucumber, red pepper, mint, cilantro, fresh lime juice, and a sprinkle of Tajin. This refreshing simple salad is perfect for summertime or anytime!",
   "cuisine": "American",
   "prep_time": 10,
diff --git a/tests/test_data/uitpaulineskeuken.nl/uitpaulineskeukennl_1.json b/tests/test_data/uitpaulineskeuken.nl/uitpaulineskeukennl_1.json
index 011affb7..7c248348 100644
--- a/tests/test_data/uitpaulineskeuken.nl/uitpaulineskeukennl_1.json
+++ b/tests/test_data/uitpaulineskeuken.nl/uitpaulineskeukennl_1.json
@@ -43,5 +43,20 @@
   "yields": "4 servings",
   "cook_time": 10,
   "prep_time": 5,
-  "ratings_count": 2
+  "ratings_count": 2,
+  "keywords": [
+    "Makkelijke recepten",
+    "Pasta recepten",
+    "Snelle recepten",
+    "Ravioli",
+    "Italiaanse recepten",
+    "Notenvrije recepten",
+    "Kerst",
+    "Vegetarische recepten",
+    "Herfst recepten",
+    "Lente recepten",
+    "Winter recepten",
+    "Zomer recepten",
+    "Hoofdgerecht"
+  ]
 }
diff --git a/tests/test_data/uitpaulineskeuken.nl/uitpaulineskeukennl_2.json b/tests/test_data/uitpaulineskeuken.nl/uitpaulineskeukennl_2.json
index b5e8ca33..e6eeccbf 100644
--- a/tests/test_data/uitpaulineskeuken.nl/uitpaulineskeukennl_2.json
+++ b/tests/test_data/uitpaulineskeuken.nl/uitpaulineskeukennl_2.json
@@ -72,5 +72,13 @@
   "yields": "12 servings",
   "cook_time": 40,
   "prep_time": 15,
-  "ratings_count": 1
+  "ratings_count": 1,
+  "keywords": [
+    "Cake recepten",
+    "High tea",
+    "Koekjes recepten",
+    "Chocolade",
+    "Verjaardag",
+    "Bakrecepten"
+  ]
 }
diff --git a/tests/test_data/vanillaandbean.com/vanillaandbean_2.json b/tests/test_data/vanillaandbean.com/vanillaandbean_2.json
index 66154ad7..1d6b4b44 100644
--- a/tests/test_data/vanillaandbean.com/vanillaandbean_2.json
+++ b/tests/test_data/vanillaandbean.com/vanillaandbean_2.json
@@ -62,6 +62,11 @@
   "title": "Healthy Almond Orange Oat Waffles Recipe",
   "total_time": 40,
   "yields": "9 servings",
+  "keywords": [
+    "Healthy Waffles",
+    "Oat Waffles",
+    "Vegan Gluten Free Waffles"
+  ],
   "description": "The easiest healthy waffle recipe bursting with citrus! Made with almond and oat flour with a hint of orange zest, these healthy almond orange oat waffles are freezer friendly, vegan and easily gluten free. *Update* - a few makers have had trouble with these waffles sticking to their waffle iron. Note this recipe was tested with a waffle iron that has a non stick surface where no added oil is necessary. See note below for more information.",
   "cook_time": 40,
   "cuisine": "American,Vegan",
diff --git a/tests/test_data/vegetarbloggen.no/vegetarbloggen.json b/tests/test_data/vegetarbloggen.no/vegetarbloggen.json
index a7fe68dc..132c6f7d 100644
--- a/tests/test_data/vegetarbloggen.no/vegetarbloggen.json
+++ b/tests/test_data/vegetarbloggen.no/vegetarbloggen.json
@@ -47,5 +47,9 @@
   "total_time": 30,
   "yields": "2 servings",
   "cook_time": 20,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "gresskar",
+    "pasta"
+  ]
 }
diff --git a/tests/test_data/vegrecipesofindia.com/vegrecipesofindia.json b/tests/test_data/vegrecipesofindia.com/vegrecipesofindia.json
index 184e5f86..b6ddb80f 100644
--- a/tests/test_data/vegrecipesofindia.com/vegrecipesofindia.json
+++ b/tests/test_data/vegrecipesofindia.com/vegrecipesofindia.json
@@ -91,6 +91,10 @@
   "title": "Sarson ka Saag Recipe (Authentic Punjabi Style)",
   "total_time": 240,
   "yields": "8 servings",
+  "keywords": [
+    "Sarson da Saag",
+    "Sarson ka Saag"
+  ],
   "description": "Peppery, pungent and healthy, Punjabi Sarson ka Saag (or Sarson da Saag) is a favorite meal during the cold North Indian winters, especially when paired with Makki Ki Roti. Making this authentic dish is not difficult, but it does take some time.",
   "cook_time": 120,
   "cuisine": "North Indian,Punjabi",
diff --git a/tests/test_data/watchwhatueat.com/watchwhatueat.json b/tests/test_data/watchwhatueat.com/watchwhatueat.json
index 4f05965c..ae044806 100644
--- a/tests/test_data/watchwhatueat.com/watchwhatueat.json
+++ b/tests/test_data/watchwhatueat.com/watchwhatueat.json
@@ -71,6 +71,10 @@
   "title": "Healthy Instant Pot Cauliflower With Gravy",
   "total_time": 25,
   "yields": "4 servings",
+  "keywords": [
+    "instant pot cauliflower",
+    "instant pot whole cauliflower"
+  ],
   "description": "Whole cauliflower head flavored with fresh garlic and herbs and cooked in the pressure cooker. Also, learn to make delicious gravy that compliments this steamed whole cauliflower dish.",
   "cook_time": 15,
   "cuisine": "American Inspired",
diff --git a/tests/test_data/wearenotmartha.com/wearenotmartha_1.json b/tests/test_data/wearenotmartha.com/wearenotmartha_1.json
index cc0764db..51713479 100644
--- a/tests/test_data/wearenotmartha.com/wearenotmartha_1.json
+++ b/tests/test_data/wearenotmartha.com/wearenotmartha_1.json
@@ -45,5 +45,9 @@
   "yields": "2 servings",
   "cook_time": 10,
   "prep_time": 10,
-  "ratings_count": 1
+  "ratings_count": 1,
+  "keywords": [
+    "Grilled Cheese Recipes",
+    "Starbucks Copycat"
+  ]
 }
diff --git a/tests/test_data/wearenotmartha.com/wearenotmartha_2.json b/tests/test_data/wearenotmartha.com/wearenotmartha_2.json
index a43a0192..c57bee1a 100644
--- a/tests/test_data/wearenotmartha.com/wearenotmartha_2.json
+++ b/tests/test_data/wearenotmartha.com/wearenotmartha_2.json
@@ -67,5 +67,11 @@
   "total_time": 15,
   "yields": "1 serving",
   "prep_time": 15,
-  "ratings_count": 2
+  "ratings_count": 2,
+  "keywords": [
+    "Coffee Drinks",
+    "Iced Coffee",
+    "Starbucks Copycat",
+    "Starbucks Drinks"
+  ]
 }
diff --git a/tests/test_data/weightwatchers.com/weightwatcherspublic.json b/tests/test_data/weightwatchers.com/weightwatcherspublic.json
index 56a8d0dd..f3b78c64 100644
--- a/tests/test_data/weightwatchers.com/weightwatcherspublic.json
+++ b/tests/test_data/weightwatchers.com/weightwatcherspublic.json
@@ -60,5 +60,14 @@
   "site_name": null,
   "title": "Kartoffelgulasch",
   "total_time": 40,
-  "yields": "4 servings"
+  "yields": "4 servings",
+  "keywords": [
+    "Ohne Meeresfrüchte",
+    "Ohne Fisch",
+    "Fleisch",
+    "Kartoffeln",
+    "Kochen & Braten",
+    "Aus einem Topf",
+    "Eintöpfe & Suppen"
+  ]
 }
diff --git a/tests/test_data/wellplated.com/wellplated.json b/tests/test_data/wellplated.com/wellplated.json
index c6139bf9..a42b0e65 100644
--- a/tests/test_data/wellplated.com/wellplated.json
+++ b/tests/test_data/wellplated.com/wellplated.json
@@ -73,5 +73,26 @@
   "total_time": 25,
   "yields": "6 servings",
   "cook_time": 15,
-  "prep_time": 10
+  "prep_time": 10,
+  "keywords": [
+    "Asian fried rice recipe",
+    "authentic homemade fried rice",
+    "Chinese egg fried rice",
+    "chinese fried rice",
+    "chinese fried rice restaurant style",
+    "easy homemade fried rice recipe",
+    "egg fried rice",
+    "homemade egg fried rice like chinese takeaway",
+    "homemade fried rice in wok",
+    "homemade fried rice with egg",
+    "homemade fried rice with leftover rice",
+    "homemade fried rice without sesame oil",
+    "homemade healthy fried rice",
+    "how to make fried rice with egg",
+    "Plain fried rice recipe",
+    "recipe homemade fried rice",
+    "simple fried rice recipe",
+    "simple homemade fried rice",
+    "vegetable fried rice"
+  ]
 }
diff --git a/tests/test_data/whatsgabycooking.com/whatsgabycooking.json b/tests/test_data/whatsgabycooking.com/whatsgabycooking.json
index 1fcedea0..23cdf21a 100644
--- a/tests/test_data/whatsgabycooking.com/whatsgabycooking.json
+++ b/tests/test_data/whatsgabycooking.com/whatsgabycooking.json
@@ -59,6 +59,10 @@
   "title": "Vegetarian Quinoa Bake",
   "total_time": 45,
   "yields": "6 servings",
+  "keywords": [
+    "quinoa bake",
+    "vegetarian quinoa bake"
+  ],
   "description": "This super easy Vegetarian Quinoa Bake is a one pot wonder. It’s prepped and baked in a skillet, loaded with various ad-ins and topped it with cheese! Get ready for your new favorite dinner.",
   "cook_time": 40,
   "cuisine": "Tex Mex",
diff --git a/tests/test_data/williams-sonoma.com/williamssonoma_1.json b/tests/test_data/williams-sonoma.com/williamssonoma_1.json
index 1a4ff868..307ce0e9 100644
--- a/tests/test_data/williams-sonoma.com/williamssonoma_1.json
+++ b/tests/test_data/williams-sonoma.com/williamssonoma_1.json
@@ -36,6 +36,9 @@
   "title": "Bacon Fat Hash Browns",
   "total_time": 40,
   "yields": "4 servings",
+  "keywords": [
+    "our catalogx spr1 23"
+  ],
   "cook_time": 15,
   "description": "Award-winning chef Gavin Kaysen, who is based in Minneapolis, makes these hash browns a lot at home, using the leftover bacon fat he saves in a jar in his refrigerator. If you make your hash browns from frozen potatoes, he says, your life will change once you switch to freshly grated ones. The chef explains that it&rsquo;s impossible to get all the water out of frozen potatoes, which makes it very difficult to get your hash browns nice and crispy. His technique also uses some of the starch that gets extracted when you wring the water out of the shredded potatoes, which helps bind them together into cakes. These hash browns are the perfect side dish to serve for Easter brunch. Note: Kaysen&rsquo;s recipe calls for making a few individual hash browns, but for an impressive holiday presentation, simply form the potatoes into one large hash brown cake and continue cooking as directed.",
   "prep_time": 25
diff --git a/tests/test_data/yemek.com/yemek.json b/tests/test_data/yemek.com/yemek.json
index ca10fdc5..3b82b568 100644
--- a/tests/test_data/yemek.com/yemek.json
+++ b/tests/test_data/yemek.com/yemek.json
@@ -68,6 +68,13 @@
   "title": "Köri Soslu Tavuklu Patates Topları",
   "total_time": 85,
   "yields": "6 servings",
+  "keywords": [
+    "köri",
+    "soslu",
+    "tavuklu",
+    "patates",
+    "topları"
+  ],
   "description": "Patates ve tavuk ikilisi yeniden bir araya geliyor, güçlerini birleştiriyorlar ve ortaya inanılmaz bir lezzet çıkıyor. Köri soslu patates topları burada!",
   "cook_time": 40,
   "cuisine": "Türk",
diff --git a/tests/test_data/yummly.com/yummly.json b/tests/test_data/yummly.com/yummly.json
index 03fe6797..3bedc814 100644
--- a/tests/test_data/yummly.com/yummly.json
+++ b/tests/test_data/yummly.com/yummly.json
@@ -54,5 +54,9 @@
   "total_time": 25,
   "yields": "4 servings",
   "cooking_method": "Baking",
+  "keywords": [
+    "Quick",
+    "Baking"
+  ],
   "description": "Extra cheese and extra garlic? Yes, please! No red sauce is needed for these mouthwatering naan pizzas. The recipe is a Yummly original created by [Sara Mellas](https://www.yummly.com/dish/author/Sara%20Mellas)."
 }
diff --git a/tests/test_data/zaubertopf.de/zaubertopf.json b/tests/test_data/zaubertopf.de/zaubertopf.json
index b16a3db9..fef26281 100644
--- a/tests/test_data/zaubertopf.de/zaubertopf.json
+++ b/tests/test_data/zaubertopf.de/zaubertopf.json
@@ -69,5 +69,8 @@
   "site_name": "mein ZauberTopf",
   "title": "Wikinger-Auflauf mit dem Monsieur Cuisine",
   "total_time": 46,
-  "prep_time": 1
+  "prep_time": 1,
+  "keywords": [
+    "Mittagessen"
+  ]
 }