<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 1. 全文檢索系統之基本介紹 #### 1. Full Text Search介紹 ![](https://box.kancloud.cn/2c36790f8ff338416b87a8b4f6d0d683_206x80.png) 如果要實現一個站內搜索的功能,可能可以這么辦,假如你的網站是個放博客的,那么可能有博客這張表,要搜索的時候,用SQL語句就好了,用where like,但是這樣不夠好,因為你只能搜索包含或未包含的,不能像百度那樣,根據關鍵詞來搜索,也就是分詞系統。我們來介紹一下,全文檢索是搜索引擎的一部分,它首先得有數據,有了數據,要根據數據來分詞,例如"this is a cat"就可以分成四個詞,分別是"this","is", "a", "cat",或許像這些不太重要的"is","a", "this"的停止詞(stop word)可能會被去掉,那就剩下一個詞,這只是規則而已,不管怎樣,不管是中文,英文,都是會切成一個個詞。根據詞來建立索引。索引就先理解為書中的目錄,建立索引是要消耗磁盤空間的,想下就清楚了,不然索引存哪啊。索引建立好了,用戶一搜索關鍵詞,假如用戶搜索了"cat",剛好命中了那個建立過的關鍵詞,那就會通過索引把相關的記錄取出來。這就是一個全文檢索系統啦。只是要實現一個較完整的全文檢索系統,那是需要好多功能的,例如實時搜索,關鍵詞提示,錯誤提示,還有排名等。PostgreSQL作為一個關系型數據庫系統,它本身就支持全文檢索,它比其他數據庫支持得更好。通過簡單的擴展,還能實現中文檢索。這是后話。 #### 2. PostgreSQL的文本匹配 接下來,我們用PostgreSQL的tsvector等命令處理器來測試分詞和文本匹配。先來看一個例子 ``` postgres=# SELECT 'hello world hfpp2012'::tsvector @@ 'hello'::tsquery; ``` 輸出的結果是這樣的。 ``` ?column? ---------- t (1 row) ``` t就是true,說明是匹配成功的。如果是f,那就是false,表示匹配不成功。 上面語句的意思是總共有三個詞,"hello world hfpp2012",然后用"hello"來匹配,相當于數據庫存了三個詞,在搜索引擎輸入框輸入了"hello",因為數據庫是有"hello"這個詞的,所以是能匹配到的。 再試試下面的例子。 ``` postgres=# SELECT 'hello world hfpp2012'::tsvector @@ 'hello & world'::tsquery; ?column? ---------- t (1 row) ``` "&"符號是停止符,是不被索引的,因為沒有意義啊。也就不存儲在數據中了。PostgreSQL有一條規則就是 **"Define stop words that should not be indexed."** 還有另一種寫法是這樣的。 ``` postgres=# SELECT 'hello & world'::tsquery @@ 'hello world hfpp2012'::tsvector; ?column? ---------- t (1 row) ``` 來搜索中文的試下 ``` rails365_pro=# SELECT '號'::tsquery @@ '2015 - Rails365 Inc. All rights reserved. | 粵ICP備15004902號-2'::tsvector; ?column? ---------- f (1 row) rails365_pro=# SELECT 'Rails365'::tsquery @@ '2015 - Rails365 Inc. All rights reserved. | 粵ICP備15004902號-2'::tsvector; ?column? ---------- t (1 row) ``` 顯然,默認情況下,對中文是不支持的。 #### 3. PostgreSQL的數據庫全文檢索 剛才測試的只是分詞,我們用實際的數據庫來測試一下。 ``` # 列出所有數據庫 \l # 選擇數據庫 \c rails365_pro; select title from articles where to_tsvector('english', body) @@ to_tsquery('english', 'ruby') ``` 輸出的結果是這樣的。 ``` title ----------------------------------------------------- 最簡單的用戶登錄注冊系統 登錄認證系統的進階使用 用OneAPM作為你的監控平臺 使用backup來備份數據庫 使用mina來部署ruby on rails應用 Mina的進階使用 用logrotate切割Ruby on rails日志 用exception_notification結合Slack或數據庫來捕獲異常 devise簡單入門教程 (9 rows) ``` 上面是搜索了articles表中body字段,只要包含ruby的都找出來。這不是where like,而是先將body分成一個個詞,之后再來找的。 再看一個例子。 ``` rails365_pro=# select title from articles where to_tsvector('english', body) @@ to_tsquery('english', 'Mina') ; title --------------------------------- 使用mina來部署ruby on rails應用 Mina的進階使用 (2 rows) ``` 上面是搜索Mina這個關鍵詞,兩個例子都是用english作為語法的,如果搜索中文是搜索不到的。 例如,搜索title為devise簡單入門教程的這篇文章。 ``` rails365_pro=# select title from articles where to_tsvector('english', title) @@ to_tsquery('english', '教程') ; title ------- (0 rows) ``` 我們把"english"去掉。 ``` rails365_pro=# select title from articles where to_tsvector(title) @@ to_tsquery('教程') ; title ------- (0 rows) ``` 還是不行。因為沒有中文分詞器。這個后緒再說。 #### 3. 創建索引 上面的是沒有建立索引的情況下操作的,那樣肯定不行的,如果數據量大,會很慢。 ``` CREATE INDEX articles_idx ON articles USING gin(to_tsvector('english', body)); ``` 具體的操作可以看官方的這篇文章[textsearch-tables](http://www.postgresql.org/docs/9.4/static/textsearch-tables.html) 完結。 下一篇:[PostgreSQL 的全文檢索系統之進階 (二)](https://www.rails365.net/articles/postgresql-de-quan-wen-jian-suo-xi-tong-zhi-jin-jie-er)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看