99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Sphinx的配置詳解

發(fā)布時(shí)間:2016-08-09 23:54  回復(fù):0  查看:3199   最后回復(fù):2016-08-09 23:54  

我們?cè)?a target="_blank">學(xué)習(xí)Sphinx 的過程中,Sphinx的配置是必不可少的,這里就給大家講解一下Sphinx的配置。

 

數(shù)據(jù)源配置

先來看一份數(shù)據(jù)源的配置文件示例:

Sphinx的配置詳解

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

source test

{

      type                    = mysql

  

      sql_host                = 127.0.0.1

      sql_user                = root

      sql_pass                = root

      sql_db                  = test

      sql_port                = 3306    # optional, default is 3306

  

      sql_query_pre           = SET NAMES utf8

      sql_query       = SELECT id, name, add_time FROM tbl_test

  

      sql_attr_timestamp      = add_time

  

sql_query_info_pre      = SET NAMES utf8

      sql_query_info          = SELECT * FROM tbl_test WHERE id=$id

}

其中

source后面跟著的是數(shù)據(jù)源的名字,后面做索引的時(shí)候會(huì)用到;

type:數(shù)據(jù)源類型,可以為MySQL,PostreSQL,Oracle等等;

sql_host、sql_user、sql_pass、sql_db、sql_port是連接數(shù)據(jù)庫的認(rèn)證信息;

sql_query_pre:定義查詢時(shí)的編碼

sql_query:數(shù)據(jù)源配置核心語句,sphinx使用此語句從數(shù)據(jù)庫中拉取數(shù)據(jù);

sql_attr_*:索引屬性,附加在每個(gè)文檔上的額外的信息(值),可以在搜索的時(shí)候用于過濾和排序。設(shè)置了屬性之后,在調(diào)用Sphinx搜索API時(shí),Sphinx會(huì)返回已設(shè)置了的屬性;

sql_query_info_pre:設(shè)置查詢編碼,如果在命令行下調(diào)試出現(xiàn)問號(hào)亂碼時(shí),可以設(shè)置此項(xiàng);

sql_query_info:設(shè)置命令行下返回的信息。

索引配置

Sphinx的配置詳解

1

2

3

4

5

6

7

8

9

10

index test_index

{

     source                    = test

     path                      = /usr/local/coreseek/var/data/test

     docinfo                   = extern

     charset_dictpath          = /usr/local/mmseg3/etc/

     charset_type              = zh_cn.utf-8

     ngram_len                 = 1

     ngram_chars               = U+3000..U+2FA1F

}

其中

index后面跟的test_index是索引名稱

source:數(shù)據(jù)源名稱;

path:索引文件基本名,indexer程序會(huì)將這個(gè)路徑作為前綴生成出索引文件名。例如,屬性集會(huì)存在/usr/local/sphinx/data/test1.spa中,等等。

docinfo:索引文檔屬性值存儲(chǔ)模式;

charset_dictpath:中文分詞時(shí)啟用詞典文件的目錄,該目錄下必須要有uni.lib詞典文件存在;

charset_type:數(shù)據(jù)編碼類型;

ngram_len:分詞長(zhǎng)度;

ngram_chars:要進(jìn)行一元字符切分模式認(rèn)可的有效字符集。

中文分詞核心配置

一元分詞

Sphinx的配置詳解

1

2

3

charset_type = utf8

ngram_len = 1

ngram_chars = U+3000..U+2FA1F

mmseg分詞

Sphinx的配置詳解

1

2

3

charset_type = utf8

charset_dictpath = /usr/local/mmseg3/etc/

ngram_len = 0

運(yùn)行示例

數(shù)據(jù)庫數(shù)據(jù)

Sphinx的配置詳解

使用indexer程序做索引

Sphinx的配置詳解 

查詢

Sphinx的配置詳解Sphinx的配置詳解 

可以看到,配置文件中的add_time被返回了,如上圖的1所示。而sql_query_info返回的信息如上圖的2所示。

Sphinx的配置不是很靈活,此處根據(jù)工作流程給出各部分的配置,更多的高級(jí)配置可以在使用時(shí)查閱文檔。

