git.iko.soy/typeable/bloodhound
on master help sign in
MultiMatchQueryType implemented
commitaef9e08d0b9342458cf6b90180f964a0103b2077 authorChris Allen <cma@bitemyapp.com> dateSun 27 Apr 2014, 04:57 (12 years ago) parent069704a
3 files changed+55−3
Database/Bloodhound/Types.hs+13−3 Database/Bloodhound/Types/Instances.hs+34 tests/tests.hs+8
Database/Bloodhound/Types.hs+13−3
@@ -11,6 +11,7 @@ module Database.Bloodhound.Types
1111 , showText
1212 , unpackId
1313 , mkMatchQuery
14+ , mkMultiMatchQuery
1415 , Version(..)
1516 , Status(..)
1617 , Existence(..)
@@ -95,6 +96,8 @@ module Database.Bloodhound.Types
9596 , MaxExpansions(..)
9697 , Lenient(..)
9798 , MatchQueryType(..)
99+ , MultiMatchQueryType(..)
100+ , Tiebreaker(..)
98101 ) where
99102
100103import Data.Aeson
@@ -167,7 +170,7 @@ data EsResult a = EsResult { _index :: Text
167170type Sort = [SortSpec]
168171
169172data SortSpec = DefaultSortSpec DefaultSort
170− | GeoDistanceSortSpec SortOrder GeoPoint deriving (Eq, Show)
173+ | GeoDistanceSortSpec SortOrder GeoPoint DistanceUnit deriving (Eq, Show)
171174
172175data DefaultSort =
173176 DefaultSort { sortFieldName :: FieldName
@@ -216,7 +219,7 @@ newtype CutoffFrequency = CutoffFrequency Double deriving (Eq, Show, Ge
216219newtype Analyzer = Analyzer Text deriving (Eq, Show, Generic)
217220newtype MaxExpansions = MaxExpansions Int deriving (Eq, Show, Generic)
218221newtype Lenient = Lenient Bool deriving (Eq, Show, Generic)
219−newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show)
222+newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show, Generic)
220223newtype Boost = Boost Double deriving (Eq, Show, Generic)
221224newtype BoostTerms = BoostTerms Double deriving (Eq, Show)
222225newtype MinimumMatch = MinimumMatch Int deriving (Eq, Show)
@@ -494,6 +497,10 @@ data MultiMatchQuery =
494497 , multiMatchQueryMaxExpansions :: Maybe MaxExpansions
495498 , multiMatchQueryLenient :: Maybe Lenient } deriving (Eq, Show)
496499
500+mkMultiMatchQuery :: [FieldName] -> QueryString -> MultiMatchQuery
501+mkMultiMatchQuery fields query =
502+ MultiMatchQuery fields query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing
503+
497504data MultiMatchQueryType = MultiMatchBestFields
498505 | MultiMatchMostFields
499506 | MultiMatchCrossFields
@@ -666,9 +673,12 @@ data ShardResult =
666673 , shardsSuccessful :: Int
667674 , shardsFailed :: Int } deriving (Eq, Show, Generic)
668675
669−-- defaultFieldMaybeJSON :: Text -> Maybe a ->
676+maybeJson ToJSON a => Text -> Maybe a -> [Data.Aeson.Types.Internal.Pair]
670677maybeJson field (Just value) = [field .= toJSON value]
671678maybeJson _ _ = []
679+
680+maybeJsonF :: (ToJSON (f Value), ToJSON a, Functor f) =>
681+ Text -> Maybe (f a) -> [Data.Aeson.Types.Internal.Pair]
672682maybeJsonF field (Just value) = [field .= fmap toJSON value]
673683maybeJsonF _ _ = []
674684
Database/Bloodhound/Types/Instances.hs+34
@@ -137,6 +137,8 @@ instance ToJSON Query where
137137 toJSON (QueryMatchQuery matchQuery) =
138138 object ["match" .= toJSON matchQuery]
139139
140+ toJSON (QueryMultiMatchQuery multiMatchQuery) =
141+ object ["multi_match" .= toJSON multiMatchQuery]
140142
141143instance ToJSON MatchQuery where
142144 toJSON (MatchQuery (FieldName fieldName)
@@ -155,6 +157,29 @@ instance ToJSON MatchQuery where
155157 , f "max_expansions" maxExpansions
156158 , f "lenient" lenient ]
157159
160+instance ToJSON MultiMatchQuery where
161+ toJSON (MultiMatchQuery fields (QueryString query) boolOp
162+ ztQ tb mmqt cf analyzer maxEx lenient) =
163+ object ["multi_match" .= object conjoined]
164+ where baseQuery = [ "fields" .= fmap toJSON fields
165+ , "query" .= query
166+ , "operator" .= toJSON boolOp
167+ , "zero_terms_query" .= toJSON ztQ ]
168+ f field = fmap ((field .=) . toJSON)
169+ maybeAdd = catMaybes [ f "tiebreaker" tb
170+ , f "type" mmqt
171+ , f "cutoff_frequency" cf
172+ , f "analyzer" analyzer
173+ , f "max_expansions" maxEx
174+ , f "lenient" lenient ]
175+ conjoined = baseQuery ++ maybeAdd
176+
177+instance ToJSON MultiMatchQueryType where
178+ toJSON MultiMatchBestFields = "best_fields"
179+ toJSON MultiMatchMostFields = "most_fields"
180+ toJSON MultiMatchCrossFields = "cross_fields"
181+ toJSON MultiMatchPhrase = "phrase"
182+ toJSON MultiMatchPhrasePrefix = "phrase_prefix"
158183
159184instance ToJSON BooleanOperator where
160185 toJSON And = String "and"
@@ -168,6 +193,9 @@ instance ToJSON MatchQueryType where
168193 toJSON MatchPhrase = "phrase"
169194 toJSON MatchPhrasePrefix = "phrase_prefix"
170195
196+instance ToJSON FieldName where
197+ toJSON (FieldName fieldName) = String fieldName
198+
171199instance ToJSON ReplicaCount
172200instance ToJSON ShardCount
173201instance ToJSON CutoffFrequency
@@ -176,6 +204,7 @@ instance ToJSON MaxExpansions
176204instance ToJSON Lenient
177205instance ToJSON Boost
178206instance ToJSON Version
207+instance ToJSON Tiebreaker
179208instance FromJSON Version
180209instance FromJSON IndexName
181210instance FromJSON MappingName
@@ -233,6 +262,11 @@ instance ToJSON SortSpec where
233262 lNestedFilter = maybeJson "nested_filter" nestedFilter
234263 merged = mconcat [base, lSortMode, lMissingSort, lNestedFilter]
235264
265+ toJSON (GeoDistanceSortSpec sortOrder (GeoPoint (FieldName field) latLon) units) =
266+ object [ "unit" .= toJSON units
267+ , field .= toJSON latLon
268+ , "order" .= toJSON sortOrder ]
269+
236270
237271instance ToJSON SortOrder where
238272 toJSON Ascending = String "asc"
tests/tests.hs+8
@@ -164,6 +164,14 @@ main = hspec $ do
164164 myTweet <- searchTweet search
165165 myTweet `shouldBe` Right exampleTweet
166166
167+ it "returns document for multi-match query" $ do
168+ _ <- insertData
169+ let fields = [FieldName "user", FieldName "message"]
170+ let query = QueryMultiMatchQuery $ mkMultiMatchQuery fields (QueryString "bitemyapp")
171+ let search = mkSearch (Just query) Nothing
172+ myTweet <- searchTweet search
173+ myTweet `shouldBe` Right exampleTweet
174+
167175 describe "sorting" $ do
168176 it "returns documents in the right order" $ do
169177 _ <- insertData