Merge pull request #241 from ashutoshrishi/match-query-fuzziness

Match query fuzziness
This commit is contained in:
Chris Allen 2019-02-04 10:18:29 -06:00 committed by GitHub
commit 54c53c6923
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 14 deletions

View File

@ -22,9 +22,13 @@
- Add the "stemmer" and "stop" [token filters][] to `TokenFilterDefinition`.
- @ahodgen
- Add support for wildcard queries
- @ashutoshrishi
- Added [fuzziness][] option to a Match Query
- Added support for "AUTO" Fuzziness alongside a numeric value.
[Character Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-charfilters.html
[Token Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-tokenfilters.html
[Fuzziness]: https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#fuzziness
0.15.0.2
========

View File

@ -110,8 +110,6 @@ newtype MinimumTermFrequency =
MinimumTermFrequency Int deriving (Eq, Show, FromJSON, ToJSON)
newtype MaxQueryTerms =
MaxQueryTerms Int deriving (Eq, Show, FromJSON, ToJSON)
newtype Fuzziness =
Fuzziness Double deriving (Eq, Show, FromJSON, ToJSON)
{-| 'PrefixLength' is the prefix length used in queries, defaults to 0. -}
newtype PrefixLength =

View File

@ -834,17 +834,18 @@ instance FromJSON DisMaxQuery where
<*> o .:? "boost"
data MatchQuery = MatchQuery
{ matchQueryField :: FieldName
, matchQueryQueryString :: QueryString
, matchQueryOperator :: BooleanOperator
, matchQueryZeroTerms :: ZeroTermsQuery
, matchQueryCutoffFrequency :: Maybe CutoffFrequency
, matchQueryMatchType :: Maybe MatchQueryType
, matchQueryAnalyzer :: Maybe Analyzer
, matchQueryMaxExpansions :: Maybe MaxExpansions
, matchQueryLenient :: Maybe Lenient
, matchQueryBoost :: Maybe Boost
{ matchQueryField :: FieldName
, matchQueryQueryString :: QueryString
, matchQueryOperator :: BooleanOperator
, matchQueryZeroTerms :: ZeroTermsQuery
, matchQueryCutoffFrequency :: Maybe CutoffFrequency
, matchQueryMatchType :: Maybe MatchQueryType
, matchQueryAnalyzer :: Maybe Analyzer
, matchQueryMaxExpansions :: Maybe MaxExpansions
, matchQueryLenient :: Maybe Lenient
, matchQueryBoost :: Maybe Boost
, matchQueryMinimumShouldMatch :: Maybe Text
, matchQueryFuzziness :: Maybe Fuzziness
} deriving (Eq, Show)
@ -853,7 +854,7 @@ instance ToJSON MatchQuery where
(QueryString mqQueryString) booleanOperator
zeroTermsQuery cutoffFrequency matchQueryType
analyzer maxExpansions lenient boost
minShouldMatch
minShouldMatch mqFuzziness
) =
object [ fieldName .= omitNulls base ]
where base = [ "query" .= mqQueryString
@ -866,6 +867,7 @@ instance ToJSON MatchQuery where
, "lenient" .= lenient
, "boost" .= boost
, "minimum_should_match" .= minShouldMatch
, "fuzziness" .= mqFuzziness
]
instance FromJSON MatchQuery where
@ -882,12 +884,13 @@ instance FromJSON MatchQuery where
<*> o .:? "lenient"
<*> o .:? "boost"
<*> o .:? "minimum_should_match"
<*> o .:? "fuzziness"
{-| 'mkMatchQuery' is a convenience function that defaults the less common parameters,
enabling you to provide only the 'FieldName' and 'QueryString' to make a 'MatchQuery'
-}
mkMatchQuery :: FieldName -> QueryString -> MatchQuery
mkMatchQuery field query = MatchQuery field query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing Nothing
mkMatchQuery field query = MatchQuery field query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
data MatchQueryType =
MatchPhrase
@ -1621,3 +1624,17 @@ fieldTagged :: Monad m => (FieldName -> Object -> m a) -> Object -> m a
fieldTagged f o = case HM.toList o of
[(k, Object o')] -> f (FieldName k) o'
_ -> fail "Expected object with 1 field-named key"
-- | Fuzziness value as a number or 'AUTO'.
-- See:
-- https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#fuzziness
data Fuzziness = Fuzziness Double | FuzzinessAuto
deriving (Eq, Show)
instance ToJSON Fuzziness where
toJSON (Fuzziness n) = toJSON n
toJSON FuzzinessAuto = String "AUTO"
instance FromJSON Fuzziness where
parseJSON (String "AUTO") = return FuzzinessAuto
parseJSON v = Fuzziness <$> parseJSON v

View File

@ -46,6 +46,15 @@ spec =
liftIO $
myTweet `shouldBe` Right exampleTweet
it "returns document for match query with fuzziness" $ withTestEnv $ do
_ <- insertData
let match = mkMatchQuery (FieldName "user") (QueryString "bidemyapp")
let query = QueryMatchQuery $ match { matchQueryFuzziness = Just FuzzinessAuto }
let search = mkSearch (Just query) Nothing
myTweet <- searchTweet search
liftIO $
myTweet `shouldBe` Right exampleTweet
it "returns document for multi-match query" $ withTestEnv $ do
_ <- insertData
let flds = [FieldName "user", FieldName "message"]