esqueleto-textsearch-1.2.0: PostgreSQL full text search for Esqueleto
Safe HaskellSafe-Inferred
LanguageHaskell2010

Database.Esqueleto.TextSearch.Language

Contents

Synopsis

Documentation

(@@.) Source #

Arguments

:: SqlExpr (Value TsVector)

the document to search in

-> SqlExpr (Value (TsQuery Lexemes))

the query made by prefixAndQuery

-> SqlExpr (Value Bool) 

Apply some query to a tsvector document for example:

searchCompany :: SqlExpr (Entity CompanySearchIndex) -> SearchTerm -> SqlQuery ()
searchCompany company term = do
  let query = prefixAndQuery term
      norm = val []
  where_ $ (company ^. CompanySearchIndexDocument) @@. query

prefixAndQuery :: SearchTerm -> SqlExpr (Value (TsQuery Lexemes)) Source #

format the query into lexemes the result can be used in @@. for example:

searchCompany :: SqlExpr (Entity CompanySearchIndex) -> SearchTerm -> SqlQuery ()
searchCompany company term = do
  let query = prefixAndQuery term
      norm = val []
  where_ $ (company ^. CompanySearchIndexDocument) @@. query

this uses && to combine queries

prefixAndQueryLang :: RegConfig -> SearchTerm -> SqlExpr (Value (TsQuery Lexemes)) Source #

specify a language to be used with the query.

prefixOrQueryLang :: RegConfig -> SearchTerm -> SqlExpr (Value (TsQuery Lexemes)) Source #

same as prefixAndQueryLang but uses || to combine quereis

toSearchTerm :: Text -> Maybe SearchTerm Source #

Constructs a valid search query, removes a bunch of illegal characters and splits the terms for better results. Also checks if there is anything in the search term.

using a search term is optional, but it's probably what you want. all underlying primitives are exposed.

toSearchTermWeighted :: [Weight] -> Text -> Maybe SearchTerm Source #

create a search term with some weight, this allows tweaking of priority of certain terms. for example if you want to do some post processing on user input. where they insist on typing dashes, you split on the dash and concatinate the search term with lower priority splitted strings on the dash. so the full string is high priority, substrings lower. use the semigroup instance on search term to combine these.

data SearchTerm Source #

A valid search term. created with toSearchTerm.

ts_rank Source #

Arguments

:: SqlExpr (Value Weights)

relative weighting of a b c and d, see defaultWeights

-> SqlExpr (Value TsVector)

the document to search in

-> SqlExpr (Value (TsQuery Lexemes))

the query made by prefixAndQuery

-> SqlExpr (Value [NormalizationOption])

normalization option to indicate how to deal with document length

-> SqlExpr (Value Double) 

Organize search result by weights. This allows you to put better matching results higher. for example:

searchCompany :: SqlExpr (Entity CompanySearchIndex) -> SearchTerm -> SqlQuery ()
searchCompany company term = do
  let query = prefixAndQuery term
      norm = val []
  where_ $ (company ^. CompanySearchIndexDocument) @@. query
  orderBy [desc (ts_rank (val defaultWeights)
                 (company ^. CompanySearchIndexDocument)
                 query norm)]

ts binary

tsquery_or :: SqlExpr (Value (TsQuery Lexemes)) -> SqlExpr (Value (TsQuery Lexemes)) -> SqlExpr (Value (TsQuery Lexemes)) Source #

(||) for tsquery. This function would be called (&&.) but Esqueleto's (&&.) confines that fn to sql boolean expressions. x::tsquery && y::tsquery == to_tsquery('x & y')

tsquery_and :: SqlExpr (Value (TsQuery Lexemes)) -> SqlExpr (Value (TsQuery Lexemes)) -> SqlExpr (Value (TsQuery Lexemes)) Source #

(&&) for tsquery. This function would be called (&&.) but Esqueleto's (&&.) confines that fn to sql boolean expressions. x::tsquery && y::tsquery == to_tsquery('x & y')