A. 電腦-Sphinx在windows下安裝使用[支持中文全文檢索]
前一陣子嘗試使用了一下Sphinx,一個能夠被各種語言(php/python/Ruby/etc)方便調用的全文檢索系統。網上的資料大多是在linux環境下的安裝使用,當然,作為生產環境很有必要部署在*nix環境下,作為學習測試,還是windows環境比較方便些。
本文旨在提供一種便捷的方式讓Sphinx在windows下安裝配置以支持中文全文檢索,配置部分在linux下通用。
一、關於Sphinx
Sphinx 是一個在GPLv2 下發布的一個全文檢索引擎,商業授權(例如, 嵌入到其他程序中)需要聯系作者(Sphinxsearch.com)以獲得商業授權。
一般而言,Sphinx是一個獨立的搜索引擎,意圖為其他應用提供高速、低空間佔用、高結果相關度的全文搜索功能。Sphinx可以非常容易的與SQL資料庫和腳本語言集成。
當前系統內置MySQL和PostgreSQL 資料庫數據源的支持,也支持從標准輸入讀取特定格式的XML數據。通過修改源代碼,用戶可以自行增加新的數據源(例如:其他類型的DBMS的原生支持)。
搜索API支持PHP、Python、Perl、Rudy和Java,並且也可以用作MySQL存儲引擎。搜索API非常簡單,可以在若干個小時之內移植到新的語言上。
Sphinx特性:
高速的建立索引(在當代CPU上,峰值性能可達到10MB/秒); 高性能的搜索(在2–4GB的文本數據上,平均每次檢索響應時間小於0.1秒); 可處理海量數據(目前已知可以處理超過100GB的文本數據,在單一CPU的系統上可處理100M文檔); 提供了優秀的相關度演算法,基於短語相似度和統計(BM25)的復合Ranking方法; 支持分布式搜索; 提供文件的摘錄生成; 可作為MySQL的存儲引擎提供搜索服務; 支持布爾、短語、詞語相似度等多種檢索模式; 文檔支持多個全文檢索欄位(最大不超過32個); 文檔支持多個額外的`屬性信息(例如:分組信息,時間戳等); 停止詞查詢; 支持單一位元組編碼和UTF-8編碼; 原生的MySQL支持(同時支持MyISAM和InnoDB); 原生的PostgreSQL支持.
中文手冊可以在這里獲得(酷勤網備用下載地址:sphinx_doc_zhcn_0.9.pdf)。
二、Sphinx在windows上的安裝
1.直接在http://www.sphinxsearch.com/downloads.html找到最新的windows版本,我這里下的是Win32 release binaries with MySQL support,下載後解壓在D:sphinx目錄下;
2.在D:sphinx下新建一個data目錄用來存放索引文件,一個log目錄方日誌文件,復制D:sphinxsphinx.conf.in到D:sphinxbinsphinx.conf(注意修改文件名);
3.修改D:sphinxbinsphinx.conf,我這里列出需要修改的幾個:
type= mysql # 數據源,我這里是mysqlsql_host;= localhost # 資料庫伺服器sql_user;= root # 資料庫用戶名sql_pass;=;'' # 資料庫密碼sql_db;;;= test # 資料庫sql_port;= 3306 # 資料庫埠
sql_query_pre;;;= SET NAMES utf8 # 去掉此行前面的注釋,如果你的資料庫是uft8編碼的
index test1{#;放索引的目錄;path;;;= D:/sphinx/data/# 編碼;charset_type;;= utf-8;#; 指定utf-8的編碼表;charset_table=0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F;# 簡單分詞,只支持0和1,如果要搜索中文,請指定為1;ngram_len;;;;= 1# 需要分詞的字元,如果要搜索中文,去掉前面的注釋;ngram_chars;;;= U+3000..U+2FA1F}
# index test1stemmed : test1# {;# path;;;= @CONFDIR@/data/test1stemmed;# morphology;;= stem_en# }# 如果沒有分布式索引,注釋掉下面的內容# index dist1# {;# 'distributed' index type MUST be specified;# type;;;;= distributed
;# local index to be searched;# there can be many local indexes configured;# local;;;;= test1;# local;;;;= test1stemmed
;# remote agent;# multiple remote agents may be specified;# syntax is 'hostname:port:index1,[index2[,...]];# agent;;;;= localhost:3313:remote1;# agent;;;;= localhost:3314:remote2,remote3
;# remote agent connection timeout, milliseconds;# optional, default is 1000 ms, ie. 1 sec;# agent_connect_timeout;= 1000
;# remote agent query timeout, milliseconds;# optional, default is 3000 ms, ie. 3 sec;# agent_query_timeout;;= 3000# }
# 搜索服務需要修改的部分searchd{;# 日誌;log;;;;;= D:/sphinx/log/searchd.log
;# PID file, searchd process ID file name;pid_file;;;= D:/sphinx/log/searchd.pid
# windows下啟動searchd服務一定要注釋掉這個 # seamless_rotate;;= 1}
4.導入測試數據
C:Program FilesMySQLMySQL Server 5.0bin>mysql -uroot test<d:/sphinx/example.sql
5.建立索引
D:sphinxbin>indexer.exe test1
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file 『./sphinx.conf』…
indexing index 『test1′…
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.101 sec, 1916.30 bytes/sec, 39.72 docs/sec
D:sphinxbin>
6.搜索』test』試試
D:sphinxbin>search.exe test
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file 『./sphinx.conf』…
index 『test1′: query 『test 『: returned 3 matches of 3 total in 0.000 sec
displaying matches:
1. document=1, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008
;;;;;id=1
;;;;;group_id=1
;;;;;group_id2=5
;;;;;date_added=2008-11-26 14:58:59
;;;;;title=test one
;;;;;content=this is my test document number one. also checking search within
;phrases.
2. document=2, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008
;;;;;id=2
;;;;;group_id=1
;;;;;group_id2=6
;;;;;date_added=2008-11-26 14:58:59
;;;;;title=test two
;;;;;content=this is my test document number two
3. document=4, weight=1, group_id=2, date_added=Wed Nov 26 14:58:59 2008
;;;;;id=4
;;;;;group_id=2
;;;;;group_id2=8
;;;;;date_added=2008-11-26 14:58:59
;;;;;title=doc number four
;;;;;content=this is to test groups
words:
1. 『test』: 3 documents, 5 hits
D:sphinxbin>
都所出來了吧。
6.測試中文搜索
修改test資料庫中documents數據表,
UPDATE `test`.`documents` SET `title` = 『測試中文』, `content` = 『this is my test document number two,應該搜的到吧』 WHERE `documents`.`id` = 2;
重建索引:
D:sphinxbin>indexer.exe –all
搜索』中文』試試:
D:sphinxbin>search.exe 中文
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file 『./sphinx.conf』…
index 『test1′: query 『中文 『: returned 0 matches of 0 total in 0.000 sec
words:
D:sphinxbin>
貌似沒有搜到,這是因為windows命令行中的編碼是gbk,當然搜不出來。我們可以用程序試試,在D:sphinxapi下新建一個foo.php的文件,注意utf-8編碼
<?php
require 』sphinxapi.php』;
$s = new SphinxClient();
$s->SetServer(』localhost』,3312);
$result = $s->Query(』中文』);
var_mp($result);
?>
啟動Sphinx searchd服務
D:sphinxbin>searchd.exe
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
WARNING: forcing –console mode on Windows
using config file 『./sphinx.conf』…
creating server socket on 0.0.0.0:3312
accepting connections
執行PHP查詢:
php d:/sphinx/api/foo.php
結果是不是出來?剩下的工作就是去看手冊,慢慢摸索高階的配置。
B. Python 程序有什麼好的自動從注釋生成文檔的方法
用Sphinx
以win32系統為例,最簡單的安裝方式是在Dos下輸入如下代碼
pip install -U sphinx
安裝好了之後,用最簡單的半自動生成API文檔的方式進行
例如:你的python安裝在C:\python27, 想要給flask包自動製作文檔,製作完成的文檔放在C:\python_doc\flask的文件夾
代碼如下:
sphinx-apidoc -F -o C:\python_doc\flask C:\python27\lib\site-packages\
(此處-o應緊跟輸出文件夾,不然會產生一個-F的文件夾,多謝@Hyacz)
然後進入C:\python_doc\flask文件夾
cd C:\python_doc\flask
此文件夾下有一個make.bat文件,再執行一下
make html
然後就能在\_build\html文件夾中看到生成好的文檔了,還支持查找的功能
C. 在Yii2.0 中怎麼使用 sphinx 搜索
如何調用Sphinx
按上面配置,第5節點對資料庫進行了索引,通過Sphinx自帶的search(在bin/release目錄)就可以在命令行進行搜索:
(搜索CGArt)
windows上:
search -c d:/sphinx/sphinx.conf CGArt
Linux上:
cd /usr/local/sphinx
./bin/search -c sphinx.conf CGArt
運行後,系統提示一堆信息:
....
....
words:
1. 'cgart': 36 documents, 189 hits
這個表示庫中有36條記錄符合要求,出現CGArt的有189處。應用程序如果想調用Sphinx,可以從兩個方面:
一是通過Sphinx官方提供的API介面(介面有Python,Java,Php三種版本)
二是通過安裝SphinxSE(具體見1.2部分),然後創建一個中介sphinxSE類型的表,再通過執行特定的SQL語句實現。
通過官方API調用Sphinx(以PHP為例)
在sphinx安裝目錄有一個API目錄,裡面有三個PHP文件:test.php,test2.php和sphinxapi.php。 sphinxapi.php是sphinx調用介面封裝文件,test.php是一個在命令行下執行的查詢例子文件,test2.php是一個生成摘要的 例子文件。
在命令下行運行test.php(Linux上沒有API目錄,需要從源程序包中復制api目錄至/usr/local/sphinx)
Windows上:
D:\sphinx\bin\release>c:\php5.2\php.exe -c c:\php5.2\php.ini ..\..\api\test.php -i cgfinal CGartLinux上(php在/usr/local/php目錄,sphinx.conf在/usr/local/sphinx目錄):
cd /usr/local/sphinx
/usr/local/php/bin/php api/test.php -i cgfinal CGArtSphinx的API查詢介面主要有這些內容(其實對照 一下sphinxapi.php就清楚了):
//創建Sphinx的客戶端介面對象
$cl = new SphinxClient ();
//設置連接Sphinx主機名與埠
$cl->SetServer('localhost',3312);
//可選,為每一個全文檢索欄位設置權重,主要根據你在sql_query中定義的欄位的順序,Sphinx系統以後會調整,可以按欄位名稱來設定權重
$cl->SetWeights ( array ( 100, 1 ) );
//設定搜索模式,SPH_MATCH_ALL,SPH_MATCH_ANY,SPH_MATCH_BOOLEAN,SPH_MATCH_EXTENDED,SPH_MATCH_PHRASE
$cl->SetMatchMode(SPH_MATCH_ALL);
//設定過濾條件$attribute是屬性名,相當於欄位名(用SPH_MATCH_EXTENDED時),$value是值,$exclude是布爾型,
當為true時,相當於$attribute!=$value,默認值是false
$cl->SetFilter($attribute, $values, $exclude);
//設定group by
//根據分組方法,匹配的記錄集被分流到不同的組,每個組都記錄著組的匹配記錄數以及根據當前排序方法本組中的最佳匹配記錄。
//最後的結果集包含各組的一個最佳匹配記錄,和匹配數量以及分組函數值
//結果集分組可以採用任意一個排序語句,包括文檔的屬性以及sphinx的下面幾個內部屬性
//@id--匹配文檔ID
//@weight, @rank, @relevance--匹配權重
//@group--group by 函數值
//@count--組內記錄數量
//$groupsort的默認排序方法是@group desc,就是按分組函數值大小倒序排列
$cl->SetGroupBy($attribute, $func, $groupsort);
//設定order by的內容,第一個參數是排序方法名,值有
// SPH_SORT_RELEVANCE,SPH_SORT_ATTR_DESC,SPH_SORT_ATTR_ASC,SPH_SORT_TIME_SEGMENTS,SPH_SORT_EXTENDED
//$sortby的值如"HITS desc"
$cl->SetSortMode(SPH_SORT_EXTENDED, $sortby);
//set count-distinct attribute for group-by queries,$distinct為字元串
$cl->SetGroupDistinct ( $distinct );
//相當於mysql的limit $offset,$limit
$cl->SetLimits($start,$limit)
//$q是查詢的關鍵字,$index是索引名稱,當等於*時表查詢所有索引
D. tensorlab 支持python介面嗎
這又是一個 Awesome XXX 系列的資源整理,由 vinta 發起和維護。內容包括:Web框架、網路爬蟲、網路內容提取、模板引擎、資料庫、數據可視化、圖片處理、文本處理、自然語言處理、機器學習、日誌、代碼分析等。
伯樂在線已在 GitHub 上發起「Python 資源大全中文版」的整理。歡迎擴散、歡迎加入。
GitHub - jobbole/awesome-python-cn: Python資源大全中文版
環境管理
管理 Python 版本和環境的工具
p – 非常簡單的互動式 python 版本管理工具。
pyenv – 簡單的 Python 版本管理工具。
Vex – 可以在虛擬環境中執行命令。
virtualenv – 創建獨立 Python 環境的工具。
virtualenvwrapper- virtualenv 的一組擴展。
包管理
管理包和依賴的工具。
pip – Python 包和依賴關系管理工具。
pip-tools – 保證 Python 包依賴關系更新的一組工具。
conda – 跨平台,Python 二進制包管理工具。
Curdling – 管理 Python 包的命令行工具。
wheel – Python 分發的新標准,意在取代 eggs。
包倉庫
本地 PyPI 倉庫服務和代理。
warehouse – 下一代 PyPI。
Warehousebandersnatch – PyPA 提供的 PyPI 鏡像工具。
devpi – PyPI 服務和打包/測試/分發工具。
localshop – 本地 PyPI 服務(自定義包並且自動對 PyPI 鏡像)。
分發
打包為可執行文件以便分發。
PyInstaller – 將 Python 程序轉換成獨立的執行文件(跨平台)。
dh-virtualenv – 構建並將 virtualenv 虛擬環境作為一個 Debian 包來發布。
Nuitka – 將腳本、模塊、包編譯成可執行文件或擴展模塊。
py2app – 將 Python 腳本變為獨立軟體包(Mac OS X)。
py2exe – 將 Python 腳本變為獨立軟體包(Windows)。
pynsist – 一個用來創建 Windows 安裝程序的工具,可以在安裝程序中打包 Python本身。
構建工具
將源碼編譯成軟體。
buildout – 一個構建系統,從多個組件來創建,組裝和部署應用。
BitBake – 針對嵌入式 Linux 的類似 make 的構建工具。
fabricate – 對任何語言自動找到依賴關系的構建工具。
PlatformIO – 多平台命令行構建工具。
PyBuilder – 純 Python 實現的持續化構建工具。
SCons – 軟體構建工具。
互動式解析器
互動式 Python 解析器。
IPython – 功能豐富的工具,非常有效的使用互動式 Python。
bpython- 界面豐富的 Python 解析器。
ptpython – 高級互動式Python解析器, 構建於python-prompt-toolkit 之上。
文件
文件管理和 MIME(多用途的網際郵件擴充協議)類型檢測。
imghdr – (Python 標准庫)檢測圖片類型。
mimetypes – (Python 標准庫)將文件名映射為 MIME 類型。
path.py – 對 os.path 進行封裝的模塊。
pathlib – (Python3.4+ 標准庫)跨平台的、面向對象的路徑操作庫。
python-magic- 文件類型檢測的第三方庫 libmagic 的 Python 介面。
Unipath- 用面向對象的方式操作文件和目錄
watchdog – 管理文件系統事件的 API 和 shell 工具
日期和時間
操作日期和時間的類庫。
arrow- 更好的 Python 日期時間操作類庫。
Chronyk – Python 3 的類庫,用於解析手寫格式的時間和日期。
dateutil – Python datetime 模塊的擴展。
delorean- 解決 Python 中有關日期處理的棘手問題的庫。
moment – 一個用來處理時間和日期的Python庫。靈感來自於Moment.js。
PyTime – 一個簡單易用的Python模塊,用於通過字元串來操作日期/時間。
pytz – 現代以及歷史版本的世界時區定義。將時區資料庫引入Python。
when.py – 提供用戶友好的函數來幫助用戶進行常用的日期和時間操作。
文本處理
用於解析和操作文本的庫。
通用
chardet – 字元編碼檢測器,兼容 Python2 和 Python3。
difflib – (Python 標准庫)幫助我們進行差異化比較。
ftfy – 讓Unicode文本更完整更連貫。
fuzzywuzzy – 模糊字元串匹配。
Levenshtein – 快速計算編輯距離以及字元串的相似度。
pangu.py – 在中日韓語字元和數字字母之間添加空格。
pyfiglet -figlet 的 Python實現。
shortuuid – 一個生成器庫,用以生成簡潔的,明白的,URL 安全的 UUID。
unidecode – Unicode 文本的 ASCII 轉換形式 。
uniout – 列印可讀的字元,而不是轉義的字元串。
xpinyin – 一個用於把漢字轉換為拼音的庫。
Slug化
awesome-slugify – 一個 Python slug 化庫,可以保持 Unicode。
python-slugify – Python slug 化庫,可以把 unicode 轉化為 ASCII。
unicode-slugify – 一個 slug 工具,可以生成 unicode slugs ,需要依賴 Django 。
解析器
phonenumbers – 解析,格式化,儲存,驗證電話號碼。
PLY – lex 和 yacc 解析工具的 Python 實現。
Pygments – 通用語法高亮工具。
pyparsing – 生成通用解析器的框架。
python-nameparser – 把一個人名分解為幾個獨立的部分。
python-user-agents – 瀏覽器 user agent 解析器。
sqlparse – 一個無驗證的 SQL 解析器。
特殊文本格式處理
一些用來解析和操作特殊文本格式的庫。
通用
tablib – 一個用來處理中表格數據的模塊。
Office
Marmir – 把輸入的Python 數據結構轉換為電子表單。
openpyxl – 一個用來讀寫 Excel 2010 xlsx/xlsm/xltx/xltm 文件的庫。
python-docx – 讀取,查詢以及修改 Microsoft Word 2007/2008 docx 文件。
unoconv – 在 LibreOffice/OpenOffice 支持的任意文件格式之間進行轉換。
XlsxWriter – 一個用於創建 Excel .xlsx 文件的 Python 模塊。
xlwings – 一個使得在 Excel 中方便調用 Python 的庫(反之亦然),基於 BSD 協議。
xlwt / xlrd – 讀寫 Excel 文件的數據和格式信息。
relatorio – 模板化OpenDocument 文件。
PDF
PDFMiner – 一個用於從PDF文檔中抽取信息的工具。
PyPDF2 – 一個可以分割,合並和轉換 PDF 頁面的庫。
ReportLab – 快速創建富文本 PDF 文檔。
Markdown
Mistune – 快速並且功能齊全的純 Python 實現的 Markdown 解析器。
Python-Markdown – John Gruber』s Markdown 的 Python 版實現。
YAML
PyYAML – Python 版本的 YAML 解析器。
CSV
csvkit – 用於轉換和操作 CSV 的工具。
Archive
unp – 一個用來方便解包歸檔文件的命令行工具。
自然語言處理
用來處理人類語言的庫。
NLTK – 一個先進的平台,用以構建處理人類語言數據的 Python 程序。
jieba – 中文分詞工具。
langid.py – 獨立的語言識別系統。
Pattern – Python 網路信息挖掘模塊。
SnowNLP – 一個用來處理中文文本的庫。
TextBlob – 為進行普通自然語言處理任務提供一致的 API。
TextGrocery – 一簡單高效的短文本分類工具,基於 LibLinear 和 Jieba。
文檔
用以生成項目文檔的庫。
Sphinx – Python 文檔生成器。
awesome-sphinxdoc
MkDocs – 對 Markdown 友好的文檔生成器。
pdoc – 一個可以替換Epydoc 的庫,可以自動生成 Python 庫的 API 文檔。
Pycco – 文學編程(literate-programming)風格的文檔生成器。
配置
用來保存和解析配置的庫。
config – logging 模塊作者寫的分級配置模塊。
ConfigObj – INI 文件解析器,帶驗證功能。
ConfigParser – (Python 標准庫) INI 文件解析器。
profig – 通過多種格式進行配置,具有數值轉換功能。
python-decouple – 將設置和代碼完全隔離。
命令行工具
用於創建命令行程序的庫。
命令行程序開發
cement – Python 的命令行程序框架。
click – 一個通過組合的方式來創建精美命令行界面的包。
cliff – 一個用於創建命令行程序的框架,可以創建具有多層命令的命令行程序。
clint – Python 命令行程序工具。
colorama – 跨平台彩色終端文本。
docopt – Python 風格的命令行參數解析器。
Gooey – 一條命令,將命令行程序變成一個 GUI 程序。
python-prompt-toolkit – 一個用於構建強大的互動式命令行程序的庫。
生產力工具
aws-cli – Amazon Web Services 的通用命令行界面。
bashplotlib – 在終端中進行基本繪圖。
caniusepython3 – 判斷是哪個項目妨礙你你移植到 Python 3。
cookiecutter – 從 cookiecutters(項目模板)創建項目的一個命令行工具。
E. Sphinx的介紹
Sphinx是一個基於SQL的全文檢索引擎,可以結合MySQL,PostgreSQL做全文搜索,它可以提供比資料庫本身更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。Sphinx特別為一些腳本語言設計搜索API介面,如PHP,Python,Perl,Ruby等,同時為MySQL也設計了一個存儲引擎插件。Sphinx 單一索引最大可包含1億條記錄,在1千萬條記錄情況下的查詢速度為0.x秒(毫秒級)。Sphinx創建索引的速度為:創建100萬條記錄的索引只需 3~4分鍾,創建1000萬條記錄的索引可以在50分鍾內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。Sphinx的主要特性包括:高速索引 (在新款CPU上,近10 MB/秒); 高速搜索 (2-4G的文本量中平均查詢速度不到0.1秒); 高可用性 (單CPU上最大可支持100 GB的文本,100M文檔); 提供良好的相關性排名 支持分布式搜索; 提供文檔摘要生成; 提供從MySQL內部的插件式存儲引擎上搜索 支持布爾,短語, 和近義詞查詢; 支持每個文檔多個全文檢索域(默認最大32個); 支持每個文檔多屬性; 支持斷詞; 支持單位元組編碼與UTF-8編碼;
F. 如何使用sphinx生成Python第三方模塊的文檔
在使用Python的過程中,無疑我們經常需要下載安裝第三方模塊(如何安裝:URL),而安裝後我們必然會面臨一個使用的問題,這時候我們需要閱讀相關的文檔。可是我們會發現下載的第三方模塊目錄的doc文件夾下只有一個conf.py文件和一些後綴為rst的文件,文檔在哪裡呢?
其實Python提供了專用的文檔生成工具,有了這些工具就可以很方便地生成我們需要的文檔了。本文就是介紹如何使用一些第三方工具(sphinx)來生成這些文檔。
1.下載並安裝Docutils:http://docutils.sf.net/。
2.下載並安裝sphinx :http://pypi.python.org/pypi/Sphinx/1.1。Sphinx 是用來生成文檔的,設計的初衷是為了生成python的文檔。可以生成html、htmlhelp/chm、qthelp、devhelp、latex、man 等格式的文檔。
3.在Widnows環境下,打開命令提示符,使用cd /d 命令將當前目錄切換至Sphinx目錄,運行命令:python sphinx-build.py -b html sourcedir builddir,其中,-b後面的字元串用於控制輸出文檔的格式,默認為html。sourcedir表示文檔來源文件夾(一般就是包含conf.py文件的那個文件夾),builddir表示生成文檔的目標文件夾。(註:在Windows環境下,請不要將sphinx文件夾、sourcedir 和builddir 設置成包含中文的路徑,否則容易出現一些默名其妙的錯誤,例如編碼錯誤。)