git.iko.soy/typeable/bloodhound
on master help sign in
common terms query
ff2e480Chris Allen
Database/Bloodhound/Types.hs+5−2
@@ -101,6 +101,8 @@ module Database.Bloodhound.Types
101 , Tiebreaker(..)
101 , Tiebreaker(..)
102 , MinimumMatch(..)
102 , MinimumMatch(..)
103 , DisableCoord(..)
103 , DisableCoord(..)
104+ , CommonMinimumMatch(..)
105+ , MinimumMatchHighLow(..)
104 ) where
106 ) where
105
107
106import Data.Aeson
108import Data.Aeson
@@ -523,7 +525,8 @@ data BoostingQuery = BoostingQuery { positiveQuery :: Query
523 , negativeBoost :: Boost } deriving (Eq, Show)
525 , negativeBoost :: Boost } deriving (Eq, Show)
524
526
525data CommonTermsQuery =
527data CommonTermsQuery =
528+ CommonTermsQuery { commonField :: FieldName
526− CommonTermsQuery { commonQuery :: QueryString
529+ , commonQuery :: QueryString
527 , commonCutoffFrequency :: CutoffFrequency
530 , commonCutoffFrequency :: CutoffFrequency
528 , commonLowFreqOperator :: BooleanOperator
531 , commonLowFreqOperator :: BooleanOperator
529 , commonHighFreqOperator :: BooleanOperator
532 , commonHighFreqOperator :: BooleanOperator
@@ -534,7 +537,7 @@ data CommonTermsQuery =
534 } deriving (Eq, Show)
537 } deriving (Eq, Show)
535
538
536data CommonMinimumMatch = CommonMinimumMatchHighLow MinimumMatchHighLow
539data CommonMinimumMatch = CommonMinimumMatchHighLow MinimumMatchHighLow
537− | CommonMinimumMatch MinimumMatchText deriving (Eq, Show)
540+ | CommonMinimumMatch MinimumMatch deriving (Eq, Show)
538
541
539data MinimumMatchHighLow =
542data MinimumMatchHighLow =
540 MinimumMatchHighLow { lowFreq :: MinimumMatch
543 MinimumMatchHighLow { lowFreq :: MinimumMatch
Database/Bloodhound/Types/Instances.hs+27−3
@@ -13,6 +13,7 @@ import Data.Monoid
13import qualified Data.Text as T
13import qualified Data.Text as T
14import Database.Bloodhound.Types
14import Database.Bloodhound.Types
15import Database.Bloodhound.Types.Class
15import Database.Bloodhound.Types.Class
16+import Data.Scientific
16
17
17instance Monoid Filter where
18instance Monoid Filter where
18 mempty = IdentityFilter
19 mempty = IdentityFilter
@@ -129,9 +130,7 @@ instance ToJSON Query where
129 object [termField .= object merged]]
130 object [termField .= object merged]]
130 where
131 where
131 base = [ "value" .= termValue ]
132 base = [ "value" .= termValue ]
132− boosted = case boost of
133+ boosted = maybe [] (return . ("boost" .=)) boost
133− (Just boostValue) -> [ "boost" .= boostValue ]
134− Nothing -> []
135 merged = mappend base boosted
134 merged = mappend base boosted
136
135
137 toJSON (QueryMatchQuery matchQuery) =
136 toJSON (QueryMatchQuery matchQuery) =
@@ -146,11 +145,36 @@ instance ToJSON Query where
146 toJSON (QueryBoostingQuery boostingQuery) =
145 toJSON (QueryBoostingQuery boostingQuery) =
147 object ["boosting" .= toJSON boostingQuery]
146 object ["boosting" .= toJSON boostingQuery]
148
147
148+ toJSON (QueryCommonTermsQuery commonTermsQuery) =
149+ object ["common" .= toJSON commonTermsQuery]
149
150
150mField :: (ToJSON a, Functor f) => T.Text -> f a -> f (T.Text, Value)
151mField :: (ToJSON a, Functor f) => T.Text -> f a -> f (T.Text, Value)
151mField field = fmap ((field .=) . toJSON)
152mField field = fmap ((field .=) . toJSON)
152
153
153
154
155+instance ToJSON CommonTermsQuery where
156+ toJSON (CommonTermsQuery (FieldName fieldName)
157+ (QueryString query) cf lfo hfo msm
158+ boost analyzer disableCoord) =
159+ object [fieldName .= object conjoined]
160+ where base = [ "query" .= query
161+ , "cutoff_frequency" .= toJSON cf
162+ , "low_freq_operator" .= toJSON lfo
163+ , "high_freq_operator" .= toJSON hfo ]
164+ extension = catMaybes
165+ [ mField "minimum_should_match" msm
166+ , mField "boost" boost
167+ , mField "analyzer" analyzer
168+ , mField "disable_coord" disableCoord ]
169+ conjoined = base ++ extension
170+
171+
172+instance ToJSON CommonMinimumMatch where
173+ toJSON (CommonMinimumMatch mm) = toJSON mm
174+ toJSON (CommonMinimumMatchHighLow (MinimumMatchHighLow lowF highF)) =
175+ object [ "low_freq" .= toJSON lowF
176+ , "high_freq" .= toJSON highF ]
177+
154instance ToJSON BoostingQuery where
178instance ToJSON BoostingQuery where
155 toJSON (BoostingQuery positiveQuery negativeQuery negativeBoost) =
179 toJSON (BoostingQuery positiveQuery negativeQuery negativeBoost) =
156 object [ "positive" .= toJSON positiveQuery
180 object [ "positive" .= toJSON positiveQuery
tests/tests.hs+12
@@ -191,6 +191,18 @@ main = hspec $ do
191 myTweet <- searchTweet search
191 myTweet <- searchTweet search
192 myTweet `shouldBe` Right exampleTweet
192 myTweet `shouldBe` Right exampleTweet
193
193
194+ it "returns document for common terms query" $ do
195+ _ <- insertData
196+ let query = QueryCommonTermsQuery $
197+ CommonTermsQuery (FieldName "user")
198+ (QueryString "bitemyapp")
199+ (CutoffFrequency 0.0001)
200+ Or Or Nothing Nothing Nothing Nothing
201+ let search = mkSearch (Just query) Nothing
202+ myTweet <- searchTweet search
203+ myTweet `shouldBe` Right exampleTweet
204+
205+
194 describe "sorting" $ do
206 describe "sorting" $ do
195 it "returns documents in the right order" $ do
207 it "returns documents in the right order" $ do
196 _ <- insertData
208 _ <- insertData