@@ -330,6 +330,10 @@ module Database.V5.Bloodhound.Types
330330 , PhraseSuggester(..)
331331 , PhraseSuggesterHighlighter(..)
332332 , PhraseSuggesterCollate(..)
333+ , mkPhraseSuggester
334+ , SuggestOptions(..)
335+ , SuggestResponse(..)
336+ , NamedSuggestionResponse(..)
333337
334338 , Aggregation(..)
335339 , Aggregations
@@ -1116,7 +1120,9 @@ data Search = Search { queryBody :: Maybe Query
11161120 , size :: Size
11171121 , searchType :: SearchType
11181122 , fields :: Maybe [FieldName]
1119− , source :: Maybe Source } deriving (Eq, Read, Show, Generic, Typeable)
1123+ , source :: Maybe Source
1124+ , suggestBody :: Maybe Suggest -- ^ Only one Suggestion request / response per Search is supported.
1125+ } deriving (Eq, Read, Show, Generic, Typeable)
11201126
11211127data SearchType = SearchTypeQueryThenFetch
11221128 | SearchTypeDfsQueryThenFetch
@@ -1663,13 +1669,17 @@ instance FromJSON TemplateQueryInline where
16631669 <$> o .: "inline"
16641670 <*> o .: "params"
16651671
1672+
16661673data SearchResult a =
16671674 SearchResult { took :: Int
16681675 , timedOut :: Bool
16691676 , shards :: ShardResult
16701677 , searchHits :: SearchHits a
16711678 , aggregations :: Maybe AggregationResults
1672− , scrollId :: Maybe ScrollId } deriving (Eq, Read, Show, Generic, Typeable)
1679+ , scrollId :: Maybe ScrollId
1680+ , suggest :: Maybe NamedSuggestionResponse -- ^ Only one Suggestion request / response per Search is supported.
1681+ }
1682+ deriving (Eq, Read, Show, Generic, Typeable)
16731683
16741684newtype ScrollId = ScrollId Text deriving (Eq, Read, Show, Generic, Ord, ToJSON, FromJSON)
16751685
@@ -3258,7 +3268,7 @@ instance FromJSON SearchAliasRouting where
32583268 where parse t = SearchAliasRouting <$> parseNEJSON (String <$> T.splitOn "," t)
32593269
32603270instance ToJSON Search where
3261− toJSON (Search mquery sFilter sort searchAggs highlight sTrackSortScores sFrom sSize _ sFields sSource) =
3271+ toJSON (Search mquery sFilter sort searchAggs highlight sTrackSortScores sFrom sSize _ sFields sSource sSuggest) =
32623272 omitNulls [ "query" .= query'
32633273 , "sort" .= sort
32643274 , "aggregations" .= searchAggs
@@ -3267,7 +3277,8 @@ instance ToJSON Search where
32673277 , "size" .= sSize
32683278 , "track_scores" .= sTrackSortScores
32693279 , "fields" .= sFields
3270− , "_source" .= sSource]
3280+ , "_source" .= sSource
3281+ , "suggest" .= sSuggest]
32713282
32723283 where query' = case sFilter of
32733284 Nothing -> mquery
@@ -3620,7 +3631,8 @@ instance (FromJSON a) => FromJSON (SearchResult a) where
36203631 v .: "_shards" <*>
36213632 v .: "hits" <*>
36223633 v .:? "aggregations" <*>
3623− v .:? "_scroll_id"
3634+ v .:? "_scroll_id" <*>
3635+ v .:? "suggest"
36243636 parseJSON _ = empty
36253637
36263638instance (FromJSON a) => FromJSON (SearchHits a) where
@@ -5106,7 +5118,7 @@ data Suggest = Suggest { suggestText :: Text
51065118 , suggestName :: Text
51075119 , suggestType :: SuggestType
51085120 }
5109− deriving (Show, Generic)
5121+ deriving (Show, Generic, Eq, Read)
51105122
51115123instance ToJSON Suggest where
51125124 toJSON Suggest{..} = object [ "text" .= suggestText
@@ -5125,7 +5137,7 @@ instance FromJSON Suggest where
51255137 parseJSON x = typeMismatch "Suggest" x
51265138
51275139data SuggestType = SuggestTypePhraseSuggester PhraseSuggester
5128− deriving (Show, Generic)
5140+ deriving (Show, Generic, Eq, Read)
51295141
51305142instance ToJSON SuggestType where
51315143 toJSON (SuggestTypePhraseSuggester x) = object ["phrase" .= x]
@@ -5149,7 +5161,7 @@ data PhraseSuggester =
51495161 , phraseSuggesterHighlight :: Maybe PhraseSuggesterHighlighter
51505162 , phraseSuggesterCollate :: Maybe PhraseSuggesterCollate
51515163 }
5152− deriving (Show, Generic)
5164+ deriving (Show, Generic, Eq, Read)
51535165
51545166instance ToJSON PhraseSuggester where
51555167 toJSON PhraseSuggester{..} = omitNulls [ "field" .= phraseSuggesterField
@@ -5180,11 +5192,16 @@ instance FromJSON PhraseSuggester where
51805192 <*> o .:? "highlight"
51815193 <*> o .:? "collate"
51825194
5195+mkPhraseSuggester :: FieldName -> PhraseSuggester
5196+mkPhraseSuggester fName =
5197+ PhraseSuggester fName Nothing Nothing Nothing Nothing Nothing Nothing
5198+ Nothing Nothing Nothing Nothing
5199+
51835200data PhraseSuggesterHighlighter =
51845201 PhraseSuggesterHighlighter { phraseSuggesterHighlighterPreTag :: Text
51855202 , phraseSuggesterHighlighterPostTag :: Text
51865203 }
5187− deriving (Show, Generic)
5204+ deriving (Show, Generic, Eq, Read)
51885205
51895206instance ToJSON PhraseSuggesterHighlighter where
51905207 toJSON PhraseSuggesterHighlighter{..} =
@@ -5202,7 +5219,7 @@ data PhraseSuggesterCollate =
52025219 PhraseSuggesterCollate { phraseSuggesterCollateTemplateQuery :: TemplateQueryInline
52035220 , phraseSuggesterCollatePrune :: Bool
52045221 }
5205− deriving (Show, Generic)
5222+ deriving (Show, Generic, Eq, Read)
52065223
52075224instance ToJSON PhraseSuggesterCollate where
52085225 toJSON PhraseSuggesterCollate{..} = object [ "query" .= object
@@ -5220,3 +5237,51 @@ instance FromJSON PhraseSuggesterCollate where
52205237 prune' <- o .:? "prune" .!= False
52215238 return $ PhraseSuggesterCollate (TemplateQueryInline inline' params') prune'
52225239 parseJSON x = typeMismatch "PhraseSuggesterCollate" x
5240+
5241+data SuggestOptions =
5242+ SuggestOptions { suggestOptionsText :: Text
5243+ , suggestOptionsScore :: Double
5244+ , suggestOptionsFreq :: Maybe Int
5245+ , suggestOptionsHighlighted :: Maybe Text
5246+ }
5247+ deriving (Eq, Read, Show)
5248+
5249+instance FromJSON SuggestOptions where
5250+ parseJSON = withObject "SuggestOptions" parse
5251+ where parse o = SuggestOptions
5252+ <$> o .: "text"
5253+ <*> o .: "score"
5254+ <*> o .:? "freq"
5255+ <*> o .:? "highlighted"
5256+
5257+data SuggestResponse =
5258+ SuggestResponse { suggestResponseText :: Text
5259+ , suggestResponseOffset :: Int
5260+ , suggestResponseLength :: Int
5261+ , suggestResponseOptions :: [SuggestOptions]
5262+ }
5263+ deriving (Eq, Read, Show)
5264+
5265+instance FromJSON SuggestResponse where
5266+ parseJSON = withObject "SuggestResponse" parse
5267+ where parse o = SuggestResponse
5268+ <$> o .: "text"
5269+ <*> o .: "offset"
5270+ <*> o .: "length"
5271+ <*> o .: "options"
5272+
5273+data NamedSuggestionResponse =
5274+ NamedSuggestionResponse { nsrName :: Text
5275+ , nsrResponses :: [SuggestResponse]
5276+ }
5277+ deriving (Eq, Read, Show)
5278+
5279+instance FromJSON NamedSuggestionResponse where
5280+ parseJSON (Object o) = do
5281+ suggestionName' <- case HM.toList o of
5282+ [(x, _)] -> return x
5283+ _ -> fail "error parsing NamedSuggestionResponse name"
5284+ suggestionResponses' <- o .: suggestionName'
5285+ return $ NamedSuggestionResponse suggestionName' suggestionResponses'
5286+
5287+ parseJSON x = typeMismatch "NamedSuggestionResponse" x