git.iko.soy/typeable/bloodhound
on master help sign in
Merge pull request #241 from ashutoshrishi/match-query-fuzziness
54c53c6Chris Allen
changelog.md+4
@@ -22,9 +22,13 @@
22 - Add the "stemmer" and "stop" [token filters][] to `TokenFilterDefinition`.
22 - Add the "stemmer" and "stop" [token filters][] to `TokenFilterDefinition`.
23- @ahodgen
23- @ahodgen
24 - Add support for wildcard queries
24 - Add support for wildcard queries
25+- @ashutoshrishi
26+ - Added [fuzziness][] option to a Match Query
27+ - Added support for "AUTO" Fuzziness alongside a numeric value.
25
28
26[Character Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-charfilters.html
29[Character Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-charfilters.html
27[Token Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-tokenfilters.html
30[Token Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-tokenfilters.html
31+[Fuzziness]: https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#fuzziness
28
32
290.15.0.2
330.15.0.2
30========
34========
src/Database/V5/Bloodhound/Internal/Newtypes.hs−2
@@ -110,8 +110,6 @@ newtype MinimumTermFrequency =
110 MinimumTermFrequency Int deriving (Eq, Show, FromJSON, ToJSON)
110 MinimumTermFrequency Int deriving (Eq, Show, FromJSON, ToJSON)
111newtype MaxQueryTerms =
111newtype MaxQueryTerms =
112 MaxQueryTerms Int deriving (Eq, Show, FromJSON, ToJSON)
112 MaxQueryTerms Int deriving (Eq, Show, FromJSON, ToJSON)
113−newtype Fuzziness =
114− Fuzziness Double deriving (Eq, Show, FromJSON, ToJSON)
115
113
116{-| 'PrefixLength' is the prefix length used in queries, defaults to 0. -}
114{-| 'PrefixLength' is the prefix length used in queries, defaults to 0. -}
117newtype PrefixLength =
115newtype PrefixLength =
src/Database/V5/Bloodhound/Internal/Query.hs+29−12
@@ -834,17 +834,18 @@ instance FromJSON DisMaxQuery where
834 <*> o .:? "boost"
834 <*> o .:? "boost"
835
835
836data MatchQuery = MatchQuery
836data MatchQuery = MatchQuery
837− { matchQueryField :: FieldName
837+ { matchQueryField :: FieldName
838− , matchQueryQueryString :: QueryString
838+ , matchQueryQueryString :: QueryString
839− , matchQueryOperator :: BooleanOperator
839+ , matchQueryOperator :: BooleanOperator
840− , matchQueryZeroTerms :: ZeroTermsQuery
840+ , matchQueryZeroTerms :: ZeroTermsQuery
841− , matchQueryCutoffFrequency :: Maybe CutoffFrequency
841+ , matchQueryCutoffFrequency :: Maybe CutoffFrequency
842− , matchQueryMatchType :: Maybe MatchQueryType
842+ , matchQueryMatchType :: Maybe MatchQueryType
843− , matchQueryAnalyzer :: Maybe Analyzer
843+ , matchQueryAnalyzer :: Maybe Analyzer
844− , matchQueryMaxExpansions :: Maybe MaxExpansions
844+ , matchQueryMaxExpansions :: Maybe MaxExpansions
845− , matchQueryLenient :: Maybe Lenient
845+ , matchQueryLenient :: Maybe Lenient
846− , matchQueryBoost :: Maybe Boost
846+ , matchQueryBoost :: Maybe Boost
847 , matchQueryMinimumShouldMatch :: Maybe Text
847 , matchQueryMinimumShouldMatch :: Maybe Text
848+ , matchQueryFuzziness :: Maybe Fuzziness
848 } deriving (Eq, Show)
849 } deriving (Eq, Show)
849
850
850
851
@@ -853,7 +854,7 @@ instance ToJSON MatchQuery where
853 (QueryString mqQueryString) booleanOperator
854 (QueryString mqQueryString) booleanOperator
854 zeroTermsQuery cutoffFrequency matchQueryType
855 zeroTermsQuery cutoffFrequency matchQueryType
855 analyzer maxExpansions lenient boost
856 analyzer maxExpansions lenient boost
856− minShouldMatch
857+ minShouldMatch mqFuzziness
857 ) =
858 ) =
858 object [ fieldName .= omitNulls base ]
859 object [ fieldName .= omitNulls base ]
859 where base = [ "query" .= mqQueryString
860 where base = [ "query" .= mqQueryString
@@ -866,6 +867,7 @@ instance ToJSON MatchQuery where
866 , "lenient" .= lenient
867 , "lenient" .= lenient
867 , "boost" .= boost
868 , "boost" .= boost
868 , "minimum_should_match" .= minShouldMatch
869 , "minimum_should_match" .= minShouldMatch
870+ , "fuzziness" .= mqFuzziness
869 ]
871 ]
870
872
871instance FromJSON MatchQuery where
873instance FromJSON MatchQuery where
@@ -882,12 +884,13 @@ instance FromJSON MatchQuery where
882 <*> o .:? "lenient"
884 <*> o .:? "lenient"
883 <*> o .:? "boost"
885 <*> o .:? "boost"
884 <*> o .:? "minimum_should_match"
886 <*> o .:? "minimum_should_match"
887+ <*> o .:? "fuzziness"
885
888
886{-| 'mkMatchQuery' is a convenience function that defaults the less common parameters,
889{-| 'mkMatchQuery' is a convenience function that defaults the less common parameters,
887 enabling you to provide only the 'FieldName' and 'QueryString' to make a 'MatchQuery'
890 enabling you to provide only the 'FieldName' and 'QueryString' to make a 'MatchQuery'
888-}
891-}
889mkMatchQuery :: FieldName -> QueryString -> MatchQuery
892mkMatchQuery :: FieldName -> QueryString -> MatchQuery
890−mkMatchQuery field query = MatchQuery field query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing Nothing
893+mkMatchQuery field query = MatchQuery field query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
891
894
892data MatchQueryType =
895data MatchQueryType =
893 MatchPhrase
896 MatchPhrase
@@ -1621,3 +1624,17 @@ fieldTagged :: Monad m => (FieldName -> Object -> m a) -> Object -> m a
1621fieldTagged f o = case HM.toList o of
1624fieldTagged f o = case HM.toList o of
1622 [(k, Object o')] -> f (FieldName k) o'
1625 [(k, Object o')] -> f (FieldName k) o'
1623 _ -> fail "Expected object with 1 field-named key"
1626 _ -> fail "Expected object with 1 field-named key"
1627+
1628+-- | Fuzziness value as a number or 'AUTO'.
1629+-- See:
1630+-- https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#fuzziness
1631+data Fuzziness = Fuzziness Double | FuzzinessAuto
1632+ deriving (Eq, Show)
1633+
1634+instance ToJSON Fuzziness where
1635+ toJSON (Fuzziness n) = toJSON n
1636+ toJSON FuzzinessAuto = String "AUTO"
1637+
1638+instance FromJSON Fuzziness where
1639+ parseJSON (String "AUTO") = return FuzzinessAuto
1640+ parseJSON v = Fuzziness <$> parseJSON v
tests/V5/Test/Query.hs+9
@@ -46,6 +46,15 @@ spec =
46 liftIO $
46 liftIO $
47 myTweet `shouldBe` Right exampleTweet
47 myTweet `shouldBe` Right exampleTweet
48
48
49+ it "returns document for match query with fuzziness" $ withTestEnv $ do
50+ _ <- insertData
51+ let match = mkMatchQuery (FieldName "user") (QueryString "bidemyapp")
52+ let query = QueryMatchQuery $ match { matchQueryFuzziness = Just FuzzinessAuto }
53+ let search = mkSearch (Just query) Nothing
54+ myTweet <- searchTweet search
55+ liftIO $
56+ myTweet `shouldBe` Right exampleTweet
57+
49 it "returns document for multi-match query" $ withTestEnv $ do
58 it "returns document for multi-match query" $ withTestEnv $ do
50 _ <- insertData
59 _ <- insertData
51 let flds = [FieldName "user", FieldName "message"]
60 let flds = [FieldName "user", FieldName "message"]