Solr 6.0 零基礎快速上手

前言

讀博快兩年了蜕便,說起來我的方向是Information Retrieval甘凭,可是自己到現(xiàn)在常用的索引包都不會用瓶籽。這次的目的是索引Reddit post的JSON格式的數(shù)據(jù)的,本來想用Glasgow的Terrier巩趁,因為認識幾個他們組里的學生宗弯,都跟我安利這個脯燃。可是用起來發(fā)現(xiàn)Terrier只針對學術(shù)界常用的TREC的數(shù)據(jù)集做了相應的優(yōu)化和文檔配置說明蒙保。對于其他類型的文檔辕棚,Terrier并沒有完整的說明,著實讓人懵逼追他。

鑒于Lucene強大的開源背景和我著實不想再寫Java代碼的懶惰心理坟募,我決定使用Solr 6.0給文檔建立索引,然后通過python調(diào)用curl進行訪問邑狸。

Solr 6.0 安裝

  1. 配置好JAVA環(huán)境
  2. 下載zip包
  3. 解壓縮

Solr 6.0 使用

這個我必須先吐槽一句懈糯,光是配置schema.xml折騰了我一個星期,真的是讀博智商低啊……下面我把終于搞明白了的流程逐步記錄下來单雾。

Standalone版本的啟動流程

  1. 首先[這是一個非常好的樣例](Solr Schema.xml Example)
  2. 進入Solr的解壓文件夾
bin/solr start

啟動單機模式赚哗,此時打開瀏覽器輸入http://localhost:8983/solr/可以看到相關頁面。

  1. 建立一個Core硅堆,一個Core對應一個對文檔集合的索引屿储。
bin/solr create -c <core name> -d basic_configs

這里我們默認使用basic_configs.

  1. 對建立好的索引,我們需要配置schema.xml文件和solrconfig.xml文件渐逃,這兩個文件位于server/<core name>文件夾下面够掠。
  1. 在solrconfig.xml中將這個core設置為讀取手工配置的schema.xml的模式。
<schemaFactory class = "ClassicIndexSchemaFactory"/>
  1. 講managed-schema文件名改為schema.xml
  2. 配置schema.xml茄菊,這一步會在下一節(jié)重點說疯潭。
  3. 重點,重新讀取core才能啟用新配置
curl "http://localhost:8983/solr/admin/cores?action=RELOAD&core=<core name>"
  1. 索引文件
bin/post -c <core name> /data/redditData/full_corpus.json
  1. 在python中查詢
  from urllib2 import *
  import simplejson
  import json
  connection = urlopen('http://localhost:8983/solr/reddit_r3d/select?q=title:"French%20Open"%20selftext:"French%20Open"&fl=id,name,title,selftext,created_utc&wt=json')
  response = simplejson.load(connection)
  print response['response']['numFound'], "documents found."
    
 # Create the output file to store relevant documents
  output_folderpath = $PATH + corename
  if not os.path.exists(output_folderpath):
      os.makedirs(output_folderpath)
    
 # Write relevant document in to the file
  if response['response']['numFound'] == 0:
      continue
  else:
      output_filepath = (output_folderpath + 
                         query_id + "_" +
                         str(response['response']['numFound']) + "_" +
                         str(kvalue) +
                         ".json")
      print output_filepath
      with open(output_filepath, "w") as text_file:
          for document in response['response']['docs']:
              text_file.write(json.dumps(document)+'\n')

Schema.xml的手工配置

  1. 配置fields說明要進行處理的tags
