我有以下情况。在我们的数据库中,我们的用户可以将部件号搜索为“关键字”。部件号附加为“脚注”,附加到某些项目。这种脚注的一个例子将有一个描述:
Part Number: 09C888
我们的关键字搜索通过一组非常有趣的LEFT JOIN搜索多个表,最终形成一个ts_vector,然后用于对抗tsquery。我们目前的问题是这种方法似乎只接受完全匹配。例如:
select to_tsvector('Part Number: 09C888') @@ to_tsquery('09C888:*');
?column?
---------
t
使用完整版的部件号作为搜索条件可以正常工作。然而...
select to_tsvector('Part Number: 09C888') @@ to_tsquery('9C888:*');
?column?
----------
f
有没有办法修改上面的tsquery项目以匹配09C888,值为09C888 AND 9C888?通常情况下,我可以使用LIKE构造做类似的事情,但我们目前正在使用全文搜索来提高大量数据的效率。从仔细阅读postgresql文档,我无法找到一个简单的方法来做到这一点。我也犹豫是否要改变整体查询,因为它正在做......好吧,它做了很多文本匹配只是其中一部分的东西。 (显然是一个潜在的改进之地。)
修改
我实际上已经想出了如何使用修改过的查询来做到这一点
select to_tsvector('Part Number: 09C888') @@ to_tsquery('09C888|9C888:*');
有没有比我上面列出的更好的方法来确定匹配?主要是因为解决方案非常具体,但基本上这些部件号可能有也可能没有前导0。
答案 0 :(得分:0)
您是否考虑过在一个单独的列中存储已删除前导零的零件编号并对其进行搜索?
+---------------------+-------+
| Part Number: 09C888 | 9C888 |
+---------------------+-------+
CREATE INDEX footnote_part_number_txt_idx
ON footnotes (stripped_part_number text_pattern_ops);
然后你可以查询(使用索引)
SELECT footnote_str
FROM footnotes
WHERE stripped_part_number LIKE '9C88%'
请参阅:http://petereisentraut.blogspot.se/2009/10/rethink-your-text-column-indexing-with.html