Postgresql

按查詢對列執行搜尋

  • August 3, 2017

直到今天,我一直LIKE %term%在查詢特定列項上的行。然後我閱讀了全文索引。而且我想我誤解了全文索引的工作原理。

我有一個返回類別的 API。在前端,我有一個輸入框,可以在使用者鍵入時自動完成輸入。所以假設我有以下類別:

  • 管家
  • 娛樂休閒
  • 稅費和賬單

當使用者輸入“ta”時,我想同時提供“Enter ta inment and entertainment”和“Taxes and bills”。不用說,我發現全文索引不會返回術語“ta”的給定結果。看起來全文索引適用於“tax”或“bill”等實際文本,而不適用於“ta”或“ou”等無意義的片語。

我是否錯誤地使用全文索引,我應該使用舊的好(壞?)LIKE %ta%?或者是否有任何其他方法來實現所描述的功能也將是高效的數據庫(考慮前端將在使用者輸入的每個字元上查詢數據庫的事實)。

供參考:我正在使用 PostgreSQL,我的查詢看起來像select * from categories where to_tsvector('english', name) @@ plainto_tsquery('english', 'ta')

看看亞馬遜的搜尋。我輸入“hou”之類的片語,它會為我提供“房屋裝飾”“紙牌屋”“喬遷”之類的結果。這種搜尋是如何進行的?通過列上的正常索引 + LIKE %term%?

我知道有像 sphinx 的彈性搜尋這樣的解決方案。我不知道它們是否適合我的情況,但現在我想留在數據庫中以最小化成本和時間,以加快開發速度。

Postgres 文本搜尋支持前綴搜尋

select 'housewarming'::tsvector @@ 'hou:*'::tsquery; --true

我看了亞馬遜的搜尋,你猜怎麼著?ta不返回entertainment

當使用者鍵入“ta”時,我想為他們提供“娛樂和娛樂”和“稅收和賬單”。不用說,我發現全文索引不會返回術語“ta”的給定結果。看起來全文索引適用於“tax”或“bill”等實際文本,而不適用於“ta”或“ou”等無意義的片語。

是的,FTS 在這種情況下是沒用的。然而,@Akash 在建議三元索引時在評論中是正確的。

CREATE EXTENSION pg_trgm;
CREATE INDEX ON categories USING GIST (name gist_trgm_ops);

現在您LIKE %term%將使用索引。

引用自:https://dba.stackexchange.com/questions/102306