<field name="_root_" type="string" docValues="false" indexed="true" stored="false"/>
  <field name="_text_" type="text_en" multiValued="true" indexed="true" stored="false"/>
  <field name="_version_" type="long" indexed="false" stored="false"/>
  <field name="author" type="text_general" indexed="false" stored="true"/>
  <field name="created_utc" type="tlongs" indexed="true" stored="true"/>
  <field name="domain" type="text_general" indexed="true" stored="true"/>
  <field name="downs" type="tlongs" indexed="false" stored="true"/>
  <field name="edited" type="booleans" indexed="false" stored="true"/>
  <field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
  <field name="is_self" type="booleans" indexed="false" stored="true"/>
  <field name="name" type="text_general" indexed="false" stored="true"/>
  <field name="num_comments" type="tlongs" indexed="false" stored="true"/>
  <field name="retrieved_on" type="tlongs" indexed="false" stored="true"/>
  <field name="score" type="tlongs" indexed="false" stored="true"/>
  <field name="selftext" type="text_en" indexed="true" stored="true"/>
  <field name="subreddit" type="text_general" indexed="true" stored="true"/>
  <field name="subreddit_id" type="text_general" indexed="false" stored="true"/>
  <field name="title" type="text_en" indexed="true" stored="true"/>
  <field name="ups" type="tlongs" indexed="false" stored="true"/>
  <field name="url" type="text_general" indexed="true" stored="true"/>

這里需要說明面殖,對于未知文本格式的文本還是選用text_general比較好竖哩,string可能會報錯

  1. 配置fieldType說明對應類型的field中的內(nèi)容進行什么樣的操作
    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

    <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
    </fieldType>

如上,可以定義index過程中和query過程中的具體處理脊僚,我只在原來的基礎上添加了:
<charFilter class="solr.HTMLStripCharFilterFactory"/>
用于處理掉文本中的HTML格式的符號相叁。

  1. 配置copyField復制field內(nèi)容到另一個field,用于合并field或?qū)ν籪ield做不同的操作辽幌。這里是把這幾個field合并到_text_一同索引:
   <copyField source="title" dest="_text_"/>
   <copyField source="selftext" dest="_text_"/>
   <copyField source="domain" dest="_text_"/>
   <copyField source="subreddit" dest="_text_"/>
   <copyField source="url" dest="_text_"/>
  1. 配置dynamicField用于動態(tài)匹配索引過程中遇到的未定義的field
  2. 對于不關注的field增淹,可以采用下面方法過濾掉:聲明一個忽略類型ignored,動態(tài)匹配所以沒有被定義的field舶衬。
<dynamicField name="*" type="ignored" multiValued="true" />
<fieldType name="ignored" stored="false" indexed="false" docValues="false" multiValued="true" class="solr.TextField" />

額外說明

  1. Solr 6.0開始埠通,默認索引采用BM25,很重要逛犹。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末端辱,一起剝皮案震驚了整個濱河市梁剔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舞蔽,老刑警劉巖荣病,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渗柿,居然都是意外死亡个盆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門朵栖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颊亮,“玉大人,你說我怎么就攤上這事陨溅≈栈螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵门扇,是天一觀的道長雹有。 經(jīng)常有香客問我,道長臼寄,這世上最難降的妖魔是什么霸奕? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮吉拳,結(jié)果婚禮上质帅,老公的妹妹穿的比我還像新娘。我一直安慰自己留攒,他們只是感情好临梗,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稼跳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吃沪。 梳的紋絲不亂的頭發(fā)上汤善,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音票彪,去河邊找鬼红淡。 笑死,一個胖子當著我的面吹牛降铸,可吹牛的內(nèi)容都是我干的在旱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼推掸,長吁一口氣:“原來是場噩夢啊……” “哼桶蝎!你這毒婦竟也來了驻仅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤登渣,失蹤者是張志新(化名)和其女友劉穎噪服,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胜茧,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡粘优,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了呻顽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雹顺。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖廊遍,靈堂內(nèi)的尸體忽然破棺而出嬉愧,到底是詐尸還是另有隱情,我是刑警寧澤昧碉,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布英染,位于F島的核電站,受9級特大地震影響被饿,放射性物質(zhì)發(fā)生泄漏四康。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一狭握、第九天 我趴在偏房一處隱蔽的房頂上張望闪金。 院中可真熱鬧,春花似錦论颅、人聲如沸哎垦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漏设。三九已至,卻和暖如春今妄,著一層夾襖步出監(jiān)牢的瞬間郑口,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工盾鳞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犬性,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓腾仅,卻偏偏與公主長得像乒裆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子推励,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容