校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 如何使用PostgreSQL進行中文全文檢索

如何使用PostgreSQL進行中文全文檢索

熱門標簽:濟南外呼網絡電話線路 天津開發區地圖標注app 電銷機器人能補救房產中介嗎 400電話申請客服 移動外呼系統模擬題 地圖標注要花多少錢 江蘇400電話辦理官方 電話機器人怎么換人工座席 廣州電銷機器人公司招聘

開始

安裝

首先是安裝 PgSQL,這里我使用的是 PgSQL 9.6,PgSQL 10 也剛發布了,有興趣的可以嘗下鮮。

PgSQL 的安裝可以說非常復雜了,除了要安裝 Server 和 Client 外,還需要安裝 devel 包。為了實現空間索引功能,我們還要安裝最重要的 PostGIS 插件,此插件需要很多依賴,自己手動安裝非常復雜而且很可能出錯。

推薦自動化方式安裝,Yum 一定要配合 epel 這樣的 Yum 源,保障能將依賴一網打盡。當然最好的還是使用 docker 來運行,找個鏡像就行了。

插件

由于 PgSQL 的很多功能都由插件實現,所以還要安裝一些常用的插件,如:

postgis_topology(管理面、邊、點等拓撲對象)

pgrouting(路徑規劃)

postgis_sfcgal(實現3D相關算法)

fuzzystrmatch(字符串相似度計算)

address_standardizer/address_standardizer_data_us(地址標準化)

pg_trgm(分詞索引)

這些插件在安裝目錄 /path/extensions 下編譯完畢后,在數據庫中使用前要先使用 create extension xxx 啟用。

啟動

1.切換到非 root 用戶。(PgSQL 在安裝完畢后會創建一個名為 postgres 的超級用戶,我們可以使用這個超級用戶來操作 PgSQL,后期建議重新創建一個普通用戶用來管理數據);

2.切換到 /installPath/bin/ 目錄下,PgSQL 在此目錄下提供了很多命令,如 createdb、createuser、dropdb、pg_dump 等;

3.使用 createdb 命令初始化一個文件夾 dir_db (此目錄不能已存在)存放數據庫物理數據,使用 -E UTF8 參數指定數據庫字符集為 utf-8;

4.使用 pg_ctl -D dir_db 指定數據庫啟動后臺服務;

5.使用 psql -d db 在命令行登陸 PgSQL;

配置

安裝完畢后還要配置一些比較基本的參數才能正常使用。

Host權限

PgSQL需要在 pg_hba.conf 文件中配置數據庫 Host 權限,才能被其他機器訪問。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

local   all             all                                     trust

host    all             all             127.0.0.1/32            md5

host    all             all             172.16.0.1/16            md5

文件中注釋部分對這幾個字段介紹得比較詳細, 我們很可能需要添加 host(IP) 訪問項, ADDRESS 是普通的網段表示法,METHOD 推薦使用 md5,表示使用 md5 加密傳輸密碼。

服務器配置

服務器配置在 postgresql.conf中,修改配置后需要 使用 pg_ctl restart -D dir_db 命令重啟數據庫;

此外,我們也可以在登陸數據庫后修改配置項:使用 SELECT * FROM pg_settings WHERE name = 'config'; 查詢當前配置項,再使用 UPDATE 語句更新配置。但有些配置如內存分配策略是只在當前 session 生效的,全局生效需要在配置文件中修改,再重啟服務器。

我們可以修改配置并用客戶端驗證 SQL 語句的優化,使用 \timing on 開啟查詢計時,使用 EXPLAIN ANALYSE 語句 分析查詢語句效率。 下面介紹兩個已實踐過的配置參數:

  • shared_buffers:用于指定共享內存緩沖區所占用的內存量。它應該足夠大來存儲常使用的查詢結果,以減少物理I/O。但它也不能太大,以避免系統 內存swap 的發生, 一般設置為系統內存的 20%。
  • work_mem:一個連接的工作內存,在查詢結果數據量較大時,此值如果較小的話,會導致大量系統 I/O,導致查詢速度急劇下降,如果你的 explain 語句內 buffer 部分 read數值過大,則表示工作內存不足,需要調整加此參數。但此值也不能太大,需要保證 work_mem * max_connections + shared_buffers + 系統內存 RAM,不然同樣可能會導致系統 內存swap。