介紹了Sphinx的配置之后,繼續(xù)介紹在Sphinx中,負(fù)責(zé)做索引的程序Indexer是如何做索引的。

sphinx使用配置文件從數(shù)據(jù)庫讀出數(shù)據(jù)之后,就將數(shù)據(jù)傳遞給Indexer程序,然后Indexer就會(huì)逐條讀取記錄,根據(jù)分詞算法對(duì)每條記錄建立索引,分詞算法可以是一元分詞/mmseg分詞。下面先介紹Indexer做索引時(shí)使用的數(shù)據(jù)結(jié)構(gòu)和算法。

倒排索引

倒排索引是一種數(shù)據(jù)結(jié)構(gòu),用來存儲(chǔ)在全文搜索下某個(gè)單詞在一個(gè)文檔或者一組文檔中的存儲(chǔ)位置的映射。它是文檔檢索系統(tǒng)中最常用的數(shù)據(jù)結(jié)構(gòu)。

倒排索引(Inverted Index):倒排索引是實(shí)現(xiàn)“單詞-文檔矩陣”的一種具體存儲(chǔ)形式,通過倒排索引,可以根據(jù)單詞快速獲取包含這個(gè)單詞的文檔列表。

傳統(tǒng)的索引是:索引ID->文檔內(nèi)容,而倒排索引是:文檔內(nèi)容(分詞)->索引ID??梢灶惐日虼砗头聪虼淼膮^(qū)別來理解。正向代理把內(nèi)部請(qǐng)求代理到外部,反向代理把外部請(qǐng)求代理到內(nèi)部。所以應(yīng)該理解為轉(zhuǎn)置索引比較合適。

倒排索引主要由兩個(gè)部分組成:“單詞詞典”和“倒排文件”。

單詞詞典是倒排索引中非常重要的組成部分,它用來維護(hù)文檔集合中出現(xiàn)過的所有單詞的相關(guān)信息,同時(shí)用來記載某個(gè)單詞對(duì)應(yīng)的倒排列表在倒排文件中的位置信息。在支持搜索時(shí),根據(jù)用戶的查詢?cè)~,去單詞詞典里查詢,就能夠獲得相應(yīng)的倒排列表,并以此作為后續(xù)排序的基礎(chǔ)。

對(duì)于一個(gè)規(guī)模很大的文檔集合來說,可能包含幾十萬甚至上百萬的不同單詞,能否快速定位某個(gè)單詞直接影響搜索時(shí)的響應(yīng)速度,所以需要高效的數(shù)據(jù)結(jié)構(gòu)來對(duì)單詞詞典進(jìn)行構(gòu)建和查找,常用的數(shù)據(jù)結(jié)構(gòu)包括哈希加鏈表結(jié)構(gòu)和樹形詞典結(jié)構(gòu)。

倒排索引基礎(chǔ)知識(shí)

· 文檔(Document):一般搜索引擎的處理對(duì)象是互聯(lián)網(wǎng)網(wǎng)頁,而文檔這個(gè)概念要更寬泛些,代表以文本形式存在的存儲(chǔ)對(duì)象,相比網(wǎng)頁來說,涵蓋更多種形式,比如Word,PDF,html,XML等不同格式的文件都可以稱之為文檔。再比如一封郵件,一條短信,一條微博也可以稱之為文檔。在本書后續(xù)內(nèi)容,很多情況下會(huì)使用文檔來表征文本信息。

· 文檔集合(Document Collection):由若干文檔構(gòu)成的集合稱之為文檔集合。比如海量的互聯(lián)網(wǎng)網(wǎng)頁或者說大量的電子郵件都是文檔集合的具體例子。

· 文檔編號(hào)(Document ID):在搜索引擎內(nèi)部,會(huì)將文檔集合內(nèi)每個(gè)文檔賦予一個(gè)唯一的內(nèi)部編號(hào),以此編號(hào)來作為這個(gè)文檔的唯一標(biāo)識(shí),這樣方便內(nèi)部處理,每個(gè)文檔的內(nèi)部編號(hào)即稱之為“文檔編號(hào)”,后文有時(shí)會(huì)用DocID來便捷地代表文檔編號(hào)。

