git.iko.soy/typeable/bloodhound
on master help sign in
Merge pull request #241 from ashutoshrishi/match-query-fuzziness

Match query fuzziness

commit54c53c692354eae8a9fa4a2c21cf7176bb212413 authorChris Allen <cma@bitemyapp.com> dateMon 4 Feb 2019, 10:18 (8 years ago) parenta1d27295bc6bb3
4 files changed+42−14
changelog.md+4 src/Database/V5/Bloodhound/Internal/Newtypes.hs−2 src/Database/V5/Bloodhound/Internal/Query.hs+29−12 tests/V5/Test/Query.hs+9
changelog.md+4
@@ -22,9 +22,13 @@
2222 - Add the "stemmer" and "stop" [token filters][] to `TokenFilterDefinition`.
2323- @ahodgen
2424 - 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.
2528
2629[Character Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-charfilters.html
2730[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
2832
29330.15.0.2
3034========
src/Database/V5/Bloodhound/Internal/Newtypes.hs−2
@@ -110,8 +110,6 @@ newtype MinimumTermFrequency =
110110 MinimumTermFrequency Int deriving (Eq, Show, FromJSON, ToJSON)
111111newtype MaxQueryTerms =
112112 MaxQueryTerms Int deriving (Eq, Show, FromJSON, ToJSON)
113−newtype Fuzziness =
114− Fuzziness Double deriving (Eq, Show, FromJSON, ToJSON)
115113
116114{-| 'PrefixLength' is the prefix length used in queries, defaults to 0. -}
117115newtype PrefixLength =
src/Database/V5/Bloodhound/Internal/Query.hs+29−12
@@ -834,17 +834,18 @@ instance FromJSON DisMaxQuery where
834834 <*> o .:? "boost"
835835
836836data MatchQuery = MatchQuery
837− { matchQueryField :: FieldName
838− , matchQueryQueryString :: QueryString
839− , matchQueryOperator :: BooleanOperator
840− , matchQueryZeroTerms :: ZeroTermsQuery
841− , matchQueryCutoffFrequency :: Maybe CutoffFrequency
842− , matchQueryMatchType :: Maybe MatchQueryType
843− , matchQueryAnalyzer :: Maybe Analyzer
844− , matchQueryMaxExpansions :: Maybe MaxExpansions
845− , matchQueryLenient :: Maybe Lenient
846− , matchQueryBoost :: Maybe Boost
837+ { matchQueryField :: FieldName
838+ , matchQueryQueryString :: QueryString
839+ , matchQueryOperator :: BooleanOperator
840+ , matchQueryZeroTerms :: ZeroTermsQuery
841+ , matchQueryCutoffFrequency :: Maybe CutoffFrequency
842+ , matchQueryMatchType :: Maybe MatchQueryType
843+ , matchQueryAnalyzer :: Maybe Analyzer
844+ , matchQueryMaxExpansions :: Maybe MaxExpansions
845+ , matchQueryLenient :: Maybe Lenient
846+ , matchQueryBoost :: Maybe Boost
847847 , matchQueryMinimumShouldMatch :: Maybe Text
848+ , matchQueryFuzziness :: Maybe Fuzziness
848849 } deriving (Eq, Show)
849850
850851
@@ -853,7 +854,7 @@ instance ToJSON MatchQuery where
853854 (QueryString mqQueryString) booleanOperator
854855 zeroTermsQuery cutoffFrequency matchQueryType
855856 analyzer maxExpansions lenient boost
856− minShouldMatch
857+ minShouldMatch mqFuzziness
857858 ) =
858859 object [ fieldName .= omitNulls base ]
859860 where base = [ "query" .= mqQueryString
@@ -866,6 +867,7 @@ instance ToJSON MatchQuery where
866867 , "lenient" .= lenient
867868 , "boost" .= boost
868869 , "minimum_should_match" .= minShouldMatch
870+ , "fuzziness" .= mqFuzziness
869871 ]
870872
871873instance FromJSON MatchQuery where
@@ -882,12 +884,13 @@ instance FromJSON MatchQuery where
882884 <*> o .:? "lenient"
883885 <*> o .:? "boost"
884886 <*> o .:? "minimum_should_match"
887+ <*> o .:? "fuzziness"
885888
886889{-| 'mkMatchQuery' is a convenience function that defaults the less common parameters,
887890 enabling you to provide only the 'FieldName' and 'QueryString' to make a 'MatchQuery'
888891-}
889892mkMatchQuery :: 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
891894
892895data MatchQueryType =
893896 MatchPhrase
@@ -1621,3 +1624,17 @@ fieldTagged :: Monad m => (FieldName -> Object -> m a) -> Object -> m a
16211624fieldTagged f o = case HM.toList o of
16221625 [(k, Object o')] -> f (FieldName k) o'
16231626 _ -> 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 =
4646 liftIO $
4747 myTweet `shouldBe` Right exampleTweet
4848
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+
4958 it "returns document for multi-match query" $ withTestEnv $ do
5059 _ <- insertData
5160 let flds = [FieldName "user", FieldName "message"]