這樣,PgSQL 就能作為一個正常的關系型數據使用了。

分詞

全文索引的實現要靠 PgSQL 的 gin 索引。分詞功能 PgSQL 內置了英文、西班牙文等,但中文分詞需要借助開源插件 zhparser;

SCWS

要使用 zhparser,我們首先要安裝 SCWS 分詞庫,SCWS 是 Simple Chinese Word Segmentation 的首字母縮寫(即:簡易中文分詞系統),其 GitHub 項目地址為 hightman-scws,我們下載之后可以直接安裝。

安裝完后,就可以在命令行中使用 scws 命令進行測試分詞了, 其參數主要有:

  • -c utf8 指定字符集
  • -d dict 指定字典 可以是 xdb 或 txt 格式
  • -M 復合分詞的級別, 1~15,按位異或的 1|2|4|8 依次表示 短詞|二元|主要字|全部字,默認不復合分詞,這個參數可以幫助調整到最想要的分詞效果。

zhpaser

1.下載 zhparser 源碼 git clone https:github.com/amutu/zhparser.git;

2.安裝前需要先配置環境變量:export PATH=$PATH:/path/to/pgsql;

3.make make install編譯 zhparser;

4.登陸 PgSQL 使用 CREATE EXTENSION zhparser; 啟用插件;

5.添加分詞配置

CREATE TEXT SEARCH CONFIGURATION parser_name (PARSER = zhparser); // 添加配置
ALTER TEXT SEARCH CONFIGURATION parser_name ADD MAPPING FOR n,v,a,i,e,l,j WITH simple; // 設置分詞規則 (n 名詞 v 動詞等,詳情閱讀下面的文檔)

6.給某一列的分詞結果添加 gin 索引 create index idx_name on table using gin(to_tsvector('parser_name', field));

7.在命令行中使用上一節中介紹的 scws 命令測試分詞配置,如我認為復合等級為 7 時分詞結果最好,則我在 postgresql.conf添加配置

zhparser.multi_short = true #短詞復合: 1

zhparser.multi_duality = true  #散字二元復合: 2

zhparser.multi_zmain = true  #重要單字復合: 4

zhparser.multi_zall = false  #全部單字復合: 8

SQL

查詢中我們可以使用最簡單的 SELECT * FROM table WHERE to_tsvector('parser_name', field) @@ 'word' 來查詢 field 字段分詞中帶有 word 一詞的數據;

使用 to_tsquery() 方法將句子解析成各個詞的組合向量,如 國家大劇院 的返回結果為 '國家' '大劇院' '大劇' '劇院' ,當然我們也可以使用 | 符號拼接自己需要的向量;在查詢 長句 時,可以使用 SELECT * FROM table WHERE to_tsvector('parser_name', field) @@ to_tsquery('parser_name','words');

有時候我們想像 MySQL 的 SQL_CALC_FOUND_ROWS 語句一樣同步返回結果條數,則可以使用 SELECT COUNT(*) OVER() AS score FROM table WHERE ...,PgSQL 會在每一行數據添加 score 字段存儲查詢到的總結果條數;

到這里,普通的全文檢索需求已經實現了。

優化

我們接著對分詞效果和效率進行優化:

存儲分詞結果

我們可以使用一個字段來存儲分詞向量,并在此字段上創建索引來更優地使用分詞索引:

ALTER TABLE table ADD COLUMN tsv_column tsvector;           // 添加一個分詞字段
UPDATE table SET tsv_column = to_tsvector('parser_name', coalesce(field,''));   // 將字段的分詞向量更新到新字段中
CREATE INDEX idx_gin_zhcn ON table USING GIN(tsv_column);   // 在新字段上創建索引
CREATE TRIGGER trigger_name BEFORE INSERT OR UPDATE  ON table FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(tsv_column, 'parser_name', field); // 創建一個更新分詞觸發器

