<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 12.2\. 表和索引 上一節中的例子說明使用簡單常量字符串的全文匹配。本節顯示如何搜索表中的數據,選擇使用索引。 ## 12.2.1\. 搜索表 在不使用索引的情況下也是可以進行全文檢索的,一個簡單查詢,顯示出`title`從所有`body`字段中包含`friend`的每一行: ``` SELECT title FROM pgweb WHERE to_tsvector('english', body) @@ to_tsquery('english', 'friend'); ``` 這也將找到相關的詞,比如`friends`和`friendly`,因為所有的這些都降低到相同規范化的詞。 以上查詢指定`english`配置是用來解析和規范化字符串。或者我們可以省略配置參數: ``` SELECT title FROM pgweb WHERE to_tsvector(body) @@ to_tsquery('friend'); ``` 這個查詢將通過[default_text_search_config](#calibre_link-1138)使用配置設置。 復雜一點的例子:檢索出最近的10個文檔,在`title` 或者`body`字段中包含`create` 和 `table`的: ``` SELECT title FROM pgweb WHERE to_tsvector(title || ' ' || body) @@ to_tsquery('create & table') ORDER BY last_mod_date DESC LIMIT 10; ``` 為了清楚,我們忽略`coalesce`函數調用,這需要找到在兩個字段之一中包含`NULL`的行。 雖然這些查詢在沒有索引的情況下工作,大多數應用程序會發現這個方法太慢了,除了偶爾的特定搜索。 文本搜索的實際使用通常需要創建索引。 ## 12.2.2\. 創建索引 為了加速文本搜索,我們可以創建GIN索引([Section 12.9](#calibre_link-1129)): ``` CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', body)); ``` 注意,使用`to_tsvector`的2-參數版本。唯一的文本搜索功能指定可用于表達式索引的配置名稱(節[Section 11.7](#calibre_link-959))。 這是因為索引的內容必須不受[default_text_search_config](#calibre_link-1138)的影響。如果他們受到影響,索引內容可能不一致, 因為不同的條目可能包含不同的文本搜索配置創建的`tsvector`,并且沒有辦法猜出是哪個。正確的轉儲和恢復 這樣的一個索引是不可能的。 因為在上述索引中使用`to_tsvector`的2-參數版本,只有一個使用帶有相同配置名稱的`to_tsvector`的2-參數版本的查詢參考, 它將使用該索引。也就是說,`WHERE to_tsvector('english', body) @@ 'a & b'` 可以使用索引,但`WHERE to_tsvector(body) @@ 'a & b'`不能。 這確保將使用一個索引僅僅伴隨著用于創建索引的相同配置。 建立更復雜的表達式索引是可能的,配置名稱由另一列指定,例如: ``` CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector(config_name, body)); ``` 在`pgweb`表中`config_name`是一列。這允許在同一索引中混合配置,當記錄的配置被用于每個索引條目。 這將是有用的,例如,如果文檔集合中包含不同的語言文件。再次,意味著使用索引的查詢必須措辭匹配, 例如,`WHERE to_tsvector(config_name, body) @@ 'a & b'`。 索引甚至可以連接列: ``` CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', title || ' ' || body)); ``` 另一個方法是創建一個單獨的`tsvector`列控制`to_tsvector`的輸出。這個例子是`title`和`body`的一個級聯, 當其他是`NULL`的時候,使用`coalesce`確保一個字段仍然會被索引: ``` ALTER TABLE pgweb ADD COLUMN textsearchable_index_col tsvector; UPDATE pgweb SET textsearchable_index_col = to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,'')); ``` 然后我們為加速搜索創建一個GIN索引: ``` CREATE INDEX textsearch_idx ON pgweb USING gin(textsearchable_index_col); ``` 現在我們準備執行一個快速全文搜索: ``` SELECT title FROM pgweb WHERE textsearchable_index_col @@ to_tsquery('create & table') ORDER BY last_mod_date DESC LIMIT 10; ``` 當使用一個單獨的列存儲`tsvector`形式時,有必要創建一個觸發器以保持`tsvector`列當前任何時候`title`或者`body`的變化。 節[Section 12.4.3](#calibre_link-1114)解釋了如何做。 單獨列方法比一個表達式索引的優勢是它沒有必要明確地聲明為充分利用索引查詢中的文本搜索配置, 正如上面例子所示,查詢依賴于`default_text_search_config`。另一個優勢是搜索比較快速, 因為它沒有必要重新進行`to_tsvector`調用來驗證索引匹配(當使用GIST索引而不是GIN索引的時候, 這是非常重要的,參見節[Section 12.9](#calibre_link-1129))。表達式索引方法更容易建立,然而,它需要較少的磁盤空間, 因為`tsvector`形式沒有明確存儲。
                  <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>

                              哎呀哎呀视频在线观看