按查詢對列執行搜尋
直到今天,我一直
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%
將使用索引。