Solr 6.0 零基础快速上手

前言

读博快两年了,说起来我的方向是Information Retrieval,可是自己到现在常用的索引包都不会用。这次的目的是索引Reddit post的JSON格式的数据的,本来想用Glasgow的Terrier,因为认识几个他们组里的学生,都跟我安利这个。可是用起来发现Terrier只针对学术界常用的TREC的数据集做了相应的优化和文档配置说明。对于其他类型的文档,Terrier并没有完整的说明,着实让人懵逼。

鉴于Lucene强大的开源背景和我着实不想再写Java代码的懒惰心理,我决定使用Solr 6.0给文档建立索引,然后通过python调用curl进行访问。

Solr 6.0 安装

  1. 配置好JAVA环境
  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,这一步会在下一节重点说。
  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中的内容进行什么样的操作
    <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内容到另一个field,用于合并field或对同一field做不同的操作。这里是把这几个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用于动态匹配索引过程中遇到的未定义的field
  2. 对于不关注的field,可以采用下面方法过滤掉:声明一个忽略类型ignored,动态匹配所以没有被定义的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,很重要。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容