diff --git a/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php b/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
index 143be1e..c625fb6 100644
--- a/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
+++ b/modules/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
@@ -377,4 +377,20 @@ public function calculateDependencies() {
     return ['module' => ['node', 'search']];
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDataDefinitions() {
+    $fields = $this->getFields();
+    $field_configs = FieldConfig::loadMultiple();
+    $definitions = [];
+    foreach ($field_configs as $id => $config) {
+      if (isset($fields[$config->getName()])) {
+        $definitions[] = $config;
+      }
+    }
+
+    return $definitions;
+  }
+
 }
diff --git a/src/FacetSource/FacetSourcePluginBase.php b/src/FacetSource/FacetSourcePluginBase.php
index 14317fb..2d24cb5 100644
--- a/src/FacetSource/FacetSourcePluginBase.php
+++ b/src/FacetSource/FacetSourcePluginBase.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\facets\Exception\Exception;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Drupal\Facets\FacetInterface;
 use Drupal\Core\Form\FormStateInterface;
@@ -146,4 +147,16 @@ public function submitConfigurationForm(array &$form, FormStateInterface $form_s
     $this->facet->setFieldIdentifier($field_identifier);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDataDefinition($field_name) {
+    $dataDefinitions = $this->getDataDefinitions();
+    if (isset($dataDefinitions[$field_name])) {
+      return $dataDefinitions[$field_name];
+    }
+
+    throw new Exception("Field with name {$field_name} does not have a definition");
+  }
+
 }
diff --git a/src/FacetSource/FacetSourcePluginInterface.php b/src/FacetSource/FacetSourcePluginInterface.php
index 13248e3..ec2d757 100644
--- a/src/FacetSource/FacetSourcePluginInterface.php
+++ b/src/FacetSource/FacetSourcePluginInterface.php
@@ -97,4 +97,29 @@ public function setSearchKeys($keys);
    */
   public function getSearchKeys();
 
+  /**
+   * Returns an array of data definitions for all fields for this facet source.
+   *
+   * For search api this means that we load the index and call its getFields()
+   * method to find all fields and return the typed data objects for all fields.
+   * For core search, the approach is different but we'll also return the typed
+   * data objects for all fields.
+   *
+   * @return \Drupal\Core\TypedData\DataDefinitionInterface[]
+   *   An array of typed data definitions.
+   */
+  public function getDataDefinitions();
+
+  /**
+   * Returns a single field's data definition from the facet source.
+   *
+   * Uses ::getDataDefinitions internally to select one of the fields.
+   *
+   * @see ::getDataDefinitions
+   *
+   * @return \Drupal\Core\TypedData\DataDefinitionInterface
+   *   A typed data definition.
+   */
+  public function getDataDefinition($field_name);
+
 }
diff --git a/src/Plugin/facets/facet_source/SearchApiDisplay.php b/src/Plugin/facets/facet_source/SearchApiDisplay.php
index 7e99553..2de01d5 100644
--- a/src/Plugin/facets/facet_source/SearchApiDisplay.php
+++ b/src/Plugin/facets/facet_source/SearchApiDisplay.php
@@ -326,4 +326,14 @@ public function getDisplay() {
       ->createInstance($this->pluginDefinition['display_id']);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDataDefinitions() {
+    return array_map(function ($item) {
+      /** @var \Drupal\search_api\Item\FieldInterface $item */
+      return $item->getDataDefinition();
+    }, $this->getIndex()->getFields());
+  }
+
 }
diff --git a/src/Plugin/facets/processor/ListItemProcessor.php b/src/Plugin/facets/processor/ListItemProcessor.php
index 357e7ce..0abef7e 100644
--- a/src/Plugin/facets/processor/ListItemProcessor.php
+++ b/src/Plugin/facets/processor/ListItemProcessor.php
@@ -106,7 +106,7 @@ public function build(FacetInterface $facet, array $results) {
       $field = $index->getField($field_identifier);
 
       if (!$field->getDatasourceId()) {
-        throw new InvalidProcessorException("The {$field_identifier} field has no datasource, there is no valid use for the {$this->pluginId} processor with this facet");
+        throw new InvalidProcessorException("This field has no datasource, there is no valid use for this processor with this facet");
       }
       $entity = $field->getDatasource()->getEntityTypeId();
     }
diff --git a/src/Plugin/facets/processor/TranslateEntityProcessor.php b/src/Plugin/facets/processor/TranslateEntityProcessor.php
index 4864bfb..8b3b70c 100644
--- a/src/Plugin/facets/processor/TranslateEntityProcessor.php
+++ b/src/Plugin/facets/processor/TranslateEntityProcessor.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\TypedData\TranslatableInterface;
+use Drupal\facets\Exception\InvalidProcessorException;
 use Drupal\facets\FacetInterface;
 use Drupal\facets\Plugin\facets\facet_source\SearchApiDisplay;
 use Drupal\facets\Processor\BuildProcessorInterface;
