2013-08-28 48 views
0

在Rails應用中使用Postgres(使用pg_search gem),我已經使用tsvector進行搜索。在與超過35,000條記錄的數據庫我得到幾個消息說導致哪條記錄通知:單詞太長,無法索引

NOTICE: word is too long to be indexed 
DETAIL: Words longer than 2047 characters are ignored. 

上午我在承擔一個「字」糾正不包括空白?我如何確定哪些記錄導致此消息?

這裏是由它引入了索引

== AddIndexForFullTextSearch: migrating ====================================== 
-- add_column(:posts, :tsv, :tsvector) 
    -> 0.0344s 
-- execute("  CREATE INDEX index_posts_tsv ON posts USING gin(tsv);\n") 
    -> 0.1694s 
-- execute(" UPDATE posts SET tsv = (to_tsvector('english', coalesce(title, '')) || \n       to_tsvector('english', coalesce(intro, '')) || \n       to_tsvector('english', coalesce(body, '')));\n") 
NOTICE: word is too long to be indexed 
DETAIL: Words longer than 2047 characters are ignored. 
NOTICE: word is too long to be indexed 
DETAIL: Words longer than 2047 characters are ignored. 
NOTICE: word is too long to be indexed 
DETAIL: Words longer than 2047 characters are ignored. 
NOTICE: word is too long to be indexed 
DETAIL: Words longer than 2047 characters are ignored. 
    -> 343.0556s 
-- execute("  CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE\n  ON posts FOR EACH ROW EXECUTE PROCEDURE\n  tsvector_update_trigger(tsv, 'pg_catalog.english', title, intro, body);\n") 
    -> 0.0266s 
+0

這裏是[關於抑制這些通知的問題](http://stackoverflow.com/q/12925623/578288) –

回答

2

the PostgreSQL documentation,遷移生成的SQL「全文搜索功能,包括能力[...]基於不僅僅是空白詳細解析」,這取決於你的「文本搜索配置」。所以你必須檢查你的配置以找出「單詞」的含義。

你可以使用regular expression搜索長空格分開的話:

SELECT regexp_matches(the_text_col, '\S{2047,}') FROM the_table 

該正則表達式搜索2047或更多的連續非空白字符。

+0

謝謝。當我運行這個,我得到 PG ::錯誤:錯誤:無效的正則表達式:無效的重複計數 :SELECT regexp_matches(body,'S {2047,}')FROM帖子 – linojon

+0

它似乎運行一個較小的數字,例如'S {10,}'。但仍然返回0條記錄。 – linojon

1

如果你想獲得比匹配的摘錄其他匹配的行的更多信息,你可以不喜歡

select id, text_col from table where text_col ~ '\S{255,}';

如果嘗試搭配256個字符或更多'\S{256,}',它給 ERROR: invalid regular expression: invalid repetition count(s)上的Postgres 9.3.5

-1

Postgres有錯誤,甚至 {} 150,300導致錯誤 - 無效的重複計數(S),而這個其他有效的正則表達式不能在Postgres的運行。 希望有人會糾正這個錯誤。