首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带连字符整数的全文搜索

带连字符整数的全文搜索
EN

Database Administration用户
提问于 2022-12-12 13:37:22
回答 1查看 59关注 0票数 2

比较以下搜索查询:

代码语言:javascript
复制
SELECT
    to_tsvector('yellow-green') @@ to_tsquery('yellow & green') as word_word,
    to_tsvector('Apollo-11') @@ to_tsquery('apollo & 11') as word_number;

 word_word | word_number
-----------+-------------
 t         | f
(1 row)

它们在概念上是相似的,但只有第一个产生匹配。很清楚为什么会发生这种情况。使用连字符对,解析器生成三个词素:

代码语言:javascript
复制
 SELECT * FROM ts_debug('yellow-green');

     alias      |         description          |  token  |  dictionaries  | dictionary  |  lexemes
----------------+------------------------------+---------+----------------+-------------+-----------
 asciihword     | Hyphenated word, all ASCII   | yellow-.| {english_stem} | english_ste.| {yellow-g.
                |                              |.green   |                |.m           |.reen}
 hword_asciipar.| Hyphenated word part, all AS.| yellow  | {english_stem} | english_ste.| {yellow}
.t              |.CII                          |         |                |.m           |
 blank          | Space symbols                | -       | {}             |             |
 hword_asciipar.| Hyphenated word part, all AS.| green   | {english_stem} | english_ste.| {green}
.t              |.CII                          |         |                |.m           |
(4 rows)

使用一个字号对,解析器将创建两个词汇,其中一个是有符号整数:

代码语言:javascript
复制
SELECT * FROM ts_debug('apollo-11');

   alias   |   description   | token  |  dictionaries  |  dictionary  | lexemes
-----------+-----------------+--------+----------------+--------------+----------
 asciiword | Word, all ASCII | apollo | {english_stem} | english_stem | {apollo}
 int       | Signed integer  | -11    | {simple}       | simple       | {-11}
(2 rows)

是否可以将to_tsvector配置为像字符串一样解析数字,从而使匹配不受连字符的影响?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2022-12-16 08:31:46

我最后使用了dict_int扩展,正如这个答案在StackOverflow上所提到的。它很简单,如:

  1. 启用字典扩展:
代码语言:javascript
复制
CREATE EXTENSION IF NOT EXISTS dict_int;
  1. 设置absval选项,以便字典将数字转换为它们的绝对值。
代码语言:javascript
复制
ALTER TEXT SEARCH DICTIONARY intdict (absval = true);
  • 请注意,字典还将截断由maxlen参数控制的某个最大长度的整数(默认为6)。
  1. 创建自定义文本搜索配置以使用此字典:
代码语言:javascript
复制
CREATE TEXT SEARCH CONFIGURATION en_cusom (COPY = pg_catalog.english);
ALTER TEXT SEARCH CONFIGURATION en_custom
    ALTER MAPPING FOR int, uint WITH intdict;
  • 还可以直接更改默认配置,以避免to_tsvector/to_tsquery中的显式调用。
  1. 指定在搜索中使用的字典:
代码语言:javascript
复制
SELECT
    to_tsvector('en_custom', 'yellow-green') @@ to_tsquery('en_custom', 'yellow & green') as word_word,
    to_tsvector('en_custom', 'Apollo-11') @@ to_tsquery('en_custom', 'apollo & 11') as word_number;
 word_word | word_number
-----------+-------------
 t         | t
(1 row)
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/320848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档