@@ -80,35 +81,24 @@ public static function create(ContainerInterface $container, array $configuratio
   public function build(FacetInterface $facet, array $results) {
     $language_interface = $this->languageManager->getCurrentLanguage();
 
-    $ids = [];
+    /** @var \Drupal\Core\TypedData\DataDefinitionInterface $field_definition */
+    $field_definition = $facet->getFacetSource()
+      ->getDataDefinition($facet->getFieldIdentifier());
+    if ($field_definition->getPropertyDefinition('entity') === NULL) {
+      throw new InvalidProcessorException("Field doesn't have an entity definition, so this processor doesn't work.");
+    }
+
+    $entity_type = $field_definition
+      ->getPropertyDefinition('entity')
+      ->getTargetDefinition()
+      ->getEntityTypeId();
 
     /** @var \Drupal\facets\Result\ResultInterface $result */
+    $ids = [];
     foreach ($results as $delta => $result) {
       $ids[$delta] = $result->getRawValue();
     }
 
-    // Default to nodes.
-    $entity_type = 'node';
-    $source = $facet->getFacetSource();
-
-    // Support multiple entity types when using Search API.
-    if ($source instanceof SearchApiDisplay) {
-
-      $field_id = $facet->getFieldIdentifier();
-
-      // Load the index from the source, load the definition from the
-      // datasource.
-      /** @var \Drupal\facets\FacetSource\SearchApiFacetSourceInterface $source */
-      $index = $source->getIndex();
-      $field = $index->getField($field_id);
-
-      // Determine the target entity type.
-      $entity_type = $field->getDataDefinition()
-        ->getPropertyDefinition('entity')
-        ->getTargetDefinition()
-        ->getEntityTypeId();
-    }
-
     // Load all indexed entities of this type.
     $entities = $this->entityTypeManager
       ->getStorage($entity_type)
diff --git a/tests/src/Kernel/Entity/FacetFacetSourceTest.php b/tests/src/Kernel/Entity/FacetFacetSourceTest.php
index 4ef8a46..c512fd0 100644
--- a/tests/src/Kernel/Entity/FacetFacetSourceTest.php
+++ b/tests/src/Kernel/Entity/FacetFacetSourceTest.php
@@ -2,10 +2,12 @@
 
 namespace Drupal\Tests\facets\Kernel\Entity;
 
+use Drupal\Core\TypedData\DataDefinitionInterface;
 use Drupal\facets\Entity\Facet;
 use Drupal\facets\FacetSourceInterface;
 use Drupal\facets\Plugin\facets\facet_source\SearchApiDisplay;
 use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
+use Drupal\facets\Exception\Exception;
 
 /**
  * Class FacetFacetSourceTest.
@@ -129,4 +131,35 @@ public function testQueryType() {
     $this->assertEquals('search_api_string', $aa);
   }
 
+  /**
+   * Test the data definitions.
+   *
+   * @covers \Drupal\facets\FacetSource\FacetSourcePluginInterface::getDataDefinitions
+   * @covers \Drupal\facets\FacetSource\FacetSourcePluginInterface::getDataDefinition
+   */
+  public function testDataDefinitions() {
+    // Create and configure facet.
+    $entity = new Facet([], 'facets_facet');
+    $display_name = 'search_api:views_page__search_api_test_view__page_1';
+    $entity->setFacetSourceId($display_name);
+
+    // Test that ::getDataDefinitions returns an array with the defined fields,
+    // check on a couple of the fields.
+    $dataDefinitions = $entity->getFacetSource()->getDataDefinitions();
+    $this->assertInternalType('array', $dataDefinitions);
+    $this->assertArrayHasKey('name', $dataDefinitions);
+    $this->assertArrayHasKey('type', $dataDefinitions);
+    $this->assertArrayHasKey('category', $dataDefinitions);
+    $this->assertInstanceOf(DataDefinitionInterface::class, $dataDefinitions['name']);
+    $this->assertInstanceOf(DataDefinitionInterface::class, $dataDefinitions['type']);
+    $this->assertInstanceOf(DataDefinitionInterface::class, $dataDefinitions['category']);
+
+    // Check the return value of ::getDataDefinition.
+    $this->assertInstanceOf(DataDefinitionInterface::class, $entity->getFacetSource()->getDataDefinition('id'));
+
+    // When trying to get a field that doesn't exist, an error should be thrown.
+    $this->setExpectedException(Exception::class);
+    $entity->getFacetSource()->getDataDefinition('llama');
+  }
+
 }
diff --git a/tests/src/Unit/Plugin/processor/ListItemProcessorTest.php b/tests/src/Unit/Plugin/processor/ListItemProcessorTest.php
index e478a73..10e4d3f 100644
--- a/tests/src/Unit/Plugin/processor/ListItemProcessorTest.php
+++ b/tests/src/Unit/Plugin/processor/ListItemProcessorTest.php
@@ -2,8 +2,12 @@
 
 namespace Drupal\Tests\facets\Unit\Plugin\processor;
 
+use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Entity\EntityTypeBundleInfo;
+use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
 use Drupal\facets\Entity\Facet;
+use Drupal\facets\FacetSource\FacetSourcePluginInterface;
+use Drupal\facets\FacetSource\FacetSourcePluginManager;
 use Drupal\facets\Plugin\facets\processor\ListItemProcessor;
 use Drupal\facets\Result\Result;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -57,7 +61,35 @@ protected function setUp() {
       ->disableOriginalConstructor()
       ->getMock();
 
+    // Create a search api based facet source and make the property definition
+    // return null.
+    $data_definition = $this->getMock(ComplexDataDefinitionInterface::class);
+    $data_definition->expects($this->any())
+      ->method('getPropertyDefinition')
+      ->willReturn(NULL);
+    $facet_source = $this->getMockBuilder(FacetSourcePluginInterface::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+    $facet_source->expects($this->any())
+      ->method('getDataDefinition')
+      ->willReturn($data_definition);
+
+    // Add the plugin manager and add
+    $pluginManager = $this->getMockBuilder(FacetSourcePluginManager::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+    $pluginManager->expects($this->any())
+      ->method('hasDefinition')
+      ->willReturn(TRUE);
+    $pluginManager->expects($this->any())
+      ->method('createInstance')
+      ->willReturn($facet_source);
+
     $this->processor = new ListItemProcessor([], 'list_item', [], $config_manager, $entity_field_manager, $entity_type_bundle_info);
+
+    $container = new ContainerBuilder();
+    $container->set('plugin.manager.facets.facet_source', $pluginManager);
+    \Drupal::setContainer($container);
   }
 
   /**
@@ -90,12 +122,14 @@ public function testBuildConfigurableField() {
     // Config entity field facet.
     $module_field_facet = new Facet([], 'facets_facet');
     $module_field_facet->setFieldIdentifier('test_facet');
+    $module_field_facet->setFacetSourceId('llama_source');
     $module_field_facet->setResults($this->results);
     $module_field_facet->addProcessor([
       'processor_id' => 'list_item',
       'weights' => [],
       'settings' => [],
     ]);
+
     /* @var \Drupal\facets\Result\Result[] $module_field_facet- */
     $module_field_results = $processor->build($module_field_facet, $this->results);
 
@@ -133,6 +167,7 @@ public function testBuildBundle() {
     // Config entity field facet.
     $module_field_facet = new Facet([], 'facets_facet');
     $module_field_facet->setFieldIdentifier('test_facet');
+    $module_field_facet->setFacetSourceId('llama_source');
     $module_field_facet->setResults($this->results);
     $module_field_facet->addProcessor([
       'processor_id' => 'list_item',
@@ -179,6 +214,7 @@ public function testBuildBaseField() {
     // Base prop facet.
     $base_prop_facet = new Facet([], 'facets_facet');
     $base_prop_facet->setFieldIdentifier('test_facet_baseprop');
+    $base_prop_facet->setFacetSourceId('llama_source');
     $base_prop_facet->setResults($this->results);
     $base_prop_facet->addProcessor([
       'processor_id' => 'list_item',
diff --git a/tests/src/Unit/Plugin/processor/TranslateEntityProcessorTest.php b/tests/src/Unit/Plugin/processor/TranslateEntityProcessorTest.php
index 6b227e6..01c337f 100644
--- a/tests/src/Unit/Plugin/processor/TranslateEntityProcessorTest.php
+++ b/tests/src/Unit/Plugin/processor/TranslateEntityProcessorTest.php
@@ -75,25 +75,13 @@ protected function setUp() {
       ->method('getPropertyDefinition')
       ->willReturn($property_definition);
 
-    // Add the typed data definition to the search api field.
-    $field = $this->getMock(FieldInterface::class);
-    $field->expects($this->any())
-      ->method('getDataDefinition')
-      ->willReturn($data_definition);
-
-    // Add the search api field to the index.
-    $index = $this->getMock(IndexInterface::class);
-    $index->expects($this->any())
-      ->method('getField')
-      ->willReturn($field);
-
     // Create a search api based facet source and link the index to it.
     $facet_source = $this->getMockBuilder(SearchApiDisplay::class)
       ->disableOriginalConstructor()
       ->getMock();
     $facet_source->expects($this->any())
-      ->method('getIndex')
-      ->willReturn($index);
+      ->method('getDataDefinition')
+      ->willReturn($data_definition);
 
     // Create the actual facet.
     $this->facet = $this->getMockBuilder(Facet::class)
