git.iko.soy/typeable/bloodhound
on master help sign in
lower and higher level scan&scroll functions; added scrollId to
commit3fa24e27d905aeb5ec3f3496bc346f20286e82e8 authorJosh Berman <berman.josh@gmail.com> dateSun 12 Jul 2015, 10:40 (11 years ago) parentc2a362e
3 files changed+45−5
bloodhound.cabal+1−1 src/Database/Bloodhound/Client.hs+37−2 src/Database/Bloodhound/Types.hs+7−2
bloodhound.cabal+1−1
@@ -1,5 +1,5 @@
11name: bloodhound
2−version: 0.6.0.1
2+version: 0.6.0.2
33synopsis: ElasticSearch client library for Haskell
44description: ElasticSearch made awesome for Haskell hackers
55homepage: https://github.com/bitemyapp/bloodhound
src/Database/Bloodhound/Client.hs+37−2
@@ -1,5 +1,5 @@
1−{-# LANGUAGE OverloadedStrings #-}
2−{-# LANGUAGE RecordWildCards #-}
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE RecordWildCards #-}
33
44-------------------------------------------------------------------------------
55-- |
@@ -36,6 +36,7 @@ module Database.Bloodhound.Client
3636 , searchAll
3737 , searchByIndex
3838 , searchByType
39+ , scanSearch
3940 , refreshIndex
4041 , mkSearch
4142 , mkAggregateSearch
@@ -482,6 +483,40 @@ searchByType (IndexName indexName)
482483 (MappingName mappingName) = bindM2 dispatchSearch url . return
483484 where url = joinPath [indexName, mappingName, "_search"]
484485
486+scanSearch' :: MonadBH m => Search -> m (Maybe ScrollId)
487+scanSearch' search = do
488+ let url = joinPath ["_search"]
489+ search' = search { searchType = SearchTypeScan }
490+ resp' <- bindM2 dispatchSearch url (return search')
491+ let msr = decode' $ responseBody resp' :: Maybe (SearchResult ())
492+ msid = maybe Nothing scrollId msr
493+ return msid
494+
495+scroll' :: (FromJSON a, MonadBH m) => Maybe ScrollId -> m ([Hit a], Maybe ScrollId)
496+scroll' Nothing = return ([], Nothing)
497+scroll' (Just sid) = do
498+ url <- joinPath ["_search/scroll?scroll=1m"]
499+ resp' <- post url (Just . L.fromStrict $ T.encodeUtf8 sid)
500+ let msr = decode' $ responseBody resp' :: FromJSON a => Maybe (SearchResult a)
501+ resp = case msr of
502+ Just sr -> (hits $ searchHits sr, scrollId sr)
503+ _ -> ([], Nothing)
504+ return resp
505+
506+simpleAccumilator :: (FromJSON a, MonadBH m) => [Hit a] -> ([Hit a], Maybe ScrollId) -> m ([Hit a], Maybe ScrollId)
507+simpleAccumilator oldHits (newHits, Nothing) = return (oldHits ++ newHits, Nothing)
508+simpleAccumilator oldHits ([], _) = return (oldHits, Nothing)
509+simpleAccumilator oldHits (newHits, msid) = do
510+ (newHits', msid') <- scroll' msid
511+ simpleAccumilator (oldHits ++ newHits) (newHits', msid')
512+
513+scanSearch :: (FromJSON a, MonadBH m) => Search -> m [Hit a]
514+scanSearch search = do
515+ msid <- scanSearch' search
516+ (hits, msid') <- scroll' msid
517+ (totalHits, _) <- simpleAccumilator [] (hits, msid')
518+ return totalHits
519+
485520-- | 'mkSearch' is a helper function for defaulting additional fields of a 'Search'
486521-- to Nothing in case you only care about your 'Query' and 'Filter'. Use record update
487522-- syntax if you want to add things like aggregations or highlights while still using
src/Database/Bloodhound/Types.hs+7−2
@@ -60,6 +60,7 @@ module Database.Bloodhound.Types
6060 , Search(..)
6161 , SearchType(..)
6262 , SearchResult(..)
63+ , ScrollId
6364 , SearchHits(..)
6465 , TrackSortScores
6566 , From(..)
@@ -1126,7 +1127,10 @@ data SearchResult a =
11261127 , timedOut :: Bool
11271128 , shards :: ShardResult
11281129 , searchHits :: SearchHits a
1129− , aggregations :: Maybe AggregationResults } deriving (Eq, Show)
1130+ , aggregations :: Maybe AggregationResults
1131+ , scrollId :: Maybe ScrollId } deriving (Eq, Show)
1132+
1133+type ScrollId = Text -- Fixme: Newtype
11301134
11311135type Score = Maybe Double
11321136
@@ -2157,7 +2161,8 @@ instance (FromJSON a) => FromJSON (SearchResult a) where
21572161 v .: "timed_out" <*>
21582162 v .: "_shards" <*>
21592163 v .: "hits" <*>
2160− v .:? "aggregations"
2164+ v .:? "aggregations" <*>
2165+ v .:? "_scroll_id"
21612166 parseJSON _ = empty
21622167
21632168instance (FromJSON a) => FromJSON (SearchHits a) where