diff --git a/src/Gargantext/API/GraphQL/Context.hs b/src/Gargantext/API/GraphQL/Context.hs
index 3157ce385a83cfb1dd64abe2a51ca50ce95674a9..fe5e0e52e13d56cfdabc102b1d9fc0044922b73c 100644
--- a/src/Gargantext/API/GraphQL/Context.hs
+++ b/src/Gargantext/API/GraphQL/Context.hs
@@ -20,7 +20,7 @@ import Gargantext.Core.Types.Search (HyperdataRow(..), toHyperdataRow)
 import Gargantext.Database.Admin.Types.Hyperdata (HyperdataDocument)
 import Gargantext.Database.Admin.Types.Node (ContextTitle, NodeId(..), NodeTypeId, UserId, unNodeId)
 import Gargantext.Database.Prelude (CmdCommon)
-import Gargantext.Database.Query.Table.NodeContext (getNodeContext, getContextsForNgramsTerms, ContextForNgramsTerms(..), getContextNgrams)
+import Gargantext.Database.Query.Table.NodeContext (getNodeContext, getContextsForNgramsTerms, ContextForNgramsTerms(..), {- getContextNgrams, -} getContextNgramsMatchingFTS)
 import qualified Gargantext.Database.Query.Table.NodeContext as DNC
 import Gargantext.Database.Schema.NodeContext (NodeContext, NodeContextPoly(..))
 import Gargantext.Prelude
@@ -150,7 +150,7 @@ dbContextNgrams
   :: (CmdCommon env)
   => Int -> Int -> GqlM e env [Text]
 dbContextNgrams context_id list_id = do
-  lift $ getContextNgrams (NodeId context_id) (NodeId list_id)
+  lift $ getContextNgramsMatchingFTS (NodeId context_id) (NodeId list_id)
 
 -- Conversion functions
 
diff --git a/src/Gargantext/Database/Query/Table/NodeContext.hs b/src/Gargantext/Database/Query/Table/NodeContext.hs
index 0bd5f3927dcdb9ff5ebedc3b02c510a563203c0f..8136194ce3d1c93661c6203d7d921571baff65d5 100644
--- a/src/Gargantext/Database/Query/Table/NodeContext.hs
+++ b/src/Gargantext/Database/Query/Table/NodeContext.hs
@@ -34,6 +34,7 @@ module Gargantext.Database.Query.Table.NodeContext
   , ContextForNgrams(..)
   , getContextsForNgramsTerms
   , getContextNgrams
+  , getContextNgramsMatchingFTS
   , ContextForNgramsTerms(..)
   , insertNodeContext
   , deleteNodeContext
@@ -191,6 +192,9 @@ getContextsForNgramsTerms cId ngramsTerms = do
 
 
 
+-- | Query the `context_node_ngrams` table and return ngrams for given
+-- `context_id` and `list_id`.
+-- WARNING: `context_node_ngrams` can be outdated.
 getContextNgrams :: HasNodeError err
                  => NodeId
                  -> NodeId
@@ -206,6 +210,29 @@ getContextNgrams contextId listId = do
                 JOIN ngrams ON ngrams.id = ngrams_id
                 WHERE context_id = ?
                 AND node_id = ? |]
+
+
+-- | Query the `contexts` table and return ngrams for given context_id
+-- and list_id that match the search tsvector.
+-- NOTE This is poor man's tokenization that is used as a hint for the
+-- frontend highlighter.
+getContextNgramsMatchingFTS :: HasNodeError err
+                            => NodeId
+                            -> NodeId
+                            -> Cmd err [Text]
+getContextNgramsMatchingFTS contextId listId = do
+  res <- runPGSQuery query (contextId, listId)
+  pure $ (\(PGS.Only term) -> term) <$> res
+
+  where
+    query :: PGS.Query
+    query = [sql| SELECT ngrams.terms
+                FROM ngrams
+                JOIN node_ngrams ON node_ngrams.ngrams_id = ngrams.id
+                CROSS JOIN contexts
+                WHERE contexts.id = ?
+                AND node_ngrams.node_id = ?
+                AND contexts.search @@ phraseto_tsquery(ngrams.terms) |]
 ------------------------------------------------------------------------
 insertNodeContext :: [NodeContext] -> Cmd err Int
 insertNodeContext ns = mkCmd $ \conn -> fromIntegral <$> (runInsert_ conn