· 單詞編號(hào)(Word ID):與文檔編號(hào)類似,搜索引擎內(nèi)部以唯一的編號(hào)來表征某個(gè)單詞,單詞編號(hào)可以作為某個(gè)單詞的唯一表征。

Indexer程序就是根據(jù)配置好地分詞算法,將獲取到的記錄進(jìn)行分詞,然后用倒排索引做數(shù)據(jù)結(jié)構(gòu)保存起來。

分詞算法

一元分詞

一元分詞的核心配置

Sphinx的配置詳解

1

2

3

4

charsey_type = zh_cn.utf8

ngram_len = 1

ugram_chars = U+4E00..U+9FBF

ngram_len是分詞的長(zhǎng)度。

ngram_chars標(biāo)識(shí)要進(jìn)行一元分詞切分模式的字符集。

原生的Sphinx支持的分詞算法是一元分詞,這種分詞算法是對(duì)記錄的每個(gè)詞切割后做索引,這種索引的優(yōu)點(diǎn)就是覆蓋率高,保證每個(gè)記錄都能被搜索到。缺點(diǎn)就是會(huì)生成很大的索引文件,更新索引時(shí)會(huì)消耗很多的資源。所以,如果不是特殊需求,而且數(shù)據(jù)不是特別少的時(shí)候,都不建議使用一元分詞。

國(guó)人在sphinx的基礎(chǔ)上開發(fā)了支持中文分詞的Coreseek。Coreseek與Sphinx唯一的不同就是Coreseek還支持mmseg分詞算法做中文分詞。

mmseg分詞

mmseg分詞算法是基于統(tǒng)計(jì)模型的,所以算法的規(guī)則也是來自對(duì)語料庫的分析和數(shù)學(xué)歸納,因?yàn)橹形淖址麤]有明確的分界,會(huì)導(dǎo)致大量的字符分界歧義,而且,中文里面,詞和短語也很難界定,因此,算法除了要做統(tǒng)計(jì)和數(shù)學(xué)歸納之外,還要做歧義的解決。

在mmseg分詞中,有一個(gè)叫chunk的概念。

chunk,是一句話的分詞方式。包括一個(gè)詞條數(shù)組和四個(gè)規(guī)則。

如:研究生命,有“研究/生命”和“研究生/命”兩種分詞方式,這就是兩個(gè)chunk。

一個(gè)chunk有四個(gè)屬性:長(zhǎng)度、平均長(zhǎng)度(長(zhǎng)度/分詞數(shù))、方差、單字自由度(各單詞條詞頻的對(duì)數(shù)之和)。

做好分詞之后,會(huì)得到多種分詞方式,這時(shí)候就要使用一些過濾規(guī)則來完成歧義的解決,以得到最終的分詞方式。

歧義解決規(guī)則:

1、最大匹配 匹配最大長(zhǎng)度的詞。如“國(guó)際化”,有“國(guó)際/化”、“國(guó)際化”兩種分詞方式,選擇后者。

2、最大平均詞長(zhǎng)度 匹配平均詞最大的chunk。如“南京市長(zhǎng)江大橋”,有“南京市/長(zhǎng)江大橋”、“南京/市長(zhǎng)/江大橋”三種分詞方式,前者平均詞長(zhǎng)度是7/2=3.5,后者是7/3=2.3,故選擇前者的分詞方式。

3、最大方差 去方差最大的chunk。如“研究生命科學(xué)”,有“研究生/命/科學(xué)”、“研究/生命/科學(xué)“兩種分詞方式,而它們的詞長(zhǎng)都一樣是2。所以需要繼續(xù)過濾,前者方差是0.82,后者方差是0。所以選擇第一種分詞方式。

4、最大單字自由度 選擇單個(gè)字出現(xiàn)最高頻率的chunk。比如”主要是因?yàn)椤埃小敝饕?是/因?yàn)椤?,”?要是/因?yàn)椤皟煞N分詞方式,它們的詞長(zhǎng)、方差都一樣,而”是“的詞頻較高,所以選擇第一種分詞方式。

如果經(jīng)過上述四個(gè)規(guī)則的過濾,剩下的chunk仍然大于一,那這個(gè)算法也無能為力了,只能自己寫擴(kuò)展完成。

 

原文來自:伯樂在線

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?