Postgresql Postgres大文本搜索建议

Postgresql Postgres大文本搜索建议,postgresql,Postgresql,我对数据库很陌生,正在寻找一些高层次的建议 形势 我正在使用Postgres9.3构建一个数据库,数据库中有一个表,我在其中存储日志文件 CREATE TABLE errorlogs ( id SERIAL PRIMARY KEY, archive_id INTEGER NOT NULL REFERENCES archives, filename VARCHAR(256) NOT NULL, content TEXT); 内容中的文本长度可以从1k到50

我对数据库很陌生,正在寻找一些高层次的建议

形势
我正在使用Postgres9.3构建一个数据库,数据库中有一个表,我在其中存储日志文件

CREATE TABLE errorlogs (
     id SERIAL PRIMARY KEY,
     archive_id INTEGER NOT NULL REFERENCES archives,
     filename VARCHAR(256) NOT NULL,
     content TEXT);
内容中的文本长度可以从1k到50MB不等

问题
我希望能够对“content”列中的数据执行相当快的文本搜索(例如,其中包含“%some_error%”之类的内容)。目前,搜索速度非常慢(搜索8206行的时间超过10分钟)

我知道索引是用来解决我的问题的,但我似乎无法创建索引——每当我尝试创建索引时,都会发现索引太大的错误

=#在错误日志上创建索引错误日志内容idx(内容文本模式操作)
错误:索引行需要1796232字节, 最大尺寸为8191

我希望得到一些关于如何解决这个问题的建议。我可以更改最大索引大小吗?或者我不应该尝试使用Postgres在如此大的文本字段上进行全文搜索


任何建议都将不胜感激

文本搜索向量无法处理这么大的数据---请参阅。它们的优势在于模糊搜索,所以你可以在同一个呼叫中搜索“游泳”和“游泳”、“游泳”、“游泳”和“游泳”。它们并不意味着要取代
grep

限制的原因在as MAXSTRLEN(和MAXSTRPOS)中。文本搜索向量存储在一个长而连续的数组中,最大长度为1 MiB(所有唯一词素的所有字符的总和)。为了访问这些,ts_向量索引结构允许11位表示字长,20位表示其在数组中的位置。这些限制允许索引结构适合32位无符号整数

如果一个文件中有太多的唯一单词,或者单词重复得非常频繁,那么您可能会遇到这两个限制中的一个或两个限制——如果您有50MB的日志文件和准随机数据,这是很有可能的

是否确实需要在数据库中存储日志文件?您基本上是在复制文件系统,
grep
python
可以很好地在那里进行搜索。不过,如果你真的需要这样做的话,你可以考虑:

CREATE TABLE errorlogs (
    id SERIAL PRIMARY KEY
    , archive_id INTEGER NOT NULL REFERENCES archives
    , filename VARCHAR(256) NOT NULL
);

CREATE TABLE log_lines (
    line PRIMARY KEY
    , errorlog INTEGER REFERENCES errorlogs(id)
    , context TEXT
    , tsv TSVECTOR
);

CREATE INDEX log_lines_tsv_idx ON log_lines USING gin( line_tsv );
在这里,您将每个日志行视为一个“文档”

SELECT e.id, e.filename, g.line, g.context
FROM errorlogs e JOIN log_lines g ON e.id = g.errorlog 
WHERE g.tsv @@ to_tsquery('some & error');

我想你可能正在寻找全文搜索/索引。这个答案可能也会有帮助,嗨,约翰,谢谢你的建议。我已经浏览了textsearch文档,但找不到有关索引限制的任何信息。您发布的第二条评论描述了如何创建文本模式操作索引,正如我前面提到的,该索引返回一个关于索引太大的错误。您希望使用gin或gist索引,而不是B树,这正是文本模式操作的工作原理。为错误链接道歉。当使用to_tsvector处理包含非常大单词的字符串时,我会收到通知,而不是错误。虽然如果您的内容包含长度超过2047个字符的单词,但我想知道它是否真的是二进制数据,这可能意味着它可能包含\0个字符,这将导致问题。非常感谢您的建议。此后,我改为每行存储一行日志。我还没有尝试过索引,只是尝试了一下,效果很好。再次感谢!