Solr
Apache Solr 是一个功能强大的搜素服务器,它支持Rest风格的API.Solr是基于Lucene的.Lucene支持强大的匹配能力,如短语,通配符,链接,分组和更多不同类型的数据.它使用Zookeeper特别针对高流量进行优化.Apache Solr提供各种各式各样的功能
- 先进的全文检索功能
- XML,JSON和HTTP 基于开放接口标准
- 高度课扩展和容错
- 同时支持模式和无模式的支持
- 分页搜索和过滤
- 支持多种语言
- 丰富的文档
Install Solr
从以下位置下载最新版本的Apache Solr: http://lucene.apache.org/solr/downloads.html
我下载到的是solr-6.6.0版本
安装的话直接解压即可,该版本需要JDK8支持
tar -zxf solr-6.6.0.tgz
Apache Solr带有一个内置的Jetty服务器。但在我们开始之前,我们必须验证JAVA_HOME已经配置。
启动Solr
root@ubuntu:/opt/solr# ./bin/solr start -force
Waiting up to 180 seconds to see Solr running on port 8983 [-]
Started Solr server on port 8983 (pid=12376). Happy searching!
可以通过该地址访问 http://localhost:8983/solr/
访问截图
Solr原理
Solr对外提供标准的HTTP接口来实现对数据索引的增加,删除,修改和查询.在Solr中,用户通过向部署在servlet容器中的Solr Web应用程序发送HTTP请求来启动索引和搜索.Solr接收请求,确定要使用的适当的SolrRequestHandler,然后处理请求.通过HTTP以同样的方式返回响应.默认配置返回Solr的标准XML响应,也可以配置Solr的备用响应格式.
可以向Solr索引servlet传递四个不同的索引请求
- Add/update允许向Solr添加文档或者更新文档.直到提交后才能搜索到这些添加的更新
- commint 告诉Solr应该使上次提交以来所做的所有的更改都可以被搜索到
- optimize 重构Lucene的文件以改进搜索性能.索引完成周执行一下优化通常比较好
如果更新比较频繁,则应该使用频率较低的时候安排优化,一个索引无需优化也可以运行,优化是一个耗时较多的过程
- delete可以通过id或查询来指定.按id删除将删除具有指定id的文档;按查询删除将删除查询返回的所有的文档
一个典型的Add请求报文
<add>
<doc>
<field name="id">TWINX2048-3200PRO</field>
<field name="name">CORSAIR XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail</field>
<field name="manu">Corsair Microsystems Inc.</field>
<field name="cat">electronics</field>
<field name="cat">memory</field>
<field name="features">CAS latency 2, 2-3-3-6 timing, 2.75v, unbuffered, heat-spreader</field>
<field name="price">185</field>
<field name="popularity">5</field>
<field name="inStock">true</field>
</doc>
<doc>
<field name="id">VS1GB400C3</field>
<field name="name">CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail</field>
<field name="manu">Corsair Microsystems Inc.</field>
<field name="cat">electronics</field>
<field name="cat">memory</field>
<field name="price">74.99</field>
<field name="popularity">7</field>
<field name="inStock">true</field>
</doc>
</add>
一个典型的搜索结果报文
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">6</int>
<lst name="params">
<str name="rows">10</str>
<str name="start">0</str>
<str name="fl">*,score</str>
<str name="hl">true</str>
<str name="q">content:"faceted browsing"</str>
</lst>
</lst>
<result name="response" numFound="1" start="0" maxScore="1.058217">
<doc>
<float name="score">1.058217</float>
<arr name="all">
<str>http://localhost/myBlog/solr-rocks-again.html</str>
<str>Solr is Great</str>
<str>solr,lucene,enterprise,search,greatness</str>
<str>Solr has some really great features, like faceted browsing and replication</str>
</arr>
<arr name="content">
<str>Solr has some really great features, like faceted browsing and replication</str>
</arr>
<date name="creationDate">2007-01-07T05:04:00.000Z</date>
<arr name="keywords">
<str>solr,lucene,enterprise,search,greatness</str>
</arr>
<int name="rating">8</int>
<str name="title">Solr is Great</str>
<str name="url">http://localhost/myBlog/solr-rocks-again.html</str>
</doc>
</result>
<lst name="highlighting">
<lst name="http://localhost/myBlog/solr-rocks-again.html">
<arr name="content">
<str>Solr has some really great features, like <em>faceted</em>
<em>browsing</em> and replication</str>
</arr>
</lst>
</lst>
</response>
配置Solr
建立Core
Solr的服务器在独立模式启动下启动的配置称为核心(Core),当它在SolrCloud模式启动的配置称为集合.
创建一个核心的索引数据,Slor的创建命令有以下选项
-c
要创建核心或者集合的名称 -d 配置目录,在SolrCloud模式非常有用 -n 配置名称.这将默认为核心或者集合的名称 -p 本地Solr实例的端口,发送create命令,默认脚本试图通过寻找运行Solr的实例来检测端口 -s Number of shards to split a collection into ,default is 1 -rf 集合中每个文件的份数,default is 1
在solr/bin运行
root@ubuntu:/opt/solr/bin# ./solr create -c jcg -d basic_configs -force
Copying configuration to new core instance directory:
/opt/solr/server/solr/jcg
Creating new core 'jcg' using command:
http://localhost:8983/solr/admin/cores?action=CREATE&name=jcg&instanceDir=jcg
{
"responseHeader":{
"status":0,
"QTime":43042},
"core":"jcg"
}
在Solr的页面上,可以看到JCG核心被填充在核心选择器上,还可以看到相关统计信息
修改Schema.xml文件
修改schema.xml,server\solr\jcg\conf包含的字段。我们将使用随Solr的安装索引附带的示例文件“books.csv”之一。该文件所在的文件夹下 的solr-5.0.0\example\exampledocs
现在,我们定位到该文件夹 server\solr目录。你会看到一个名为JCG的文件夹被创建。子文件夹conf和data分别拥有核心的配置和索引的数据。
现在编辑\server\solr\jcg\conf\server\solr\jcg\conf\schema.xml文件,设置唯一元素后添加以下内容。
索引数据
Apache Solr带有一个叫做SimplePostTool独立的Java程序。这个程序被打包成JAR,在安装目录下 example\exampledocs可看到。
现在,我们在命令行定位到example\exampledocs文件夹,然后键入以下命令。你会看到一堆选项,使用的工具。
Java -jar post.jar -h
在一般的使用格式如下用途:
Usage: java [SystemProperties] -jar post.jar [-h|-] [
[
正如我们前面所说,我们将索引“books.csv”文件中的数据。我们将导航到solr-5.0.0\example\exampledocs在命令提示符并发出以下命令。
root@ubuntu:/opt/solr/example/exampledocs# java -Dtype=text/csv -Durl=http://localhost:8983/solr/jcg/update -jar post.jar books.csv
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/jcg/update using content-type text/csv...
POSTing file books.csv to [base]
SimplePostTool: WARNING: Solr returned an error #400 (Bad Request) for url: http://localhost:8983/solr/jcg/update
SimplePostTool: WARNING: Response: <?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">400</int><int name="QTime">177</int></lst><lst name="error"><lst name="metadata"><str name="error-class">org.apache.solr.common.SolrException</str><str name="root-error-class">org.apache.solr.common.SolrException</str></lst><str name="msg">ERROR: [doc=0553573403] unknown field 'cat'</str><int name="code">400</int></lst>
</response>
SimplePostTool: WARNING: IOException while reading response: java.io.IOException: Server returned HTTP response code: 400 for URL: http://localhost:8983/solr/jcg/update
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/jcg/update...
Time spent: 0:00:00.501
索引Solr的XML文件
Solr可以为各种输入格式的结构化数据建立索引。在历史上,将格式化内容导入Solr的主要格式就是Solr的XML格式[3]。很多的Solr索引器都可以将域内容转换为Solr的XML输出,通常支持直接提交的HTTP请求至Solr的/update端点。
Solr支持示例数据中的几种Solr XML格式的文件。注意:示例中的科技产品的数据含有更加特定于域的配置,包括数据模式和浏览器界面。如果你想要bin/solr脚本提供对这种数据的内建支持,那么你可以运行bin/solr start -e techproducts
命令,这个命令不仅仅会启动Solr,而且还会为这些数据创建索引(在运行这个命令之前,请务必先运行bin/solr stop -all
命令)。然而,下面的示例假定使用bin/solr start -e cloud
命令来启动Solr,这样才能和本文中的所有示例保持一致,因此,示例使用的集合是“gettingstarted”,而不是“techproducts”。
使用bin/post脚本,为示例的Solr XML文件创建索引,这些文件在
ubuntu@ubuntu:/opt/solr$ bin/solr start -e cloud -noprompt
Welcome to the SolrCloud example!
Starting up 2 Solr nodes for your example SolrCloud cluster.
Creating Solr home directory /opt/solr/example/cloud/node1/solr
Cloning /opt/solr/example/cloud/node1 into
/opt/solr/example/cloud/node2
Starting up Solr on port 8983 using command:
"/opt/solr/bin/solr" start -cloud -p 8983 -s "/opt/solr/example/cloud/node1/solr"
Waiting up to 180 seconds to see Solr running on port 8983 [\]
Started Solr server on port 8983 (pid=17115). Happy searching!
Starting up Solr on port 7574 using command:
"/opt/solr/bin/solr" start -cloud -p 7574 -s "/opt/solr/example/cloud/node2/solr" -z localhost:9983
Waiting up to 180 seconds to see Solr running on port 7574 [\]
Started Solr server on port 7574 (pid=17333). Happy searching!
INFO - 2017-07-06 09:00:56.877; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at localhost:9983 ready
Connecting to ZooKeeper at localhost:9983 ...
INFO - 2017-07-06 09:00:56.997; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at localhost:9983 ready
Uploading /opt/solr/server/solr/configsets/data_driven_schema_configs/conf for config gettingstarted to ZooKeeper at localhost:9983
Creating new collection 'gettingstarted' using command:
http://localhost:8983/solr/admin/collections?action=CREATE&name=gettingstarted&numShards=2&replicationFactor=2&maxShardsPerNode=2&collection.configName=gettingstarted
{
"responseHeader":{
"status":0,
"QTime":13927},
"success":{
"127.0.1.1:8983_solr":{
"responseHeader":{
"status":0
"QTime":12395},
"core":"gettingstarted_shard1_replica2"},
"127.0.1.1:7574_solr":{
"responseHeader":{
"status":0,
"QTime":12408},
"core":"gettingstarted_shard2_replica1"}}}
Enabling auto soft-commits with maxTime 3 secs using the Config API
POSTing request to Config API: http://localhost:8983/solr/gettingstarted/config
{"set-property":{"updateHandler.autoSoftCommit.maxTime":"3000"}}
Successfully set-property updateHandler.autoSoftCommit.maxTime to 3000
SolrCloud example running, please visit: http://localhost:8983/solr
ubuntu@ubuntu:/opt/solr$
Solr的客户端API的
有不同的客户端API的可用来连接到Solr的服务器。我们列出了一些广泛使用的Solr客户端API的。
- SolRuby – To connect from Ruby
- SolPHP – To connect from PHP
- PySolr – To connect from Python
- SolPerl – To connect from Perl
- SolrJ – To connect from Java
- SolrSharp – To connect from C#
此外,Solr还提供了JavaScript可以直接使用的基于REST的API。