From ff6abcb5341566dd1d09bdbaccd435a388df087c Mon Sep 17 00:00:00 2001 From: Aaron Hodgen Date: Thu, 3 May 2018 13:24:59 -0400 Subject: [PATCH 1/2] Add wildcard query support --- src/Database/V5/Bloodhound/Internal/Query.hs | 28 +++++++++++++++++++- src/Database/V5/Bloodhound/Types.hs | 1 + 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Database/V5/Bloodhound/Internal/Query.hs b/src/Database/V5/Bloodhound/Internal/Query.hs index 69b7814..8ebaf2d 100644 --- a/src/Database/V5/Bloodhound/Internal/Query.hs +++ b/src/Database/V5/Bloodhound/Internal/Query.hs @@ -47,6 +47,7 @@ data Query = | QueryExistsQuery FieldName | QueryTemplateQueryInline TemplateQueryInline | QueryMatchNoneQuery + | QueryWildcardQuery WildcardQuery deriving (Eq, Show) instance ToJSON Query where @@ -147,6 +148,9 @@ instance ToJSON Query where toJSON (QueryTemplateQueryInline templateQuery) = object [ "template" .= templateQuery ] + toJSON (QueryWildcardQuery query) = + object [ "wildcard" .= query ] + instance FromJSON Query where parseJSON v = withObject "Query" parse v where parse o = termQuery `taggedWith` "term" @@ -176,6 +180,7 @@ instance FromJSON Query where <|> queryRegexpQuery `taggedWith` "regexp" <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string" <|> queryTemplateQueryInline `taggedWith` "template" + <|> queryWildcardQuery `taggedWith` "wildcard" where taggedWith parser k = parser =<< o .: k termQuery = fieldTagged $ \(FieldName fn) o -> TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost" @@ -215,6 +220,7 @@ instance FromJSON Query where querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery -- queryExistsQuery o = QueryExistsQuery <$> o .: "field" queryTemplateQueryInline = pure . QueryTemplateQueryInline + queryWildcardQuery = pure . QueryWildcardQuery -- | As of Elastic 2.0, 'Filters' are just 'Queries' housed in a -- Bool Query, and flagged in a different context. @@ -251,6 +257,26 @@ instance FromJSON RegexpQuery where <*> o .: "flags" <*> o .:? "boost" +data WildcardQuery = + WildcardQuery { wildcardQueryField :: FieldName + , wildcardQuery :: Text + , wildcardQueryBoost :: Maybe Boost + } deriving (Eq, Show) + +instance ToJSON WildcardQuery where + toJSON (WildcardQuery (FieldName wcQueryField) + (wcQueryQuery) wcQueryBoost) = + object [ wcQueryField .= omitNulls base ] + where base = [ "value" .= wcQueryQuery + , "boost" .= wcQueryBoost ] + +instance FromJSON WildcardQuery where + parseJSON = withObject "WildcardQuery" parse + where parse = fieldTagged $ \fn o -> + WildcardQuery fn + <$> o .: "value" + <*> o .:? "boost" + data RangeQuery = RangeQuery { rangeQueryField :: FieldName , rangeQueryRange :: RangeValue @@ -1219,7 +1245,7 @@ parseRangeValue mkGt mkLt mkGte mkLte (Nothing, Nothing, Nothing, Nothing) -> nada - + instance FromJSON RangeValue where parseJSON = withObject "RangeValue" parse where parse o = parseDate o diff --git a/src/Database/V5/Bloodhound/Types.hs b/src/Database/V5/Bloodhound/Types.hs index 403f771..5882797 100644 --- a/src/Database/V5/Bloodhound/Types.hs +++ b/src/Database/V5/Bloodhound/Types.hs @@ -218,6 +218,7 @@ module Database.V5.Bloodhound.Types , QueryString(..) , TemplateQueryInline(..) , TemplateQueryKeyValuePairs(..) + , WildcardQuery(..) , BooleanOperator(..) , ZeroTermsQuery(..) , CutoffFrequency(..) From 348b6bc44ddbbfc1120b81ea36b1137f06566b24 Mon Sep 17 00:00:00 2001 From: Aaron Hodgen Date: Fri, 4 May 2018 09:39:42 -0400 Subject: [PATCH 2/2] Add a test and changelog history. --- changelog.md | 2 ++ tests/V5/Test/Query.hs | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/changelog.md b/changelog.md index 9849a64..a64c253 100644 --- a/changelog.md +++ b/changelog.md @@ -16,6 +16,8 @@ - @rvl - Add [character filters][] to the `AnalyzerDefinition` type. - Add the "stemmer" and "stop" [token filters][] to `TokenFilterDefinition`. +- @ahodgen + - Add support for wildcard queries [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 diff --git a/tests/V5/Test/Query.hs b/tests/V5/Test/Query.hs index 364a836..e50e15d 100644 --- a/tests/V5/Test/Query.hs +++ b/tests/V5/Test/Query.hs @@ -113,3 +113,11 @@ spec = search = mkSearch (Just templateQuery) Nothing myTweet <- searchTweet search liftIO $ myTweet `shouldBe` Right exampleTweet + + it "returns document for wildcard query" $ withTestEnv $ do + _ <- insertData + let query = QueryWildcardQuery $ WildcardQuery (FieldName "user") "bitemy*" (Nothing) + let search = mkSearch (Just query) Nothing + myTweet <- searchTweet search + liftIO $ + myTweet `shouldBe` Right exampleTweet