【问题标题】:PostgreSQL full text search cannot find "andy"PostgreSQL全文搜索找不到“andy”
【发布时间】:2018-10-02 10:46:56
【问题描述】:

我有这个 PostgreSQL 查询:

SELECT d.user_id, display_name, avatar_url
FROM user_directory_search
WHERE
user_id like '@and%';

我得到了这些结果:

                    user_id             | display_name | avatar_url
----------------------------------------+--------------+------------
 @andy.huang:synapse.siliconmotion.com  |              |
 @andy.zhao:synapse.siliconmotion.com   | Andy.zhao    |
 @andy.yao:synapse.siliconmotion.com    |              |
 @andy.zou:synapse.siliconmotion.com    |              |
 @andy.xie:synapse.siliconmotion.com    |              |
 @andy.chang:synapse.siliconmotion.com  | andy.chang   |
 @andy.chuang:synapse.siliconmotion.com | andy.chuang  |
 @andy.hsiao:synapse.siliconmotion.com  |              |
(8 rows)

但是当我使用命令时:

SELECT d.user_id, display_name, avatar_url
FROM user_directory_search
WHERE
vector @@ to_tsquery('english', '(andy:* | andy)');

我什么都没有:

 user_id | display_name | avatar_url
---------+--------------+------------
(0 rows)

有人知道原因吗?

【问题讨论】:

    标签: postgresql search full-text-search


    【解决方案1】:

    问题在于全文解析器将这些字符串解析为主机名:

    SELECT alias, description, token, lexemes
    FROM ts_debug('english', '@andy.huang:synapse.siliconmotion.com')
    WHERE alias <> 'blank';
    
     alias | description |           token           |           lexemes           
    -------+-------------+---------------------------+-----------------------------
     host  | Host        | andy.huang                | {andy.huang}
     host  | Host        | synapse.siliconmotion.com | {synapse.siliconmotion.com}
    (2 rows)
    

    您可以在索引期间用空格替换违规时段:

    SELECT alias, description, token, lexemes
    FROM ts_debug('english',
                  translate('@andy.huang:synapse.siliconmotion.com', '.', ' '))
    WHERE alias <> 'blank';
    
       alias   |   description   |     token     |   lexemes    
    -----------+-----------------+---------------+--------------
     asciiword | Word, all ASCII | andy          | {andi}
     asciiword | Word, all ASCII | huang         | {huang}
     asciiword | Word, all ASCII | synapse       | {synaps}
     asciiword | Word, all ASCII | siliconmotion | {siliconmot}
     asciiword | Word, all ASCII | com           | {com}
    (5 rows)
    

    但如果我是你,我会使用simple 全文搜索配置。或者你想要词干(比较上面的“token”和“lexemes”)?

    【讨论】:

    • 我无权修改源代码,但我可以更新数据库。你知道如何修复数据库来解决问题吗?
    • 另一个问题是问题只出现在 'andy' 中,其他词如 eric、bell、Akira... 都可以。为什么只有“安迪”?
    • 你必须改变查询来解决问题,如果只是引入一个新的、修改过的列。 andy 可能很特别,因为英语词干分析器将其更改为 andi
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2011-03-29
    • 2016-06-18
    • 2013-03-09
    • 2020-03-07
    • 2014-01-05
    相关资源
    最近更新 更多