Postgres全文搜索忽略网址

时间:2016-02-15 05:44:31

标签: postgresql indexing full-text-search postgresql-9.4

我正在尝试使用PostgreSQL来实现全文搜索系统。

我遇到了这个奇怪的或可能是它的特征。

在尝试索引或搜索包含带扩展名的文件名称的列时(例如myimage.jpg),系统会将其视为网址并且无法正确标记。

我参考了文档,并通过ts_debug看到文件名被视为url的主机。

有人可以告诉我如何将所有输入作为FTS PostgreSQL中的普通单词。

此外,在第二次请求时,如何使用containsstartswithendswith进行搜索?

更新

我现在尝试了从create text search configuration...复制并删除了pg_catalog.englishhosturl的语句url_path,然后为ts_debug指定了配置{1}}方法。但仍然没有。myimage.jpg仍然被标识为host

版本 我使用的是版本9.4

1 个答案:

答案 0 :(得分:0)

tl; dr如果您真的只想要单词(而不是电子邮件,网址,主持人等),请查看预先解析您的输入并删除标点符号。

因此,在尝试自己解决这个问题之后,问题是您似乎无法轻松自定义解析器。根据我的理解,解析器首先运行,生成令牌。然后将这些令牌与词典匹配。

通过从配置中删除hosturlurl_path,您所做的就是使这些令牌不会在字典中被查找,从而导致没有词汇从这些代币。这实际上意味着它们在搜索方面不存在。这不是你想要的......

理想情况下,您需要做的是将解析器自定义为而不是首先生成这些令牌,或者生成重叠令牌(类似于带连字符的生成方式)整个单词以及单个组件的标记)。如果不编写自定义解析器,目前似乎无法做到这一点。

唯一的解决方案是预先解析文本以删除句号。请注意,如果您依赖其他类型的令牌,例如版本(例如8.3.0)或电子邮件(例如name@domain.com),则会破坏这些令牌。因此,您可能需要对删除字符的方式有点聪明。

select ts_debug('english', replace('this-is-a-file.jpg', '.', ' '));

"(asciihword,"Hyphenated word, all ASCII",this-is-a-file,{english_stem},english_stem,{this-is-a-fil})"
"(hword_asciipart,"Hyphenated word part, all ASCII",this,{english_stem},english_stem,{})"
"(blank,"Space symbols",-,{},,)"
"(hword_asciipart,"Hyphenated word part, all ASCII",is,{english_stem},english_stem,{})"
"(blank,"Space symbols",-,{},,)"
"(hword_asciipart,"Hyphenated word part, all ASCII",a,{english_stem},english_stem,{})"
"(blank,"Space symbols",-,{},,)"
"(hword_asciipart,"Hyphenated word part, all ASCII",file,{english_stem},english_stem,{file})"
"(blank,"Space symbols"," ",{},,)"
"(asciiword,"Word, all ASCII",jpg,{english_stem},english_stem,{jpg})"

关于你的第二个问题。你在谈论部分单词匹配吗?使用像english这样的配置时,你会得到一点干扰,所以running会变成run,如果你搜索runrunning,它会匹配。如果你在谈论模糊匹配,它会变得有点复杂。我建议您阅读这篇文章http://rachbelaid.com/postgres-full-text-search-is-good-enough/