Sphinx 單詞 數字索引

2021-09-20 03:57:34 字數 1538 閱讀 6734

sphinx 是乙個非常強大的全文搜尋引擎,能處理各種複雜的索引請求.但有時候需要一些特殊的設定.

比如文件中有一種詞,該詞包含了字母和數字,比如(onepiece123) 如果一般情況下直接搜尋onepiece或者123的時候,你是得不到這個文件的.

這種時候有兩種方式可以解決:

設定中綴索引長度,中綴索引可以讓我們進行萬用字元搜尋文件的操作,比如word, word*, *word

min_infix_len
中綴索引長度預設為0,即不做中綴索引,假如設定成乙個合適的長度,那麼就能根據單詞的某一部分查詢到對應的文件,比如把min_infix_len 設定為2, 那麼文件中包含test的詞彙就會被分成 te, es, st tes, est,test這幾種(最小長度2),當我們用關鍵字es 去搜尋的時候,就能命中這個包含test的文件,當然,這也導致了我們的索引檔案大小大幅度增加,索引速度降低的問題

為了解決開始的時候我們提到的這種單詞帶數字的查詢,我們可以設定乙個比較合適的中綴索引長度,比如8,那麼包含onepiece123這個詞的文件會被分成onepiece, onepiece1, onepiece12, onepiece123, nepiece12,...等等(按順序包含至少8個原有字元,不能跳過任意的字母),這樣,當我們搜尋oinepiece的時候, 因為原有的oinepiece123文件被分成了包含了onepiece等多個的文件,我們就能命中這個oinepiece123所在的文件了.

該設定允許我們通過正則的方式對映最終的文件格式.那樣的話我們就能統一一些常見的單詞或者短語的格式了.

比如

'iphone 3gs' , 'iphone 3 gs' (或者甚是 'iphone3 gs')
regexp_filter = [(iphone 3gs)| (iphone 3 gs) | (iphone3 gs)] => iphone3gs
這樣在建立索引的時候, 所有包含上面三種的iphone 3gs的格式都能對映成iphone3gs, 在搜尋iphone3gs的時候, 就能命中所有包含上面三種詞的文件了

回歸我們的初始問題,這種方式處理單詞+數字的索引設定可以這麼設定

regexp_filter = ([a-z|a-z]+)(\d+) =>\1 \2
"\1"和"\2"之間有空格,"\1"對應單詞的正則匹配, "\2"對應數字的正則匹配,中間加了乙個空格,這就表示在建立索引的時候單詞+數字的文件會被分開.

不過要說明的是,如果想使用這個配置,需要安裝乙個名叫re2的正則引擎替代系統內建的正則引擎,安裝好後重新編譯安裝sphinx的原始碼,在./configure的時候帶上引數 

--with-re2,然後regexp_filter才會游泳

這樣也能解決單詞+數字的搜尋問題。

兩種方式都能起作用,中綴索引比較簡單,但會大幅度增加索引檔案的大小和索引的速度.regexp_filter安裝正則引擎比較煩,而且要重新編譯安裝sphinx, 但對索引檔案的大小和索引速度的影響較小。

統計單詞數

include include include include include includeusing namespace std struct node int main else if s.find 1 transform s.begin s.end s.begin toupper sourc...

單詞數(stringstream分割單詞

lily的好朋友xiaoou333最近很空,他想了一件沒有什麼意義的事情,就是統計一篇文章裡不同單詞的總數。下面你的任務是幫助xiaoou333解決這個問題。input 有多組資料,每組一行,每組就是一篇小文章。每篇小文章都是由小寫字母和空格組成,沒有標點符號,遇到 時表示輸入結束。output 每...

單詞數目統計

時間限制 10 sec 記憶體限制 128 mb neo 給你一系列字串,請你輸出字串中的不同單詞個數以及總單詞個數。多組輸入,每組資料都是一行字串 長度小於200 其中每個單詞以空格隔開 單詞都是小寫字母組成 輸出字串中的不同單詞個數以及總單詞個數。i love china aa aa bb 3 ...