postgresql - Postgres 全文搜索忽略 url

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

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

我遇到了这个奇怪的或可能是预期的功能。

在尝试索引或搜索包含带扩展名(例如 myimage.jpg)的文件名的列时,系统将其视为 url 且未正确标记化。

我引用了文档并通过 ts_debug 看到文件名被用作 url 的主机。

谁能告诉我们如何在 PostgreSQLFTS 中将所有输入作为普通单词。

此外,在第二个请求中,如何使用它进行 containsstartswithendswith 搜索?

更新

我现在尝试了语句 create text search configuration...,从 pg_catalog.english 复制并删除了 host, urlurl_path 然后指定 ts_debug 方法的配置。但是还是不行。myimage.jpg 仍然被识别为host

版本 我用的是9.4版本

最佳答案

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

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

通过从配置中删除 hosturlurl_path,您所做的就是让这些标记不被查看在字典中,导致这些标记没有词位。这实质上意味着它们在搜索方面不存在。这不是你想要的...

理想情况下,您需要做的是自定义解析器,使其首先生成这些标记,或者同时生成重叠标记(类似于带连字符的单词生成的方式整个单词以及单个组件的标记)。如果不编写自定义解析器,目前这似乎是不可能的。

唯一的解决方案是预先解析文本以删除句号。请注意,如果您依赖其他类型的 token ,例如版本(例如 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 如果你搜索 就会匹配>运行正在运行。如果你在谈论模糊匹配,它会变得有点复杂。我建议阅读这篇文章 http://rachbelaid.com/postgres-full-text-search-is-good-enough/

关于postgresql - Postgres 全文搜索忽略 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35402243/

相关文章:

android - SQLite的FTS3如何实现模糊搜索?

mysql - 仅查找与 FULLTEXT 索引完全匹配的内容

javascript - Sequelize.js ownsToMany 实例方法 create 不起作用?

mysql - 在查询中使用 GROUP BY 时有关 MySQL 表索引的帮助

sql - 用于多列比较的索引扫描 - 非统一索引列排序

indexing - 通过faiss中的C++接口(interface)remove_ids

sql - 如何用MATCH(), ROUND() & Subquery写MySQL全文查询?

postgresql - 当没有与当前用户同名的数据库时,列出 PostgreSQL 中的所有数据库

php - 按另一列排序后选择 id 后的记录

ruby-on-rails - Rails 中的图像在生产中中断