git.iko.soy/typeable/bloodhound
on master help sign in
Merge pull request #236 from ahodgen/wildcard

Add wildcard query support

commita6fe919bce864c62109fb9e0eb8ddcf7b2d43334 authorChris Allen <cma@bitemyapp.com> dateFri 4 May 2018, 09:31 (8 years ago) parent5c7caa6348b6bc
4 files changed+38−1
changelog.md+2 src/Database/V5/Bloodhound/Internal/Query.hs+27−1 src/Database/V5/Bloodhound/Types.hs+1 tests/V5/Test/Query.hs+8
changelog.md+2
@@ -16,6 +16,8 @@
1616- @rvl
1717 - Add [character filters][] to the `AnalyzerDefinition` type.
1818 - Add the "stemmer" and "stop" [token filters][] to `TokenFilterDefinition`.
19+- @ahodgen
20+ - Add support for wildcard queries
1921
2022[Character Filters]: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-charfilters.html
2123[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 =
4747 | QueryExistsQuery FieldName
4848 | QueryTemplateQueryInline TemplateQueryInline
4949 | QueryMatchNoneQuery
50+ | QueryWildcardQuery WildcardQuery
5051 deriving (Eq, Show)
5152
5253instance ToJSON Query where
@@ -147,6 +148,9 @@ instance ToJSON Query where
147148 toJSON (QueryTemplateQueryInline templateQuery) =
148149 object [ "template" .= templateQuery ]
149150
151+ toJSON (QueryWildcardQuery query) =
152+ object [ "wildcard" .= query ]
153+
150154instance FromJSON Query where
151155 parseJSON v = withObject "Query" parse v
152156 where parse o = termQuery `taggedWith` "term"
@@ -176,6 +180,7 @@ instance FromJSON Query where
176180 <|> queryRegexpQuery `taggedWith` "regexp"
177181 <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"
178182 <|> queryTemplateQueryInline `taggedWith` "template"
183+ <|> queryWildcardQuery `taggedWith` "wildcard"
179184 where taggedWith parser k = parser =<< o .: k
180185 termQuery = fieldTagged $ \(FieldName fn) o ->
181186 TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"
@@ -215,6 +220,7 @@ instance FromJSON Query where
215220 querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery
216221 -- queryExistsQuery o = QueryExistsQuery <$> o .: "field"
217222 queryTemplateQueryInline = pure . QueryTemplateQueryInline
223+ queryWildcardQuery = pure . QueryWildcardQuery
218224
219225-- | As of Elastic 2.0, 'Filters' are just 'Queries' housed in a
220226-- Bool Query, and flagged in a different context.
@@ -251,6 +257,26 @@ instance FromJSON RegexpQuery where
251257 <*> o .: "flags"
252258 <*> o .:? "boost"
253259
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+
254280data RangeQuery =
255281 RangeQuery { rangeQueryField :: FieldName
256282 , rangeQueryRange :: RangeValue
@@ -1219,7 +1245,7 @@ parseRangeValue mkGt mkLt mkGte mkLte
12191245 (Nothing, Nothing, Nothing, Nothing) ->
12201246 nada
12211247
1222−
1248+
12231249instance FromJSON RangeValue where
12241250 parseJSON = withObject "RangeValue" parse
12251251 where parse o = parseDate o
src/Database/V5/Bloodhound/Types.hs+1
@@ -218,6 +218,7 @@ module Database.V5.Bloodhound.Types
218218 , QueryString(..)
219219 , TemplateQueryInline(..)
220220 , TemplateQueryKeyValuePairs(..)
221+ , WildcardQuery(..)
221222 , BooleanOperator(..)
222223 , ZeroTermsQuery(..)
223224 , CutoffFrequency(..)
tests/V5/Test/Query.hs+8
@@ -113,3 +113,11 @@ spec =
113113 search = mkSearch (Just templateQuery) Nothing
114114 myTweet <- searchTweet search
115115 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