這樣,再進行查詢時就可以直接使用 SELECT * FROM table WHERE tsv_column @@ 'keyword' 了。

這里需要注意,這時候在往表內插入數據的時候,可能會報錯,提示指定 parser_name 的 schema, 這時候可以使用 \dF 命令查看所有 text search configuration 的參數:

               List of text search configurations

   Schema   |    Name    |              Description

------------+------------+---------------------------------------

 pg_catalog | english    | configuration for english language

 public     | myparser   |

注意 schema 參數,在創建 trigger 時需要指定 schema, 如上面,就需要使用 public.myparser。

添加自定義詞典

我們可以在網上下載 xdb 格式的詞庫來替代默認詞典,詞庫放在 share/tsearch_data/ 文件夾下才能被 PgSQL 讀取到,默認使用的詞庫是 dict.utf8.xdb。要使用自定義詞庫,可以將詞庫放在詞庫文件夾后,在 postgresql.conf 配置 zhparser.extra_dict="mydict.xdb" 參數;

當我們只有 txt 的詞庫,想把這個詞庫作為默認詞庫該怎么辦呢?使用 scws 帶的scwe-gen-dict 工具或網上找的腳本生成 xdb 后放入詞庫文件夾后,在 PgSQL 中分詞一直報錯,讀取詞庫文件失敗。我經過多次實驗,總結出了一套制作一個詞典文件的方法:

1.準備詞庫源文件 mydict.txt:詞庫文件的內容每一行的格式為詞 TF IDF 詞性,詞是必須的,而 TF 詞頻(Term Frequency)、IDF 反文檔頻率(Inverse Document Frequency) 和 詞性 都是可選的,除非確定自己的詞典資料是對的且符合 scws 的配置,不然最好還是留空,讓 scws 自已確定;

2.在 postgresql.conf 中設置 zhparser.extra_dicts = "mydict.txt" 同時設置 zhparser.dict_in_memory = true;

3.命令行進入 PgSQL,執行一條分詞語句 select to_tsquery('parser', '隨便一個詞') ,分詞會極慢,請耐心(請保證此時只有一個分詞語句在執行);

4.分詞成功后,在/tmp/目錄下找到生成的 scws-xxxx.xdb 替換掉 share/tsearch_data/dict.utf8.xdb;

5.刪除剛加入的 extra_dicts dict_in_memory 配置,重啟服務器。

擴展

由于查詢的是 POI 的名稱,一般較短,且很多詞并無語義,又考慮到用戶的輸入習慣,一般會輸入 POI 名稱的前幾個字符,而且 scws 的分詞準確率也不能達到100%,于是我添加了名稱的前綴查詢來提高查詢的準確率,即使用 B樹索引 實現 LIKE '關鍵詞%' 的查詢。這里需

這里要注意的是,創建索引時要根據字段類型配置 操作符類,不然索引可能會不生效,如在 字段類型為 varchar 的字段上創建索引需要使用語句CREATE INDEX idx_name ON table(COLUMN varchar_pattern_ops),這里的 varcharpatternops 就是操作符類。

自此,一個良好的全文檢索系統就完成了。

總結

簡單的數據遷移并不是終點,后續要做的還有很多,如整個系統的數據同步、查詢效率優化、查詢功能優化(添加拼音搜索、模糊搜索)等。特別是查詢效率,不知道是不是我配置有問題,完全達不到那種 E級毫秒 的速度,1kw 的數據效率在進行大結果返回時就大幅下降(200ms),只好老老實實地提前進行了分表,目前百萬級查詢速度在 20ms 以內,優化還有一段路要走。

不過這次倒是對 技術的“生態”有了個更深的體會,這方面 PgSQL 確實和 MySQL 差遠了,使用 MySQL 時再奇葩的問題都能在網上快速找到答案,而 PgSQL 就尷尬了,入門級的問題搜索 stackoverflow 來來回回就那么幾個對不上的回答。雖然也有阿里的“德哥”一樣的大神在辛苦布道,但用戶的數量才是根本。不過,隨著 PgSQL 越來越完善,使用它的人一定會越來越多的,我這篇文章也算是為 PgSQL 加溫了吧,哈哈~希望能幫到后來的使用者。

