git.iko.soy/typeable/bloodhound
on master help sign in
Merge pull request #56 from centromere/fields-support

Added fields support to Search

commit6844fd47e560c529dc69a4589cf9db22e1acdf0d authorChris Allen <cma@bitemyapp.com> dateFri 24 Jul 2015, 11:28 (11 years ago) parent5b3555242b0e92
4 files changed+27−12
README.md+15−2 src/Database/Bloodhound/Client.hs+6−6 src/Database/Bloodhound/Types.hs+5−3 tests/tests.hs+1−1
README.md+15−2
@@ -383,7 +383,7 @@ Search
383383
384384-- exported by the Client module, just defaults some stuff.
385385-- mkSearch :: Maybe Query -> Maybe Filter -> Search
386−-- mkSearch query filter = Search query filter Nothing False (From 0) (Size 10)
386+-- mkSearch query filter = Search query filter Nothing False (From 0) (Size 10) Nothing
387387
388388let query = TermQuery (Term "user" "bitemyapp") Nothing
389389
@@ -486,9 +486,22 @@ let sortSpec = DefaultSortSpec $ mkSort (FieldName "age") Ascending
486486-- -> Maybe Sort
487487-- -> TrackSortScores
488488-- -> From -> Size
489+-- -> Maybe [FieldName]
489490
490491-- just add more sortspecs to the list if you want tie-breakers.
491−let search = Search Nothing (Just IdentityFilter) (Just [sortSpec]) False (From 0) (Size 10)
492+let search = Search Nothing (Just IdentityFilter) (Just [sortSpec]) False (From 0) (Size 10) Nothing
493+
494+```
495+
496+### Field selection
497+
498+If you only want certain fields from the source document returned, you can
499+set the "fields" field of the Search record.
500+
501+``` {.haskell}
502+
503+let search' = mkSearch (Just (MatchAllQuery Nothing)) Nothing
504+ search = search' { fields = Just [FieldName "updated"] }
492505
493506```
494507
src/Database/Bloodhound/Client.hs+6−6
@@ -537,9 +537,9 @@ searchByType (IndexName indexName)
537537--
538538-- >>> let query = TermQuery (Term "user" "bitemyapp") Nothing
539539-- >>> mkSearch (Just query) Nothing
540−-- Search {queryBody = Just (TermQuery (Term {termField = "user", termValue = "bitemyapp"}) Nothing), filterBody = Nothing, sortBody = Nothing, aggBody = Nothing, highlight = Nothing, trackSortScores = False, from = From 0, size = Size 10}
540+-- Search {queryBody = Just (TermQuery (Term {termField = "user", termValue = "bitemyapp"}) Nothing), filterBody = Nothing, sortBody = Nothing, aggBody = Nothing, highlight = Nothing, trackSortScores = False, from = From 0, size = Size 10, fields = Nothing}
541541mkSearch :: Maybe Query -> Maybe Filter -> Search
542−mkSearch query filter = Search query filter Nothing Nothing Nothing False (From 0) (Size 10)
542+mkSearch query filter = Search query filter Nothing Nothing Nothing False (From 0) (Size 10) Nothing
543543
544544-- | 'mkAggregateSearch' is a helper function that defaults everything in a 'Search' except for
545545-- the 'Query' and the 'Aggregation'.
@@ -549,7 +549,7 @@ mkSearch query filter = Search query filter Nothing Nothing Nothing False (From
549549-- TermsAgg (TermsAggregation {term = Left "user", termInclude = Nothing, termExclude = Nothing, termOrder = Nothing, termMinDocCount = Nothing, termSize = Nothing, termShardSize = Nothing, termCollectMode = Just BreadthFirst, termExecutionHint = Nothing, termAggs = Nothing})
550550-- >>> let myAggregation = mkAggregateSearch Nothing $ mkAggregations "users" terms
551551mkAggregateSearch :: Maybe Query -> Aggregations -> Search
552−mkAggregateSearch query mkSearchAggs = Search query Nothing Nothing (Just mkSearchAggs) Nothing False (From 0) (Size 0)
552+mkAggregateSearch query mkSearchAggs = Search query Nothing Nothing (Just mkSearchAggs) Nothing False (From 0) (Size 0) Nothing
553553
554554-- | 'mkHighlightSearch' is a helper function that defaults everything in a 'Search' except for
555555-- the 'Query' and the 'Aggregation'.
@@ -558,7 +558,7 @@ mkAggregateSearch query mkSearchAggs = Search query Nothing Nothing (Just mkSear
558558-- >>> let testHighlight = Highlights Nothing [FieldHighlight (FieldName "message") Nothing]
559559-- >>> let search = mkHighlightSearch (Just query) testHighlight
560560mkHighlightSearch :: Maybe Query -> Highlights -> Search
561−mkHighlightSearch query searchHighlights = Search query Nothing Nothing Nothing (Just searchHighlights) False (From 0) (Size 10)
561+mkHighlightSearch query searchHighlights = Search query Nothing Nothing Nothing (Just searchHighlights) False (From 0) (Size 10) Nothing
562562
563563-- | 'pageSearch' is a helper function that takes a search and assigns the from
564564-- and size fields for the search. The from parameter defines the offset
@@ -568,9 +568,9 @@ mkHighlightSearch query searchHighlights = Search query Nothing Nothing Nothing
568568-- >>> let query = QueryMatchQuery $ mkMatchQuery (FieldName "_all") (QueryString "haskell")
569569-- >>> let search = mkSearch (Just query) Nothing
570570-- >>> search
571−-- Search {queryBody = Just (QueryMatchQuery (MatchQuery {matchQueryField = FieldName "_all", matchQueryQueryString = QueryString "haskell", matchQueryOperator = Or, matchQueryZeroTerms = ZeroTermsNone, matchQueryCutoffFrequency = Nothing, matchQueryMatchType = Nothing, matchQueryAnalyzer = Nothing, matchQueryMaxExpansions = Nothing, matchQueryLenient = Nothing})), filterBody = Nothing, sortBody = Nothing, aggBody = Nothing, highlight = Nothing, trackSortScores = False, from = From 0, size = Size 10}
571+-- Search {queryBody = Just (QueryMatchQuery (MatchQuery {matchQueryField = FieldName "_all", matchQueryQueryString = QueryString "haskell", matchQueryOperator = Or, matchQueryZeroTerms = ZeroTermsNone, matchQueryCutoffFrequency = Nothing, matchQueryMatchType = Nothing, matchQueryAnalyzer = Nothing, matchQueryMaxExpansions = Nothing, matchQueryLenient = Nothing})), filterBody = Nothing, sortBody = Nothing, aggBody = Nothing, highlight = Nothing, trackSortScores = False, from = From 0, size = Size 10, fields = Nothing}
572572-- >>> pageSearch (From 10) (Size 100) search
573−-- Search {queryBody = Just (QueryMatchQuery (MatchQuery {matchQueryField = FieldName "_all", matchQueryQueryString = QueryString "haskell", matchQueryOperator = Or, matchQueryZeroTerms = ZeroTermsNone, matchQueryCutoffFrequency = Nothing, matchQueryMatchType = Nothing, matchQueryAnalyzer = Nothing, matchQueryMaxExpansions = Nothing, matchQueryLenient = Nothing})), filterBody = Nothing, sortBody = Nothing, aggBody = Nothing, highlight = Nothing, trackSortScores = False, from = From 10, size = Size 100}
573+-- Search {queryBody = Just (QueryMatchQuery (MatchQuery {matchQueryField = FieldName "_all", matchQueryQueryString = QueryString "haskell", matchQueryOperator = Or, matchQueryZeroTerms = ZeroTermsNone, matchQueryCutoffFrequency = Nothing, matchQueryMatchType = Nothing, matchQueryAnalyzer = Nothing, matchQueryMaxExpansions = Nothing, matchQueryLenient = Nothing})), filterBody = Nothing, sortBody = Nothing, aggBody = Nothing, highlight = Nothing, trackSortScores = False, from = From 10, size = Size 100, fields = Nothing}
574574pageSearch :: From -- ^ The result offset
575575 -> Size -- ^ The number of results to return
576576 -> Search -- ^ The current seach
src/Database/Bloodhound/Types.hs+5−3
@@ -714,7 +714,8 @@ data Search = Search { queryBody :: Maybe Query
714714 -- default False
715715 , trackSortScores :: TrackSortScores
716716 , from :: From
717− , size :: Size } deriving (Eq, Show)
717+ , size :: Size
718+ , fields :: Maybe [FieldName] } deriving (Eq, Show)
718719
719720data Highlights = Highlights { globalsettings :: Maybe HighlightSettings
720721 , highlightFields :: [FieldHighlight]
@@ -2049,7 +2050,7 @@ instance (FromJSON a) => FromJSON (EsResult a) where
20492050
20502051
20512052instance ToJSON Search where
2052− toJSON (Search query sFilter sort searchAggs highlight sTrackSortScores sFrom sSize) =
2053+ toJSON (Search query sFilter sort searchAggs highlight sTrackSortScores sFrom sSize sFields) =
20532054 omitNulls [ "query" .= query
20542055 , "filter" .= sFilter
20552056 , "sort" .= sort
@@ -2057,7 +2058,8 @@ instance ToJSON Search where
20572058 , "highlight" .= highlight
20582059 , "from" .= sFrom
20592060 , "size" .= sSize
2060− , "track_scores" .= sTrackSortScores]
2061+ , "track_scores" .= sTrackSortScores
2062+ , "fields" .= sFields]
20612063
20622064
20632065instance ToJSON FieldHighlight where
tests/tests.hs+1−1
@@ -425,7 +425,7 @@ main = hspec $ do
425425 let sortSpec = DefaultSortSpec $ mkSort (FieldName "age") Ascending
426426 let search = Search Nothing
427427 (Just IdentityFilter) (Just [sortSpec]) Nothing Nothing
428− False (From 0) (Size 10)
428+ False (From 0) (Size 10) Nothing
429429 reply <- searchByIndex testIndex search
430430 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
431431 let myTweet = fmap (hitSource . head . hits . searchHits) result