<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.6\. 詞典 詞典用于刪除那些不在搜索范圍內的詞(_屏蔽詞_),并且為了_規范化_,將匹配同一個詞的不同形式。 一個成功的規范化的詞叫_詞位_。除了提高檢索質量外,屏蔽詞的規范化和刪除可以減少文檔`tsvector`形式的大小, 從而提高性能。規范化并不總是有語言學意義,通常取決于應用程序的環境。 一些規范化的例子: * 語言的-Ispell詞典盡量減少輸入字的正規形式;詞干詞典去掉詞尾 * URL位置可以使等效URL匹配被規范化: * http://www.pgsql.ru/db/mw/index.html * http://www.pgsql.ru/db/mw/ * http://www.pgsql.ru/db/../db/mw/index.html * 顏色名稱可以由他們的十六進制值替換,比如:`red, green, blue, magenta -&gt; FF0000, 00FF00, 0000FF, FF00FF` * 如果索引數字,我們可以刪除一些小數位數,減少可能數字的范圍,例如如果保留小數點后兩位小數, 則_3.14_159265359,_3.14_15926將歸一化為一樣的_3.14_ 字典是一個程序,它接受標記作為輸入和返回: * 詞條數組如果輸入標記是已知的詞典(注意,一個標記可以產生一個以上的詞) * 用`TSL_FILTER`標志設置的單詞,與被傳遞到隨后的詞典的新的標記代替原來的(稱這是_過濾詞典_) * 如果詞典認為標記是空數組,但它是一個屏蔽詞。 * 如果詞典不能識別輸入標記,則為`空` PostgreSQL提供了多種語言的預定義字典。也有幾個預定義的模板,可用于創建自定義參數的新詞典。 每個預定義的字典模板描述如下。如果沒有現成的模板是合適的,它可以創建一個新的; 參見PostgreSQL發布的`contrib/`部分例子 文本搜索配置將解析器和處理解析器輸出標記綁定在一起。為了每個標記類型, 返回解析器,單獨的詞典列表通過配置指定。當標記類型是由解析器發現時, 列表中的每個字典依次查閱,直到一些詞典作為一個已知的單詞識別它。如果它被確定為一個屏蔽詞, 或者如果沒有詞典識別標記,它將被丟棄,并且沒有索引或搜索。通常,返回一個非-`空`輸出的第一個詞典將決定結果, 并且不查閱任何剩余的詞典;但過濾詞典可以替換帶有修飾詞的給定詞,然后被傳遞給后繼詞典。 配置一個字典列表的一般規則是放在第一個最窄的,最具體的詞典中,然后是更一般的詞典, 整理一個非常普遍的詞典,像Snowball詞干或`simple`可以識別一切。例如, 一個天文學的特定搜索(`astro_en`配置)可以將標記類型`asciiword`(ASCII字)綁定到天文術語的同義詞詞典, 一般英語詞典和Snowball 英文詞干分析器: ``` ALTER TEXT SEARCH CONFIGURATION astro_en ADD MAPPING FOR asciiword WITH astrosyn, english_ispell, english_stem; ``` 過濾詞典可以放置在列表中的任何地方,除了在結束的地方會是無用的。 過濾詞典部分規范化詞以簡化后繼詞典的任務是非常有用的。 例如,過濾詞典可以用來從重音字母中刪除重音,按照[unaccent](#calibre_link-405)模塊執行。 ## 12.6.1\. 屏蔽詞 屏蔽詞是很常見的詞,出現在幾乎每一個文檔中,并且沒有區分值。因此,他們可以在全文搜索的環境中被忽視的。 例如,每個英文文本包含像`a` 和 `the`的單詞,因此它們在索引中存儲無效。然而,屏蔽詞影響在`tsvector`中的位置, 這反過來也影響相關度: ``` SELECT to_tsvector('english','in the list of stop words'); to_tsvector ---------------------------- 'list':3 'stop':5 'word':6 ``` 丟失位置1,2,4是因為屏蔽詞。帶有和沒有屏蔽詞的文檔排序計算是完全不同的: ``` SELECT ts_rank_cd (to_tsvector('english','in the list of stop words'), to_tsquery('list & stop')); ts_rank_cd ------------ 0.05 SELECT ts_rank_cd (to_tsvector('english','list stop words'), to_tsquery('list & stop')); ts_rank_cd ------------ 0.1 ``` 如何處理屏蔽詞,它是由特定詞典決定的。例如,`ispell`詞典首先規范詞,然后查看屏蔽詞列表, 而`Snowball`詞干首先檢查屏蔽詞列表。這個不同操作的原因是為了減少噪音。 ## 12.6.2\. Simple 詞典 `simple`字典模板通過轉換輸入標記為小寫字母進行,并且屏蔽詞文件前檢查它。 如果在文檔中找到并返回空數組,則丟棄這個標記。如果沒有,單詞的小寫字母形式作為歸一化的詞返回。 另外,詞典可以為報告未識別的非屏蔽詞進行配置,允許將它們傳遞到列表中的后繼詞典中。 這有使用`simple`模板的詞典定義的例子: ``` CREATE TEXT SEARCH DICTIONARY public.simple_dict ( TEMPLATE = pg_catalog.simple, STOPWORDS = english ); ``` 在這里,`english`是一種屏蔽詞文件的基礎名稱。文檔的全名為`$SHAREDIR/tsearch_data/english.stop`, 這里的`$SHAREDIR`是PostgreSQL安裝的共享數據目錄,經常使用`/usr/local/share/postgresql`(如果你不確定, 則使用`pg_config --sharedir`來決定)。文檔格式是一個簡單的單詞列表,每行一個。忽略空白行和空格, 并且大寫字母轉換成小寫字母,但對文檔內容沒有其他的處理方式。 現在我們可以測試我們的詞典: ``` SELECT ts_lexize('public.simple_dict','YeS'); ts_lexize ----------- {yes} SELECT ts_lexize('public.simple_dict','The'); ts_lexize ----------- {} ``` 如果沒在屏蔽詞文件中找到,我們也可以選擇返回`NULL`,而不是小寫字母單詞。 這種行為是通過設置字典的`Accept`參數為`false`選擇的。繼續例子: ``` ALTER TEXT SEARCH DICTIONARY public.simple_dict ( Accept = false ); SELECT ts_lexize('public.simple_dict','YeS'); ts_lexize ----------- SELECT ts_lexize('public.simple_dict','The'); ts_lexize ----------- {} ``` 隨著缺省設置`Accept` = `true`,它把`simple`詞典放在詞典列表末尾的時候是很有用的, 因為它不會傳遞任何標記給后繼詞典。相反,當至少有一個后繼詞典時,`Accept` = `false`是唯一有用的。 | **Caution** | |:--- | | 詞典大部分類型依賴于配置文檔,如屏蔽詞文件。這些文件_必須_存儲在UTF-8編碼中。 當他們讀到服務器中,如果是不同的,他們將被轉化為實際的數據庫編碼。 | | **Caution** | |:--- | | 通常情況下,當它在會話中第一次使用時,數據庫會話將只讀一次詞典的配置文檔, 如果你修改一個配置文檔,想強制現有會話獲取新的內容,則在詞典中使用命令`ALTER TEXT SEARCH DICTIONARY`。 這是一個"虛擬"的更新,實際上并沒有改變任何參數值。 | ## 12.6.3\. 同義詞詞典 這個字典模板用于創建替代詞和同義詞的詞典。不支持短語(使用同義詞庫模板(節[Section 12.6.4](#calibre_link-1121))。 一個同義詞詞典可以用來克服語言上的問題,例如,防止英語詞干詞典使單詞"Paris"變成"pari"。 這足以在同義詞詞典中有`Paris paris`行并且放在`english_stem`詞典之前。比如: ``` SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+----------------+--------------+--------- asciiword | Word, all ASCII | Paris | {english_stem} | english_stem | {pari} CREATE TEXT SEARCH DICTIONARY my_synonym ( TEMPLATE = synonym, SYNONYMS = my_synonyms ); ALTER TEXT SEARCH CONFIGURATION english ALTER MAPPING FOR asciiword WITH my_synonym, english_stem; SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} ``` `synonym`模版要求的唯一的參數是`SYNONYMS`,這是它的配置文件的基礎名稱—上面例子中`my_synonyms`。 文件的全名為`$SHAREDIR/tsearch_data/my_synonyms.syn`(`$SHAREDIR`是PostgreSQL安裝的共享數據目錄)。 文件格式是每一行的每個字被取代,帶有這個詞的同義詞,用空格分隔。忽略空白行和空格。 `synonym`模版也有一個可選的參數`CaseSensitive`,缺省是`false`。當`CaseSensitive`是`false`時, 同義詞文件中的詞轉換成小寫字母,正如輸入標記。 比較而言,當它是`true`時,詞語和標記不轉換成小寫字母 星號(`*`)可以被放置在配置文件中的同義詞結尾。這表明,同義詞是一個前綴。 當在`to_tsvector()`中使用記錄時,忽略星號。但當它被用在`to_tsquery()`中時, 結果將是帶前綴匹配標記的查詢記錄(參見節[Section 12.3.2](#calibre_link-1108))。例如,假設我們在`$SHAREDIR/tsearch_data/synonym_sample.syn`中有這些記錄。 ``` postgres pgsql postgresql pgsql postgre pgsql gogle googl indices index* ``` 然后我們將得到這些結果: ``` mydb=# CREATE TEXT SEARCH DICTIONARY syn (template=synonym, synonyms='synonym_sample'); mydb=# SELECT ts_lexize('syn','indices'); ts_lexize ----------- {index} (1 row) mydb=# CREATE TEXT SEARCH CONFIGURATION tst (copy=simple); mydb=# ALTER TEXT SEARCH CONFIGURATION tst ALTER MAPPING FOR asciiword WITH syn; mydb=# SELECT to_tsvector('tst','indices'); to_tsvector ------------- 'index':1 (1 row) mydb=# SELECT to_tsquery('tst','indices'); to_tsquery ------------ 'index':* (1 row) mydb=# SELECT 'indexes are very useful'::tsvector; tsvector --------------------------------- 'are' 'indexes' 'useful' 'very' (1 row) mydb=# SELECT 'indexes are very useful'::tsvector @@ to_tsquery('tst','indices'); ?column? ---------- t (1 row) ``` ## 12.6.4\. 同義詞詞典庫 同義詞詞庫(有時簡稱TZ)是一個單詞的組合,包括單詞和短語的關系信息, 比如,更廣泛術語(BT),更窄的術語(NT),首選術語,非優先術語,相關術語等。 基本上同義詞詞庫通過一個首選的術語替換所有非優先術語,另外,也保留索引的原術語。 同義詞詞典PostgreSQL的當前實現是帶有附加_短語_支持的同義詞詞典的擴展。同義詞詞典需要下列格式的配置文件: ``` # this is a comment sample word(s) : indexed word(s) more sample word(s) : more indexed word(s) ... ``` 冒號(`:`)符號作為短語和其替代物之間的分隔符。 同義詞詞典檢查短語匹配之前使用一個_子詞典_(這是在字典的配置中指定)規范輸入文本。 它選擇一個子詞典是可能的。如果子詞典無法識別單詞,報告一個錯誤。在這種情況下, 你應該刪除這個詞或訓練子詞典。你可以在一個索引字跳過應用子詞典的開頭放一個星號(`*`), 但是所有簡單的詞_必須_是子詞典已知的。 如果有多個短語匹配輸入,同義詞詞典選擇最長的匹配。并且使用最后一個定義分離關系。 通過子詞典識別的具體屏蔽詞不能被指定;而使用`?`標記任何屏蔽詞出現的位置。 例如,假設`a`和`the`是依據子詞典的屏蔽詞: ``` ? one ? two : swsw ``` 匹配`a one the two`和`the one a two`;兩者都會被`swsw`替代。 由于同義詞詞典有能力識別短語,它必須記住其狀態并且與分析器交互。同義詞詞典使用這些任務檢查它是否應該處理下一個詞, 或停止積累。同義詞詞典必須小心配置。例如,如果字典詞庫分配只處理`asciiword`標記,那么像`one 7`的同義詞詞典定義將不工作, 因為標記類型`uint`不分配給同義詞詞典。 | **Caution** | |:--- | | 索引中使用詞典,同義詞詞典的任何參數變化都_需要_重新索引。對于大多數其他詞典類型, 小的變化,比如添加或去除屏蔽詞不強迫重新索引。 | ### 12.6.4.1\. 同義詞詞典配置 使用`thesaurus`模板定義一個新的同義詞詞庫。比如: ``` CREATE TEXT SEARCH DICTIONARY thesaurus_simple ( TEMPLATE = thesaurus, DictFile = mythesaurus, Dictionary = pg_catalog.english_stem ); ``` 這里: * `thesaurus_simple`是新詞典的名稱。 * `mythesaurus`是同義詞配置文件的基礎名稱。 (全名為`$SHAREDIR/tsearch_data/mythesaurus.ths`,這里`$SHAREDIR`是安裝的共享數據目錄) * `pg_catalog.english_stem`是用于詞規范化的子詞典(這的Snowball英文詞干)。 注意,子詞典將有自己的配置(例如,屏蔽詞),不顯示在這里。 現在它在配置中可能將同義詞詞典`thesaurus_simple`綁定到所需的標記類型中,例如: ``` ALTER TEXT SEARCH CONFIGURATION russian ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH thesaurus_simple; ``` ### 12.6.4.2\. 同義詞詞典例子 考慮一個簡單的天文詞典`thesaurus_astro`,其中包含了一些天文組合詞: ``` supernovae stars : sn crab nebulae : crab ``` 下面我們創建一個詞典并且綁定標記類型的一些天文詞庫和英文詞干分析器: ``` CREATE TEXT SEARCH DICTIONARY thesaurus_astro ( TEMPLATE = thesaurus, DictFile = thesaurus_astro, Dictionary = english_stem ); ALTER TEXT SEARCH CONFIGURATION russian ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH thesaurus_astro, english_stem; ``` 現在我們可以看到它是如何工作的。`ts_lexize`對測試一個詞庫沒有很大幫助,因為它把輸入作為一個標記。 相反,我們可以使用`plainto_tsquery`和`to_tsvector`,將它們的輸入字符串分離成多個標記: ``` SELECT plainto_tsquery('supernova star'); plainto_tsquery ----------------- 'sn' SELECT to_tsvector('supernova star'); to_tsvector ------------- 'sn':1 ``` 原則上,如果你引用參數,可以使用`to_tsquery`: ``` SELECT to_tsquery('''supernova star'''); to_tsquery ------------ 'sn' ``` 注意`supernova star`與`supernovae stars`在`thesaurus_astro`中匹配,因為我們在詞典的定義中指定了`english_stem`詞干分析器。 詞干分析器刪除`e`和`s`。 為了索引原句以及替代詞,只是將它包括在定義的右邊部分: ``` supernovae stars : sn supernovae stars SELECT plainto_tsquery('supernova star'); plainto_tsquery ----------------------------- 'sn' & 'supernova' & 'star' ``` ## 12.6.5\. Ispell詞典 Ispell詞典模版支持_形態學的詞典_,它可以將一個單詞的許多不同的語言形式標準化為一個詞。 例如,英語Ispell詞典可以匹配所有詞尾變化和搜索詞`bank`的組合, 例如,`banking`, `banked`, `banks`, `banks'`和`bank's`。 標準的PostgreSQL發布不包括任何Ispell配置文件。大量的語言字典可以從[Ispell](http://ficus-www.cs.ucla.edu/geoff/ispell.html)獲得。 同時,— [MySpell](http://en.wikipedia.org/wiki/MySpell) (OO &lt; 2.0.1) 和[Hunspell](http://sourceforge.net/projects/hunspell/)(OO &gt;= 2.0.2)支持一些更現代的詞典文件格式。 大的詞典列表在[OpenOffice Wiki](http://wiki.services.openoffice.org/wiki/Dictionaries)中可用。 使用內置的`ispell`模板創建Ispell 詞典,并指定幾個參數: ``` CREATE TEXT SEARCH DICTIONARY english_ispell ( TEMPLATE = ispell, DictFile = english, AffFile = english, StopWords = english ); ``` 這里,`DictFile`, `AffFile`和`StopWords`指定詞典基礎的名字,詞綴,和屏蔽詞文件。 屏蔽詞文件具有和上面解釋的`simple`詞典類型相同的格式。其它文件的格式不在這里指定, 但可以從上面提到的網站獲取。 Ispell詞典通常識別有限的一組詞,所以他們應該遵循另一個更廣泛的詞典; 例如,一個Snowball詞典,它可以識別一切。 Ispell詞典支持分裂復合詞;一個有用的功能。請注意, 詞綴文件應使用`compound words controlled`語句指定一個特殊標記, 標記可以參與復合信息的詞典單詞: ``` compoundwords controlled z ``` 這有一些Norwegian語言的例子: ``` SELECT ts_lexize('norwegian_ispell', 'overbuljongterningpakkmesterassistent'); {over,buljong,terning,pakk,mester,assistent} SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk'); {sjokoladefabrikk,sjokolade,fabrikk} ``` > **Note:** 注意:MySpell不支持復合詞。Hunspell對復合詞有復雜支持。 目前,PostgreSQL只實現了Hunspell的基本復合詞操作。 ## 12.6.6\. Snowball詞典 Snowball詞典模板是基于Martin Porter的項目,他是英語語言的著名的Porter的詞干提取算法的發明者。 現在Snowball提供了許多語言的詞干提取算法(更多信息請見[Snowball site](http://snowball.tartarus.org))。 每個算法都知道如何改變詞到基礎,或詞根,或其語言拼寫的常見變異形式。 一個Snowball詞典需要`language`參數標識要使用的詞干,并且可以指定一個刪除詞的列表的`stopword`文件名。 (PostgreSQL的標準的屏蔽詞列表也由Snowball項目提供)例如,有一個等價的內置定義。 ``` CREATE TEXT SEARCH DICTIONARY english_stem ( TEMPLATE = snowball, Language = english, StopWords = english ); ``` 屏蔽詞的文件格式和已經解釋過的一樣。 一個Snowball詞典可以識別一切,是否能夠簡化字,所以它應該放在詞典列表的末尾。 它放在任何其他的詞典之前都是無用的,因為一個標記將不會經過它到下一個詞典。
                  <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>

                              哎呀哎呀视频在线观看