以上就是如何使用PostgreSQL進行中文全文檢索的詳細內容,更多關于使用PostgreSQL進行中文全文檢索的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • PostGreSql 判斷字符串中是否有中文的案例
  • PostgreSQL的中文拼音排序案例
  • 自定義函數實現單詞排序并運用于PostgreSQL(實現代碼)
  • PostgreSQL將數據加載到buffer cache中操作方法
  • 在PostgreSQL中使用ltree處理層次結構數據的方法
  • postgresql 中的時間處理小技巧(推薦)
  • Postgresql限制用戶登錄錯誤次數的實例代碼
  • PostgreSQL用戶登錄失敗自動鎖定的處理方案
  • postgresql影子用戶實踐場景分析

標簽:昭通 海西 濮陽 杭州 辛集 寶雞 溫州 榆林

巨人網絡通訊聲明:本文標題《如何使用PostgreSQL進行中文全文檢索》,本文關鍵詞  如何,使用,PostgreSQL,進行,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何使用PostgreSQL進行中文全文檢索》相關的同類信息!
  • 本頁收集關于如何使用PostgreSQL進行中文全文檢索的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91九色02白丝porn| 26uuu精品一区二区| 亚洲综合一区在线| 欧美一区二区成人| 国产资源精品在线观看| 久久蜜桃av一区精品变态类天堂| 国产传媒日韩欧美成人| 亚洲欧美色图小说| 欧美一区二区美女| 久久久久久久久久久久电影| 亚洲欧洲另类国产综合| 91精品啪在线观看国产60岁| 日韩一区二区三区四区| 99精品国产热久久91蜜凸| 极品美女销魂一区二区三区| 欧美国产丝袜视频| 日韩精品中午字幕| 91福利在线播放| 粉嫩高潮美女一区二区三区| 日韩国产欧美在线观看| 天天综合天天做天天综合| 亚洲精品在线免费播放| 欧美乱妇一区二区三区不卡视频| 国产成人啪午夜精品网站男同| 免费视频最近日韩| 亚洲主播在线观看| 亚洲男人电影天堂| 国产精品久久久爽爽爽麻豆色哟哟 | 69堂精品视频| 91精品久久久久久久91蜜桃| 91精品国产色综合久久不卡蜜臀| 欧美精品日日鲁夜夜添| 久久影视一区二区| 欧美午夜影院一区| 欧美一区二区性放荡片| 精品欧美一区二区三区精品久久| 欧美日韩一区不卡| 欧美一级日韩一级| 4438x成人网最大色成网站| 91一区二区在线观看| 91精品久久久久久久91蜜桃| 精品久久一区二区| 亚洲女同一区二区| 日韩中文字幕av电影| 国产精品一二二区| 8v天堂国产在线一区二区| 久久久一区二区| 视频在线观看一区二区三区| 国产成人综合在线观看| 欧美日韩免费观看一区二区三区| 精品国产乱码久久久久久浪潮| 国产亚洲精品久| 日本欧美在线看| 在线观看欧美黄色| 精品国产自在久精品国产| 一区二区三区四区五区视频在线观看| 免费av网站大全久久| 欧美视频一区二区三区在线观看| 国产精品免费av| 国内外成人在线| 久久综合九色综合欧美就去吻 | 精品写真视频在线观看| 欧美日韩免费视频| 一级女性全黄久久生活片免费| 成人激情动漫在线观看| 欧美成人欧美edvon| 免费一级片91| 日韩欧美国产系列| 久久精品国产精品亚洲精品| 欧美剧情电影在线观看完整版免费励志电影 | 国产精品99久久久久久有的能看 | 极品少妇xxxx精品少妇偷拍 | 777午夜精品免费视频| 日韩电影网1区2区| 欧美tickling挠脚心丨vk| 国产精品一区二区果冻传媒| 久久久国产精品午夜一区ai换脸| 国产精品综合视频| 亚洲欧美一区二区在线观看| 91老师片黄在线观看| 午夜久久久久久| 亚洲精品一区二区在线观看| 国产一区二区三区免费看| 中文字幕视频一区二区三区久| 99在线精品观看| 日韩精品亚洲专区| 中文在线资源观看网站视频免费不卡| 91精品91久久久中77777| 亚洲精品videosex极品| 日韩午夜激情电影| 91视视频在线直接观看在线看网页在线看| 亚洲国产视频a| 国产无一区二区| 欧美一级一级性生活免费录像| 国产成人午夜99999| 蜜桃视频一区二区三区在线观看| 国产精品麻豆网站| 精品欧美一区二区三区精品久久| 色哟哟国产精品| 色欧美日韩亚洲| 色婷婷激情久久| www.激情成人| 国产盗摄一区二区| 国产一区二区三区不卡在线观看 | 精品一区二区三区视频在线观看 | 日韩欧美在线1卡| 欧美一级欧美三级在线观看 | 久久99精品视频| 东方欧美亚洲色图在线| 国产一区二区三区在线观看免费视频| 午夜国产精品一区| 无码av免费一区二区三区试看| 亚洲欧美日韩一区二区三区在线观看| 国产精品三级视频| 成人欧美一区二区三区白人| www亚洲一区| 亚洲国产精品v| 亚洲精品日产精品乱码不卡| 亚洲欧美色图小说| 日日夜夜精品免费视频| 国产一区二区免费视频| 懂色av一区二区三区蜜臀| 欧美在线观看一区二区| 欧美日韩黄视频| 久久久精品2019中文字幕之3| 中文字幕免费不卡| 亚洲靠逼com| 国产精品白丝jk白祙喷水网站| 色综合久久精品| 制服丝袜国产精品| 国产精品久久久久久久久果冻传媒| 亚洲综合清纯丝袜自拍| 国内成人自拍视频| 91精品欧美久久久久久动漫| 国产无一区二区| 亚洲午夜羞羞片| 99久久伊人网影院| 精品国产一区二区三区久久久蜜月| 国产精品久久久久永久免费观看 | 亚洲资源中文字幕| a亚洲天堂av| 国产亚洲一区字幕| 免费成人在线观看| 在线观看免费亚洲| 亚洲欧美激情小说另类| 成人一区二区三区| 精品1区2区在线观看| 奇米四色…亚洲| 日韩一区二区视频| 日本中文在线一区| 欧美三级蜜桃2在线观看| 亚洲狠狠爱一区二区三区| 一本久久精品一区二区| 亚洲一区二区三区四区五区黄| 91网站在线观看视频| 亚洲一级电影视频| 在线欧美一区二区| 日韩成人免费电影| 2020国产精品久久精品美国| 国内精品伊人久久久久影院对白| 久久久久久免费网| 成人在线一区二区三区| 亚洲精品乱码久久久久久久久| 欧美日韩国产免费一区二区| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美极品少妇xxxxⅹ高跟鞋 | 91美女精品福利| 日本va欧美va欧美va精品| 久久精品综合网| 欧美在线一二三| 国产又黄又大久久| 夜夜嗨av一区二区三区中文字幕| 欧美精品乱码久久久久久| 成人福利视频网站| 青青草伊人久久| 亚洲一二三四在线观看| 精品粉嫩aⅴ一区二区三区四区 | 国产一二三精品| 亚洲影视在线观看| 欧美国产精品一区二区| 欧美一级日韩一级| 在线观看91精品国产入口| 国产一区91精品张津瑜| 视频一区国产视频| 亚洲免费在线电影| 久久精品一区八戒影视| 91精品国产综合久久精品图片| 99久久精品国产一区| 国产久卡久卡久卡久卡视频精品| 亚洲国产精品天堂| 亚洲综合成人网| 一区二区成人在线观看| 中文字幕亚洲综合久久菠萝蜜| 欧美精品一区二区三区蜜桃视频| 91黄色激情网站| 欧美年轻男男videosbes| 欧美亚洲综合久久| 在线播放91灌醉迷j高跟美女 | 精品久久久久久综合日本欧美| 51精品视频一区二区三区|