- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 PostgreSQL 的新手,在实现全文搜索时遇到了一些问题。我目前正在使用以下设置:
CREATE DATABASE test;
CREATE TABLE data_table (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(160) NOT NULL,
description VARCHAR NOT NULL
);
CREATE INDEX data_table_idx ON data_table
USING gin(to_tsvector('English', name || ' ' || description));
INSERT INTO data_table (name, description) VALUES
('Penguin', 'This is the Linux penguin.'),
('Gnu', 'This is the GNU gnu.'),
('Elephant', 'This is the PHP elephant.'),
('Elephant', 'This is the postgres elephant.'),
('Duck', 'This is the duckduckgo duck.'),
('Cat', 'This is the GitHub cat.'),
('Bird', 'This is the Twitter bird.'),
('Lion', 'This is the Leo lion.');
现在我尝试在表中搜索给定的用户输入并返回整个数据行和突出显示的匹配项,它看起来应该类似于以下内容:
WITH
q AS ( SELECT plainto_tsquery('English', 'elephants php') AS query ),
d AS ( SELECT (name || ' ' || description) AS document FROM data_table ),
t AS ( SELECT to_tsvector('English', d.document) AS textsearch FROM d ),
r AS ( SELECT ts_rank_cd(t.textsearch, q.query) AS rank FROM t, q )
SELECT data_table.*, ts_headline('german', d.document, q.query) AS matches
FROM data_table, q, d, t , r
WHERE q.query @@ t.textsearch
ORDER BY r.rank DESC
LIMIT 10;
这给我留下了以下输出:
id | name | description | matches
----+----------+--------------------------------+------------------------------------
5 | duck | This is the duckduckgo duck. | Penguin This is the Linux penguin.
2 | Gnu | This is the GNU gnu. | Gnu This is the GNU gnu.
3 | Elephant | This is the PHP elephant. | Penguin This is the Linux penguin.
4 | elephant | This is the postgres elephant. | Penguin This is the Linux penguin.
6 | Cat | This is the GitHub cat. | Penguin This is the Linux penguin.
1 | Penguin | This is the Linux penguin. | Gnu This is the GNU gnu.
1 | Penguin | This is the Linux penguin. | Penguin This is the Linux penguin.
2 | Gnu | This is the GNU gnu. | Penguin This is the Linux penguin.
4 | elephant | This is the postgres elephant. | Gnu This is the GNU gnu.
3 | Elephant | This is the PHP elephant. | Gnu This is the GNU gnu.
(10 rows)
所以查询确实返回了一些东西,但它没有按排名排序,每个文档都与名称/描述的每个组合组合在一起,唯一有效的是在文档中正确突出显示搜索结果。那么我做错了什么,我该如何解决?
最佳答案
我终于能够让它工作了。请在下面找到我的解决方案。我希望这会对某人有所帮助。如果有人知道更好的解决方案,索引更好/更快,我会很高兴知道。
查询:
WITH
q AS ( SELECT to_tsquery('german', 'elephant | php') AS query ),
d AS ( SELECT id, (name || ' ' || description) AS doc FROM data_table ),
t AS ( SELECT id, doc, to_tsvector('german', doc) AS vector FROM d ),
r AS (
SELECT id, doc, ts_rank_cd(vector, query) AS rank
FROM t, q
WHERE q.query @@ vector
ORDER BY rank DESC
)
SELECT id, ts_headline('german', doc, q.query) AS matches, rank
FROM r, q
ORDER BY r;
结果:
id | matches | rank
----+---------------------------------------------------------+------
3 | <b>Elephant</b> This is the <b>PHP</b> <b>elephant</b>. | 0.3
4 | <b>elephant</b> This is the postgres <b>elephant</b>. | 0.2
关于postgresql - 如何在 PostgreSQL 中设置全文搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22732507/
有没有办法对 Subversion 存储库执行全文搜索,包括所有历史记录? 例如,我编写了一个在某处使用过的功能,但后来不需要它,所以我对文件进行了 svn rm'd,但现在我需要再次找到它以将其用于
如何进行 MySQL 搜索,既匹配部分单词,又提供准确的相关性排序? SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS rel
我在 postgresql 中创建了一个用于全文搜索的索引。 CREATE INDEX pesquisa_idx ON chamado USING gin(to_tsvector('portugues
我已经设置了一个数据库并启用了全文搜索,当我使用以下内容搜索数据库时,数据库中有一些条目包含“测试”一词,还有一个条目包含“测试更多”: SELECT keywords, title FROM dat
我想知道是否可以进行 MATCH() AGAINST()(全文)搜索,使得不直接相邻的单词需要按特定顺序排列?在我的网站上,当用户在双引号之间键入单词时,搜索将仅显示具有特定顺序的这些单词的结果。例如
我有一个 80,000 行的数据库,当我测试一些 FULLTEXT 查询时,我遇到了一个意想不到的结果。我已从 MYSQL 中删除停用词并将最小字长设置为 3。 当我执行此查询时: SELECT `s
我刚刚在我的 MYSQL 数据库中发现了一堆流氓数据... 到达它的唯一方法是通过其中一列 - FILE_PATH,其中包含文件路径的斜杠剥离版本。我需要在这组文件中找到一些恶意文件——它们的文件名都
我正在为我的站点构建一个小的搜索功能。我正在接受用户的查询,提取关键字,然后针对提取的关键字运行全文 MySQL 搜索。 问题在于 MySQL 将词干视为文字。这是正在发生的过程: 用户搜索“棒球”之
这是一个关于使用(关系)数据库设计全文搜索的系统架构问题。我使用的具体软件是 Solr 和 PostgreSQL,仅供引用。 假设我们正在构建一个有两个用户 Andy 和 Betty 的论坛 -- P
当元素数组中的数组包含应与我的搜索匹配的文本时,我无法检索文档。 这里有两个示例文档: { _id: ..., 'foo': [ { 'name
我正在使用这个查询,但不幸的是它运行缓慢: SELECT *, (MATCH(`title`) AGAINST ('$word' IN BOOLEAN MODE) * 2 + MATC
我正在构建一个非常简单的产品目录,它将在 mysql 表中存储产品,我想尽快搜索产品(并尽可能相关)。产品数据库将非常大(大约 500.000 个产品),这就是为什么使用“like”而不使用索引的搜索
select count(distinct email_address) from users WHERE MATCH (email_address) AGAINST ('@r
我正在尝试在 mySQL 中进行简单的全文搜索,但在复数方面遇到一些问题。 我确实相信我符合50% 规则。 我不认为我使用了停用词。 我正在运行这样的查询: SELECT * FROM product
我在 innoDB 数据库中使用全文搜索时遇到了一个大问题。 首先,ns_pages 表有超过 2.6m 的记录,全文索引有 3 个键 block 。 该数据库在具有 128GB RAM 的 Dell
我有一个城市和州的数据库(大约 43,000 个)。我对其进行全文搜索,如下所示: select city, state, match(city, state_short, state) agains
我正在使用带有自然语言全文的 Mysql FULLTEXT 搜索,不幸的是,我遇到了 FULLTEXT 50% 阈值,如果给定的关键字出现在总行数的 50% 时间,则不允许我搜索行。 我搜索并找到了一
如果我搜索单词hello,那么我没有匹配到,而我搜索单词hella,那么我得到了匹配。同样的情况也发生在“Non”这个词上。我在 Mac 上的 MAMP 和 sqlfiddle.com 上进行了测试,
所以我有一个简单的场景。我有一张 field 表(事件 field 等)。我的查询看起来像: SELECT * FROM venues WHERE venues.name % 'Philips Are
我有一个表,其中有视频数据,如“标题”、“描述”等。我正在尝试使用 MySQL 全文索引编写一个搜索引擎。 SQL 查询适用于某些单词,但不是每个单词。这是我的 SQL 查询; SELECT * FR
我是一名优秀的程序员,十分优秀!