<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國際加速解決方案。 廣告
                # 12.4\. 附加功能 本節描述了連接文本搜索中有用的附加功能和操作符。 ## 12.4.1\. 操作文檔 節[Section 12.3.1](#calibre_link-1107)顯示了原始文本文檔如何轉換成`tsvector`值。 PostgreSQL也提供用于操作已經在`tsvector`形式中的文檔的函數和操作符。 `tsvector` || `tsvector` `tsvector`連接操作符返回一個連接詞的向量,以及作為參數給定的2個向量的位置信息。 在連接期間重新獲得位置和權重標簽。出現在右邊向量位置通過左邊向量提到的最大位置相抵消, 因此這個結果幾乎等同于2個原始文檔字符串連接中執行`to_tsvector`的結果。(這個等價是不準確的, 因為任何從左邊參數中刪除的屏蔽詞不會影響結果,然而,如果使用文本連接,它們影響右邊參數詞的位置)。 使用級聯中的向量形式而不是在應用`to_tsvector`之前連接文本的一個優勢是, 你可以使用不同的配置解析文檔的不同部分。同時,由于`setweight`函數標記所有相同方式給定向量的詞匯, 解析文本是必要的,并且如果你想用不同的權重標記文檔不同部分,連接前做`setweight`。 `setweight(``_vector_` `tsvector`, `_weight_` `"char"`) returns `tsvector` `setweight` 返回一個輸入向量的拷貝,其中每一個位置用給定的`_weight_`, `A`, `B`, `C`或者 `D`之一進行標記。(`D`是缺省新向量,因此不顯示在輸出上。)當向量連接時,保留這些標簽, 允許一個文檔的不同部分的詞通過不同相關函數加權。 注意權重標簽適用于_位置_,不是_詞匯_。如果輸入向量已經被剝奪了位置,則`setweight`不做任何事情。 `length(``_vector_` `tsvector`) returns `integer` 返回存儲在向量中的詞的數量。 `strip(``_vector_` `tsvector`) returns `tsvector` 返回一個向量,其中列出了給定向量的同一詞,但它缺乏任何位置和權重信息。 雖然為相關性排序返回的向量比一個未拆分向量用處少,它通常會小得多。 ## 12.4.2\. 處理查詢 節[Section 12.3.2](#calibre_link-1108)顯示了原始文本查詢如何轉換成`tsquery`值。 PostgreSQL也提供了函數和操作符用于處理已存在`tsquery`形式中的查詢 `tsquery` && `tsquery` 返回兩個給定查詢的與組合。 `tsquery` || `tsquery` 返回兩個給定查詢的或組合。 `!!` `tsquery` 返回給定查詢的反面(非)。 `numnode(``_query_` `tsquery`) returns `integer` 返回在一個`tsquery`中節點的數目(詞加操作符)。決定`_query_`是否有意義(返回&gt; 0), 或只包含屏蔽詞(返回0),這個函數是很有用的。例子: ``` SELECT numnode(plainto_tsquery('the any')); NOTICE: query contains only stopword(s) or doesn't contain lexeme(s), ignored numnode --------- 0 SELECT numnode('foo & bar'::tsquery); numnode --------- 3 ``` `querytree(``_query_` `tsquery`) returns `text` 返回可用于搜索索引的`tsquery`部分。此函數對檢測未索引查詢是有幫助的,例如那些只包含屏蔽詞或否定術語。比如: ``` SELECT querytree(to_tsquery('!defined')); querytree ----------- ``` ### 12.4.2.1\. 查詢重寫 函數族`ts_rewrite`搜索一個特定的目標查詢事件`tsquery`,和替換每個替代子查詢。 實際上這個操作是一個子字符串替換的`tsquery`-特定版本。目標和替換組合可以被認為是一個_查詢重寫規則_。 一組這樣的重寫規則可以是一個強大的搜索幫助。例如,你可以使用同義詞擴大搜索(例如,`new york`, `big apple`, `nyc`, `gotham`)或縮小搜索一些熱點問題的直接用戶。在這些特性和同義詞詞典之間功能上有一些重疊(節[Section 12.6.4](#calibre_link-1121))。然而, 你可以在不重建索引情況下即時修改重寫規則,而更新詞庫需要重建索引才能有效。 `ts_rewrite (``_query_` `tsquery`, `_target_` `tsquery`, `_substitute_` `tsquery`) returns `tsquery` `ts_rewrite`的這種形式只適用于一個單一的重寫規則:無論出現在`_query_`的什么地方,`_target_`通過`_substitute_`替換。比如: ``` SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'c'::tsquery); ts_rewrite ------------ 'b' & 'c' ``` `ts_rewrite (``_query_` `tsquery`, `_select_` `text`) returns `tsquery` `ts_rewrite`的這種形式接受起始`_查詢_`和SQL `_select_`命令,這是作為一個文本字符串。 `_select_`必須產生兩列`tsquery`類型。`_select_`結果的每一行,出現的第一個字段的值(目標) 都被當前的`_query_`值中的第二個字段值(替代)。比如: 注意,當多個重寫規則適用于這種方式時,應用的順序非常重要; 因此在實踐中你將需要源查詢為`ORDER BY`一些排序關鍵字。 讓我們考慮下現實生活中天文的例子。我們將使用表驅動的重寫規則擴大查詢`supernovae`: ``` CREATE TABLE aliases (t tsquery primary key, s tsquery); INSERT INTO aliases VALUES(to_tsquery('supernovae'), to_tsquery('supernovae|sn')); SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases'); ts_rewrite --------------------------------- 'crab' & ( 'supernova' | 'sn' ) ``` 我們可以通過更新表改變重寫規則: ``` UPDATE aliases SET s = to_tsquery('supernovae|sn & !nebulae') WHERE t = to_tsquery('supernovae'); SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases'); ts_rewrite --------------------------------------------- 'crab' & ( 'supernova' | 'sn' & !'nebula' ) ``` 當有許多的重寫規則的時候,重寫比較緩慢,因為它檢查可能匹配的每一個規則。 為過濾掉明顯非候選規則,我們可以使用`tsquery`類型的包含操作符。在下面的例子中, 我們只選擇那些可能與原始查詢匹配的規則: ``` SELECT ts_rewrite('a & b'::tsquery, 'SELECT t,s FROM aliases WHERE ''a & b''::tsquery @> t'); ts_rewrite ------------ 'b' & 'c' ``` ## 12.4.3\. 自動更新的觸發器 當使用單獨的列存儲文檔的`tsvector`形式,當文檔內容列變化時, 有必要建立一個觸發器更新`tsvector`列。兩個內置的觸發器功能可用于此, 或者你可以自定義觸發器。 ``` tsvector_update_trigger(_tsvector_column_name_, _config_name_, _text_column_name_ [, ... ]) tsvector_update_trigger_column(_tsvector_column_name_, _config_column_name_, _text_column_name_ [, ... ]) ``` 這些觸發器函數自動計算來自一個或多個文本字段的`tsvector`列,在`CREATE TRIGGER`命令指定的參數控制下。 使用的例子是: ``` CREATE TABLE messages ( title text, body text, tsv tsvector ); CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON messages FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(tsv, 'pg_catalog.english', title, body); INSERT INTO messages VALUES('title here', 'the body text is here'); SELECT * FROM messages; title | body | tsv ------------+-----------------------+---------------------------- title here | the body text is here | 'bodi':4 'text':5 'titl':1 SELECT title, body FROM messages WHERE tsv @@ to_tsquery('title & body'); title | body ------------+----------------------- title here | the body text is here ``` 創建觸發器,在`title`或者`body`中的任何改變都會自動反映到`tsv`中,而不必擔心它的應用。 第一個觸發器參數必須是被更新的`tsvector`字段名。第二個參數指定要進行轉換的文本搜索配置。 為`tsvector_update_trigger`,配置的名稱僅僅是作為第二個觸發器參數。它必須是如上所示的模式匹配, 因此觸發器的行為在`search_path`中不會改變。為`tsvector_update_trigger_column`, 第二個觸發器參數是另一個表列的名稱,它的類型必須是`regconfig`。這允許每行選擇進行配置。 剩余的參數(s)是文本列的名稱(鍵入`text`, `varchar`或者`char`)。這些將在給定的順序中提供文檔。 空值將被忽略(但其他列仍將被索引)。 這些內置觸發器的限制是它們一致對待所有輸入列。為了處理不同列—比如, 為權重不同主體的標題—它有必要編寫一個自定義觸發器。 這是使用PL/pgSQL 作為觸發器語言的一個例子: ``` CREATE FUNCTION messages_trigger() RETURNS trigger AS $$ begin new.tsv := setweight(to_tsvector('pg_catalog.english', coalesce(new.title,'')), 'A') || setweight(to_tsvector('pg_catalog.english', coalesce(new.body,'')), 'D'); return new; end $$ LANGUAGE plpgsql; CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON messages FOR EACH ROW EXECUTE PROCEDURE messages_trigger(); ``` 記住當在觸發器內部創造`tsvector`值時,明確指定配置的名稱是很重要的, 所以,該列的內容將通過改變`default_text_search_config`而不會受到影響。 如果不這樣做可能會導致諸如重載轉儲之后搜索結果改變的問題。 ## 12.4.4\. 收集文獻統計 函數`ts_stat`可用于檢查你的配置和查找屏蔽候選詞。 ``` ts_stat(_sqlquery_ text, [ `_weights_` `text`, ] OUT _word_ text, OUT _ndoc_ integer, OUT _nentry_ integer) returns setof record ``` `_sqlquery_`是一個包含返回單獨`tsvector`列的SQL查詢的文本值。 `ts_stat`執行查詢并返回包含`tsvector`數據的各個不同的語義(詞)的統計。返回的列: * `_word_` `text` — 一個詞的值 * `_ndoc_` `integer` —這個詞出現的文檔編號(`tsvector`s) * `_nentry_` `integer` —這個詞出現的總數 如果提供`_weights_` ,僅僅計算這些權重之一。 例如,在一個文檔集合中查找十個最常用的單詞: ``` SELECT * FROM ts_stat('SELECT vector FROM apod') ORDER BY nentry DESC, ndoc DESC, word LIMIT 10; ``` 同樣的,但是只計算權重weight `A`或者`B`的單詞: ``` SELECT * FROM ts_stat('SELECT vector FROM apod', 'ab') ORDER BY nentry DESC, ndoc DESC, word LIMIT 10; ```
                  <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>

                              哎呀哎呀视频在线观看