--- title: "Parsers" id: textsearch-parsers pg_version: "20devel" --- ## 12.5. Parsers Text search parsers are responsible for splitting raw document text into *tokens* and identifying each token's type, where the set of possible types is defined by the parser itself. Note that a parser does not modify the text at all — it simply identifies plausible word boundaries. Because of this limited scope, there is less need for application-specific custom parsers than there is for custom dictionaries. At present PostgreSQL provides just one built-in parser, which has been found to be useful for a wide range of applications. The built-in parser is named `pg_catalog.default`. It recognizes 23 token types, shown in [Table 12.1](textsearch-parsers.md#textsearch-default-parser). **Default Parser's Token Types** | Alias | Description | Example | | --- | --- | --- | | `asciiword` | Word, all ASCII letters | `elephant` | | `word` | Word, all letters | `mañana` | | `numword` | Word, letters and digits | `beta1` | | `asciihword` | Hyphenated word, all ASCII | `up-to-date` | | `hword` | Hyphenated word, all letters | `lógico-matemática` | | `numhword` | Hyphenated word, letters and digits | `postgresql-beta1` | | `hword_asciipart` | Hyphenated word part, all ASCII | `postgresql` in the context `postgresql-beta1` | | `hword_part` | Hyphenated word part, all letters | `lógico` or `matemática` in the context `lógico-matemática` | | `hword_numpart` | Hyphenated word part, letters and digits | `beta1` in the context `postgresql-beta1` | | `email` | Email address | `foo@example.com` | | `protocol` | Protocol head | `http://` | | `url` | URL | `example.com/stuff/index.html` | | `host` | Host | `example.com` | | `url_path` | URL path | `/stuff/index.html`, in the context of a URL | | `file` | File or path name | `/usr/local/foo.txt`, if not within a URL | | `sfloat` | Scientific notation | `-1.234e56` | | `float` | Decimal notation | `-1.234` | | `int` | Signed integer | `-1234` | | `uint` | Unsigned integer | `1234` | | `version` | Version number | `8.3.0` | | `tag` | XML tag | `` | | `entity` | XML entity | `&` | | `blank` | Space symbols | (any whitespace or punctuation not otherwise recognized) | > [!NOTE] > The parser's notion of a "letter" is determined by the database's locale setting, specifically `lc_ctype`. Words containing only the basic ASCII letters are reported as a separate token type, since it is sometimes useful to distinguish them. In most European languages, token types `word` and `asciiword` should be treated alike. > `email` does not support all valid email characters as defined by [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322). Specifically, the only non-alphanumeric characters supported for email user names are period, dash, and underscore. > `tag` does not support all valid tag names as defined by [W3C Recommendation, XML](https://www.w3.org/TR/xml/). Specifically, the only tag names supported are those starting with an ASCII letter, underscore, or colon, and containing only letters, digits, hyphens, underscores, periods, and colons. `tag` also includes XML comments starting with ``, and XML declarations (but note that this includes anything starting with ``). It is possible for the parser to produce overlapping tokens from the same piece of text. As an example, a hyphenated word will be reported both as the entire word and as each component: SELECT alias, description, token FROM ts_debug('foo-bar-beta1'); alias | description | token -----------------+------------------------------------------+--------------- numhword | Hyphenated word, letters and digits | foo-bar-beta1 hword_asciipart | Hyphenated word part, all ASCII | foo blank | Space symbols | - hword_asciipart | Hyphenated word part, all ASCII | bar blank | Space symbols | - hword_numpart | Hyphenated word part, letters and digits | beta1 This behavior is desirable since it allows searches to work for both the whole compound word and for components. Here is another instructive example: SELECT alias, description, token FROM ts_debug('http://example.com/stuff/index.html'); alias | description | token ----------+---------------+------------------------------ protocol | Protocol head | http:// url | URL | example.com/stuff/index.html host | Host | example.com url_path | URL path | /stuff/index.html