寒玉 Blog
  • Home
  • Books
  • About Me
  • Categories
  • Tags
  • Archives

JAVA Solr

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。

参考

  • Solr快速入门教程
  • 基本特性和 Solr 模式

  • « Python Mac
  • JAVA JMX »

Published

6 27, 2017

Category

JAVA

Tags

  • java 15
  • solr 1
  • Powered by Pelican. Theme: Elegant by Talha Mansoor