git.iko.soy/typeable/bloodhound
on master help sign in
Merge pull request #236 from ahodgen/wildcard
a6fe919Chris Allen
changelog.md+2
@@ -16,6 +16,8 @@
16- @rvl
16- @rvl
17 - Add [character filters][] to the `AnalyzerDefinition` type.
17 - Add [character filters][] to the `AnalyzerDefinition` type.
18 - Add the "stemmer" and "stop" [token filters][] to `TokenFilterDefinition`.
18 - Add the "stemmer" and "stop" [token filters][] to `TokenFilterDefinition`.
19+- @ahodgen
20+ - Add support for wildcard queries
19
21
20[Character Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-charfilters.html
22[Character Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-charfilters.html
21[Token Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-tokenfilters.html
23[Token Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-tokenfilters.html
src/Database/V5/Bloodhound/Internal/Query.hs+27−1
@@ -47,6 +47,7 @@ data Query =
47 | QueryExistsQuery FieldName
47 | QueryExistsQuery FieldName
48 | QueryTemplateQueryInline TemplateQueryInline
48 | QueryTemplateQueryInline TemplateQueryInline
49 | QueryMatchNoneQuery
49 | QueryMatchNoneQuery
50+ | QueryWildcardQuery WildcardQuery
50 deriving (Eq, Show)
51 deriving (Eq, Show)
51
52
52instance ToJSON Query where
53instance ToJSON Query where
@@ -147,6 +148,9 @@ instance ToJSON Query where
147 toJSON (QueryTemplateQueryInline templateQuery) =
148 toJSON (QueryTemplateQueryInline templateQuery) =
148 object [ "template" .= templateQuery ]
149 object [ "template" .= templateQuery ]
149
150
151+ toJSON (QueryWildcardQuery query) =
152+ object [ "wildcard" .= query ]
153+
150instance FromJSON Query where
154instance FromJSON Query where
151 parseJSON v = withObject "Query" parse v
155 parseJSON v = withObject "Query" parse v
152 where parse o = termQuery `taggedWith` "term"
156 where parse o = termQuery `taggedWith` "term"
@@ -176,6 +180,7 @@ instance FromJSON Query where
176 <|> queryRegexpQuery `taggedWith` "regexp"
180 <|> queryRegexpQuery `taggedWith` "regexp"
177 <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"
181 <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"
178 <|> queryTemplateQueryInline `taggedWith` "template"
182 <|> queryTemplateQueryInline `taggedWith` "template"
183+ <|> queryWildcardQuery `taggedWith` "wildcard"
179 where taggedWith parser k = parser =<< o .: k
184 where taggedWith parser k = parser =<< o .: k
180 termQuery = fieldTagged $ \(FieldName fn) o ->
185 termQuery = fieldTagged $ \(FieldName fn) o ->
181 TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"
186 TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"
@@ -215,6 +220,7 @@ instance FromJSON Query where
215 querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery
220 querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery
216 -- queryExistsQuery o = QueryExistsQuery <$> o .: "field"
221 -- queryExistsQuery o = QueryExistsQuery <$> o .: "field"
217 queryTemplateQueryInline = pure . QueryTemplateQueryInline
222 queryTemplateQueryInline = pure . QueryTemplateQueryInline
223+ queryWildcardQuery = pure . QueryWildcardQuery
218
224
219-- | As of Elastic 2.0, 'Filters' are just 'Queries' housed in a
225-- | As of Elastic 2.0, 'Filters' are just 'Queries' housed in a
220-- Bool Query, and flagged in a different context.
226-- Bool Query, and flagged in a different context.
@@ -251,6 +257,26 @@ instance FromJSON RegexpQuery where
251 <*> o .: "flags"
257 <*> o .: "flags"
252 <*> o .:? "boost"
258 <*> o .:? "boost"
253
259
260+data WildcardQuery =
261+ WildcardQuery { wildcardQueryField :: FieldName
262+ , wildcardQuery :: Text
263+ , wildcardQueryBoost :: Maybe Boost
264+ } deriving (Eq, Show)
265+
266+instance ToJSON WildcardQuery where
267+ toJSON (WildcardQuery (FieldName wcQueryField)
268+ (wcQueryQuery) wcQueryBoost) =
269+ object [ wcQueryField .= omitNulls base ]
270+ where base = [ "value" .= wcQueryQuery
271+ , "boost" .= wcQueryBoost ]
272+
273+instance FromJSON WildcardQuery where
274+ parseJSON = withObject "WildcardQuery" parse
275+ where parse = fieldTagged $ \fn o ->
276+ WildcardQuery fn
277+ <$> o .: "value"
278+ <*> o .:? "boost"
279+
254data RangeQuery =
280data RangeQuery =
255 RangeQuery { rangeQueryField :: FieldName
281 RangeQuery { rangeQueryField :: FieldName
256 , rangeQueryRange :: RangeValue
282 , rangeQueryRange :: RangeValue
@@ -1219,7 +1245,7 @@ parseRangeValue mkGt mkLt mkGte mkLte
1219 (Nothing, Nothing, Nothing, Nothing) ->
1245 (Nothing, Nothing, Nothing, Nothing) ->
1220 nada
1246 nada
1221
1247
1222−
1248+
1223instance FromJSON RangeValue where
1249instance FromJSON RangeValue where
1224 parseJSON = withObject "RangeValue" parse
1250 parseJSON = withObject "RangeValue" parse
1225 where parse o = parseDate o
1251 where parse o = parseDate o
src/Database/V5/Bloodhound/Types.hs+1
@@ -218,6 +218,7 @@ module Database.V5.Bloodhound.Types
218 , QueryString(..)
218 , QueryString(..)
219 , TemplateQueryInline(..)
219 , TemplateQueryInline(..)
220 , TemplateQueryKeyValuePairs(..)
220 , TemplateQueryKeyValuePairs(..)
221+ , WildcardQuery(..)
221 , BooleanOperator(..)
222 , BooleanOperator(..)
222 , ZeroTermsQuery(..)
223 , ZeroTermsQuery(..)
223 , CutoffFrequency(..)
224 , CutoffFrequency(..)
tests/V5/Test/Query.hs+8
@@ -113,3 +113,11 @@ spec =
113 search = mkSearch (Just templateQuery) Nothing
113 search = mkSearch (Just templateQuery) Nothing
114 myTweet <- searchTweet search
114 myTweet <- searchTweet search
115 liftIO $ myTweet `shouldBe` Right exampleTweet
115 liftIO $ myTweet `shouldBe` Right exampleTweet
116+
117+ it "returns document for wildcard query" $ withTestEnv $ do
118+ _ <- insertData
119+ let query = QueryWildcardQuery $ WildcardQuery (FieldName "user") "bitemy*" (Nothing)
120+ let search = mkSearch (Just query) Nothing
121+ myTweet <- searchTweet search
122+ liftIO $
123+ myTweet `shouldBe` Right exampleTweet