學習了一段時間的solr了,用自己的方式總結下目前學到的內容,這是個系列文章,這裡面的有些說法可能不準確,也可能有問題
搜尋引擎在我們的生活中,已經無處不在,除了我們常用的baidu、google等,還有一些電商的搜尋 比如亞馬遜搜書等。除了網頁搜尋外,企業內部可能涉及到知識庫搜尋,一般稱為企業搜尋。現在搜尋要主要的目的是,在海量資訊
中,從非結構化資料
中快速找到符合我們含義的資訊
"海量資訊" :搜尋引擎一般處理的資料量很大,普通資料庫在搜尋的資料量非常大的時候,比如上億條資料的時候,就算建立索引,查詢速度也不是很快,不能滿足現實的需求。
「符合我們的含義」:我覺得這可以稱為語意搜尋(還沒有看到過這個叫法:),第一條也許資料庫還可以勉強達到,但是資料庫搜尋難以達到符合含義這個目的,這在搜尋過程中要涉及到同義詞的轉換。比如你在亞馬遜中搜尋solr,可以找到lucene、搜尋引擎相關的書籍,這裡面就涉及到同義詞的轉換;我覺得這是搜尋引擎最重要的特徵。
一般的搜尋引擎都會根據相關性對我們搜尋的內容和現存的文件進行匹配,對相似度進行打分,並且按照相似度的進行排序,相似的排在前面。
"非結構化資料": 這個是指沒有固定格式和固定長度的資料,比如一篇文章,這種資料也稱為全文資料。
按照上節所說,搜尋引擎主要處理的是非結構化資料,故名思議,非結構化資料的特點就是沒有固定的結構,這也正是處理比較困難的原因;結構化資料可以通過資料庫等方式處理。非結構化資料如何處理,據說有兩種方法:
一種是順序搜尋,比如在linux下用grep方式來搜尋包含特定字串的文件,這在文件數量少的時候比較有效。
二種是全文檢索,它是通過對非結構化資料進行結構化轉化,對非結構化資料進行抽取(從文件中抽取詞),然後重新組合,再利用它進行搜尋。
這個被抽取出來重新組織的資訊稱為索引。
第二種方法是搜尋引擎中用的主要方法了。
這就涉及到三個問題:1、索引裡面儲存什麼資訊?2、索引如何建立? 3、如何利用索引進行搜尋?
索引儲存的是什麼
讓我們思考下,既然全文搜尋是通過建立索引的方式進行搜尋的,那麼我們的索引內容必然是為了方便查詢到我們要的資訊的。
以搜尋文章為例,假如我們需要海量的文章,為了方便管理我們給這些文章進行編號,
實際情況也是如此,全文搜尋建立的索引簡單來說就是詞和文章編號的對應關係,由於乙個詞可以放在多個文章中,所以這種索引一般就是乙個個詞後面對應一串文章編號(文件編號鍊錶)。
從文章對應詞比較自然,所以從詞對應文件是文件對應詞的反過程,儲存這種資訊的索引稱為反向索引(倒排索引)。
盜用一張網上說明lucene的倒排索引原理圖,solr是基於lucene的,所以solr的索引也是倒排索引。
索引如何建立
建立索引的過程盜用個網上圖,索引過程如下:
我們來思考下,我們要建立的索引為倒排索引即是詞典和倒排表。
我們首先要從文件中得到詞,所以我們首要工作是分詞,這裡面用到的就是分詞元件(tokenizer)本次得到的結果是詞元(token)。
其次從詞元(token)經過語言處理元件(linguistic processor)的處理,輸出為詞(term)。這一部分主要完成的是詞義轉化等
詞邊變的更純碎些。最後一步就是將詞傳遞給相關的索引元件,建立索引。
1、分詞做的主要工作
1)切詞,英語比較好拆分就是按照空格分隔,漢字要涉及到利用詞典進行切詞或單獨按照字來進行切詞。
2)去掉標點符號。
3)去掉停詞,停詞是指語言中沒有特殊含義的副詞,比如英語中的this、is、a、漢語中的「的」等。
在solr中有專門的配置檔案配置停詞,stopwords_開頭的配置檔案。
使得到的詞更有意義,減少索引的長度,因為停詞在很多文件中都有,如果加到索引裡面,後面的文件號要排很長,專業名詞叫拉鍊過長。
不光占用過多的空間,而且還會導致搜尋變慢。
中文由於沒有明顯的詞語直接的間隔,所以中文分詞要複雜的多。solr中預設standardtokenize***ctory是按照字來分隔,好處是實現字級匹配,壞處索引變大。
也可以利用網上開源的分詞元件,比如:庖丁分詞、ik分詞等。
效率solr預設的分詞的建索引效率大概是ik分詞的1倍,但是查詢效率卻慢4倍原因,是按字分詞拉鍊過長原因。
2、語言處理主要工作
1)對英語來說是大小寫轉換。
2)將詞縮減或簡化為詞根。(比如cars轉成car、running轉成run)
語言處理元件得到的結果是為term(詞)。
3、將此傳遞給索引元件
1)利用詞建立詞典和文件id的對應關係表。
2)按照字典順序對詞典進行排序。
3)合併相同的詞典,文件id變成文件id鍊錶。
實際建立的倒排索引,還包含詞在文件中的位置、出現的頻次等資訊。
搜尋過程
常用語法舉例子如下:
2) 對查詢的語句進行詞法分析、語法分析和語義處理。
類似建索引的過程,需要進行分詞、轉化後,還有多乙個內容要區分關鍵字和搜尋詞、
關鍵字代表搜尋詞之間的邏輯關係,在solr搜尋中是op標示,比如and標示邏輯與、
or標示或關係,經過這種語法分析後形成乙個語法樹。
3)搜尋
在solr中大概分為三步完成:
1、在反向索引表中查詢符合要求的文件id。第一次查詢返回的是文件id和匹配度得分。
2、根據語法樹進行邏輯與或或等操作,得到最終符合要求的文件id列表。
3、通過這些文件id列表,結合要求查詢的內容去查詢具體到具體的內容資訊返回。
4)排序返回
文件列表查到之後,把查詢的語句當做乙個文件,來計算被查詢的文件和查詢到的文件之間的相關度,並進行打分,
相關度高的排在前面。
相關度得分的計算比較複雜,主要涉及有:
詞頻tf: 即詞在文件中出現的次數。
df: 即這個詞在多少個文件中出現。
詞的權重:詞在文件中的重要性。
搜尋檔案的基本知識
handle winapi findfirstfile in lpctstr lpfilename,out lpwin32 find data lpfindfiledata bool winapi findnextfile in handle hfindfile,out lpwin32 find d...
11 串列埠基本知識
11.串列埠基本知識 大綱 串列埠角色 1.資料傳輸。2.充當控制台。資料傳輸 兩個嵌入式裝置,除了使用usb和網路來實現資料的傳輸外,就是可以使用串列埠來實現資料傳輸。控制台 在pc機裡,我們使用鍵盤來輸入命令和資訊等,通過顯示器來顯示查詢的結果或者資訊等。在嵌入式裡,是通過終端控制台來輸入命令來...
slam學習 基本知識
slam模型的運動方程和觀測方程 方程中的位姿可以用變換矩陣來描述,然後用李代數進行優化 可以用李群表示,但是群比較複雜,用李代數近似模擬,用李代數優化 觀測方程由相機成像模型給出,其中內參是隨著相機固定的,而外參就是指相機的位姿 位置xyz和姿態朝向 由於實際採集的資料都是含有雜訊的,所以視覺sl...