0.solr简介
Apache Solr 是一个开源、高性能、跨平台、基于Lucene的全文搜索引擎,目标文档可以通过Http方式以xml、json、csv等不同数据格式上传并加载一个搜索集合中(collection),这个过程中solr会对上传的数据(文档)进行分词和建立索引操作,然后通过http接口查询结果,其中结果可以以xml、json、python等多种方式返回。Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个
Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件(schema.xml)中使用:<uniqueKey>id</uniqueKey>进行描述。solr有两个核心文件,solrconfig.xml和schema.xml。solrconfig.xml是solr的基础文件,里面配置了各种web请求处理器、请求响应处理器、日志、缓存等;schema.xml配置映射了各种数据类型的索引方案,分词器的配置、索引文档中包含的字段也在此配置。
工作中主要用来分词和搜索,简单的工作原理是:利用分词器对数据源进行分词处理,然后根据分词结果建立索引库;查询的时候,利用分词器对查询语句进行分词,根据查询语句分词的结果在索引库中进行匹配,最后返回结果。
1.安装solr
solr的安装比较简单,本例中使用solr-4.10.3版本,直接将下载好的安装包solr-4.10.3.zip解压至指定目录就好了。
2.启动solr
进入$SOLR_HOME/example目录下,执行 java -jar start.jar就可以了,默认开启的端口为8983
3.上传测试数据至solr:
进入到$SOLR_HOME/example/exampledocs目录,可以通过命令java -jar post.jar solr.xml
monitor.xml进行文件上传
上传数据至solr时,solr会自动建立索引。以上命令默认会将数据上传至collection1中。
相当于:
java -Durl=http://localhost:8983/solr/collection1/update -jar SOLR_HOME/example/exampledocs/post.jar solr.xml monitor.xml
如果要指定上传的数据进入到哪个collection,可以通过上面命令操作
4.配置solr
4.1 增加collection
solr默认有一个collection1,如果需要新增collection2,可以将$SOLR_HOME/example/solr中的collection1复制到当前目录,并重命名为collection2,
然后进入到collection2目录中修改配置文件core.properties文件,将“name=collection1”改为“name=collection2”,然后重启solr就可以了
4.2 增加字段
我们在向solr上传数据时,要按照solr规定的数据格式来组织好数据,数据类型可以为xml、json、csv等(solr中对文件的后缀名不关心,可以没有后缀名),但每种数据类型都有统一的格式规范,也可以说是字段规范,数据格式规范是在$SOLR_HOME/example/solr/collection1/conf/schema.xml文件中进行配置,其中,在collection1中已经有了默认提供的诸如
id(主键,不可重命名)、name、price等字段。
比如,xml类型的文档的数据格式参如下:
<add>
<doc>
<!-- id为主键-->
<field name="id">3007WFP</field>
<field name="name">Dell Widescreen UltraSharp 3007WFP</field>
<field name="manu">Dell, Inc.</field>
<!-- Join -->
<field name="manu_id_s">dell</field>
<field name="cat">electronics and computer1</field>
<field name="features">30" TFT active matrix LCD, 2560 x 1600, .25mm dot pitch, 700:1 contrast</field>
<field name="includes">USB cable</field>
<field name="weight">401.6</field>
<field name="price">2199</field>
<field name="popularity">6</field>
<field name="inStock">true</field>
<!-- Buffalo store -->
<field name="store">43.17614,-90.57341</field>
</doc>
<doc>******</doc>
</add>
如果需要新增字段的话,只要在配置文件中新增一条配置就行了,比如,新增"tag"字段:
<field name="tag" type="text_general" indexed="true" stored="true"/>
然后重启solr就可以了,这时就可以上传具有如下数据结构的文件了。
<add>
<doc><field name=‘id‘>1001</field><field name=‘tag‘>腾讯:1 社交/沟通,通信,即时通信:1 资讯:1</field></doc>
<doc><field name=‘id‘> 1002 </field><field name=‘tag‘>搜狗:1 工具/软件,应用,导航:1</field></doc>
<doc><field name=‘id‘> 1003 </field><field name=‘tag‘>社交/沟通,通信,即时通信:1</field></doc>
<doc><field name=‘id‘> 1004 </field><field name=‘tag‘>腾讯:1 资讯:1</field></doc>
<doc><field name=‘id‘> 1005 </field><field name=‘tag‘>腾讯:1 资讯:1</field></doc>
</add>
在solr中,提供了许多动态字段类型,这样就可以无需修改schema.xml配置增加字段就可以自定义数据类型了。
比如,我们可以用"age_i"自定义int型字段age_i,用"contry_s"自定义String类型字段contry_s,其中"*_i"表示Int型,
"*_s"表示String型,其他的自定义数据类型参考如下(在schema.xml中查看):
5.solr查询:
5.1 界面查询:
可以通过http://localhost:8983/solr/#/collection1 进入collection的界面
进入之后,可以再左侧的选择框中切换collection。点击“query”就可以进去查询界面了,或者直接通过地址“http://localhost:8983/solr/#/collection1/query进入
上图中,蓝色框用来输入查询条件,*:*表示检索所有的数据,冒号":"左表是关键字,右边是关键字的值,如果为*表示所有。
比如“id:1001”表示查询id值为1001的数据,“name:jack”表示查询name值为jack的数据 ,"name:*"表示查询所有有name字段的数据;
红色方框中用来选择查询结果返回的数据类型,可以选择xml、json、csv、python等类型。比如:
其中,查询条件是查询tag字段为"腾讯视频"的数据,在responseHeader中表示传入的相关参数说明,q表示查询的字段,wt表示返回的数据类型
在response中表示具体的查询结果,其中nameFound表示查询到的记录数量,start表示显示第几页,默认0表示显示第一页(其实,还有rows字段,默认为每页显示10条记录)
5.2 通过接口查询:
http://localhost:8983/solr/collection1/select?q=id:1001&wt=json&start=2&rows=100&indent=true
其中,检索的collection为collection1,查询条件为id等于1001,返回数据类型为json,显示第三页,每页显示100条数据
http://localhost:8983/solr/collection1/select?q=tag:"腾讯视频"&wt=json&indent=true
表示查询tag值为"腾讯视频"的记录(默认显示第一页,每页10条记录)
注:如果查询的关键字字段为string类型,参数需要用引号("")括起来