Solr6 快速入门教程

Solr6 快速入门教程

安装

环境要求

  1. JDK1.8
  2. 下载Solr,本文试验时,使用的Solr6.6.0

开始安装

  1. 解压solr-6.6.0.zip
  2. cd solr-6.6.0\
  3. 启动solr,run: bin\solr start -e cloud -noprompt
D:\machine\solr\solr-6.6.0>bin\solr start -e cloud -noprompt

Welcome to the SolrCloud example!

Starting up 2 Solr nodes for your example SolrCloud cluster.
...

Started Solr server on port 8983. Happy searching!
...

Started Solr server on port 7574. Happy searching!
...

SolrCloud example running, please visit: http://localhost:8983/solr


D:\machine\solr\solr-6.6.0>
  1. 访问Solr管理可视化页面: http://localhost:8983/solr,检测Solr是否运行。

Solr 现在将运行两个节点,一个在端口7574,一个在端口8983,有一个自动创建的文档gettingstarted,默认有两个分片收集,每个分片有两个副本,这管理页面的Cloud tab 可以很直观的查看。

Solr6 快速入门教程

Solr服务器已经启动并运行,但是它不包含任何数据。Solr安装包括了bin/post工具,以便从一开始就方便地从Solr的文档中获得各种类型的文档。

  • 注意:当前的bin/post工具没有一个可以比拟的Windows脚本,但是调用的底层Java程序是可用的。

学习post.jar

在windows中,bin/post可以委托给一个独立运行的Java程序叫SimplePostTool,可以执行运行 java -jar example/exampledocs/post.jar

  • D:\machine\solr\solr-6.6.0>java -jar example\exampledocs\post.jar -h查看帮助可以(获取文件,递归到一个网站或文件系统文件夹,或者向Solr服务器发送直接命令)
SimplePostTool version 5.0.0
Usage: java [SystemProperties] -jar post.jar [-h|-] [<file|folder|url|arg> [<file|folder|url|arg>...]]
...
...

重点在这里:
java [SystemProperties] -jar post.jar [-h|-] [<file|folder|url|arg> [<file|folder|url|arg>...]]

  • 要看懂这个post.jar,首先要知道,被中括号包住的参数表示可选参数,|表示或者,SystemProperties表示系统属性;
    什么叫系统属性呢?即通过System.setProperty(key,value)设置的参数;

这里的key,value值都是随便定义的,没什么特别要求,这样你随后通过System.getProperty(key)通过key就能在任意时刻获取到该key对应的参数值,如果是在dos命令行下,你也可以通过java -Dkey=value这种方式指定,至此java [SystemProperties]这部分你应该理解了,至于后面的-jar是java命令的参数,即执行一个jar文件,-jar后面指定一个jar包路径,默认是相对于当前所在路径,-h即表示添加了这个即会打印命令提示信息,就好比你敲java -h是类似的,后面的file,folder,url,args分别表示你要提交的数据的几种不同表示形式,file即表示你要提交的数据是存在于文件中,而folder即表示你要提交的存在于文件夹中,url即表示你要提交的数据是存在于互联网上的一个URL地址表示的资源,它可能是一个HTML页面,可能是一个PDF文件,可能是一个图片等等,args即表示你要提交的数据直接在命令行敲出来,但arges并不是随随便便一个字符串就行的,它需要有固定的格式,solr才能解析

  • java -jar example\exampledocs\post.jar -h查看帮助列出的内容说到:
Supported System Properties and their defaults:
  -Dc=<core/collection>
  -Durl=<base Solr update URL> (overrides -Dc option if specified)
  -Ddata=files|web|args|stdin (default=files)
  -Dtype=<content-type> (default=application/xml)
  -Dhost=<host> (default: localhost)
  -Dport=<port> (default: 8983)
  -Dbasicauth=<user:pass> (sets Basic Authentication credentials)
  -Dauto=yes|no (default=no)
  -Drecursive=yes|no|<depth> (default=0)
  -Ddelay=<seconds> (default=0 for files, 10 for web)
  -Dfiletypes=<type>[,<type>,...] (default=xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log)
  -Dparams="<key>=<value>[&<key>=<value>...]" (values must be URL-encoded)
  -Dcommit=yes|no (default=yes)
  -Doptimize=yes|no (default=no)
  -Dout=yes|no (default=no)
  • -D是命令行下指定系统属性的固定前缀

    • c表示collection名称,你需要对solr admin里的哪个collection进行索引数据添加/修改/删除
    • url表示solr admin后台索引更新的请求URL,这个URL是固定的,一般格式是http://host:port/solr/${collectionName}/update,这里的${collectionName}和上面的c属性值保持一致
    • data表示你要提交数据的几种模式,files模式表示你要提交的数据在文件里

      • web表示你要提交的数据在互联网上的一个URL表示的资源文件里
      • args表示你要提交的数据你会直接在post.jar命令后面直接输入
      • stdin表示你要提交的数据需要在dos命令行下通过System.in输入流临时接收,跟args有点类似,但不同的是,stdin模式下,post.jar后面不需要指定任何参数,直接回车即可,然后程序会等待用户输入,用户输入完毕再回车,post.jar会接收到用户输入,post.jar重新被唤醒继续执行。而args是直接在post.jar后面输入参数,没有一个中断过程,而stdin模式下如果用户一直没有输入,那post.jar就会一直阻塞在那里等待用户输入为止。
    • type表示你要提交数据的MIME类型,默认是application/xml即默认会当作是XML来处理
    • host表示你要链接的SOlr Admin部署服务器的主机名或者IP地址,默认是localhost
    • port表示你要链接的Solr Admin部署的Web容器监听的端口号,默认post.jar里设置为8983port具体值取决于你实际部署环境而定
    • auto表示是否自动猜测文件类型
    • recursive表示是否递归,这里递归有两种情况,比如你data=folder即表示是否递归查找文件夹下的所有文件,如data=web即表示是否递归抓取URL,设置为no即表示不递归操作,设置为一个数字,即表示递归深度
    • delay:这里的时间延迟也分两种,如果你post的是file,那么每个file的post间隔为0,即不做延迟处理而如果你是post的是网络上的一个url资源,因为需要受到对方服务器的访问限制,所以必须要做一个抓取频率限制即每抓一个睡眠一会儿,否则抓取太快太频率容易被对方封IP。
    • filetypes表示post.jar支持提交哪些文件类型,后面有列出默认支持的文件类型,如果你想覆盖默认值,那么请指定此参数
    • params表示需要追加到Solr Admin的请求URL后面的请求参数如id=1&name=yida之类的
    • commit表示是否提交到solr admin后台进行索引写入,设置为false表示不提交至sor admin,但设置为true也不一定就意味着就一定会把索引写入磁盘,这取决于solrconfigdirectory配置的实现是什么,如果配置的是RAMDirectory,就仅仅只在内存中操作了。
    • optimize表示是否需要对索引进行优化操作,默认为no即表示不对索引进行优化
    • outOutputStream表示输出流,这个参数作用就是,你请求Solr Admin添加索引数据,Solr Admin后台会返回数据给你,Solr Admin后台返回的数据你拿什么输出流来接收,默认是System.out即表示把后台返回的信息输出打印到控制台
  • 参数这里应该已经搞得清楚了,再来看看官方提供的几个post.jar使用命令示例:
Examples:
  java -Dc=gettingstarted -jar post.jar *.xml
  java -Ddata=args -Dc=gettingstarted -jar post.jar '<delete><id>42</id></delete>'
  java -Ddata=stdin -Dc=gettingstarted -jar post.jar < hd.xml
  java -Ddata=web -Dc=gettingstarted -jar post.jar http://example.com/
  java -Dtype=text/csv -Dc=gettingstarted -jar post.jar *.csv
  java -Dtype=application/json -Dc=gettingstarted -jar post.jar *.json
  java -Durl=http://localhost:8983/solr/techproducts/update/extract -Dparams=literal.id=pdf1 -jar post.jar solr-word.pdf
  java -Dauto -Dc=gettingstarted -jar post.jar *
  java -Dauto -Dc=gettingstarted -Drecursive -jar post.jar afolder
  java -Dauto -Dc=gettingstarted -Dfiletypes=ppt,html -jar post.jar afolder

更多关于post.jar的信息请点击这里

建立索引

索引一个包含多种文件的目录

  • bin/post可以循环提取文件目录,将每个文件的原始内容发送到Solr以提取和索引

Solr安装后,包括一个docs/子目录,windows下使用如下命令:java -Dc=gettingstarted -Dauto=yes -Ddata=files -Drecursive=yes -jar example/exampledocs/post.jar docs/

linux下可以使用bin/post -c gettingstarted docs/
命令解析:

  • -c gettingstarted:要索引的集合的名称
  • docs/: Solr安装目录下的/docs的相对路径

Solr索引XML

使用bin/post,索引示例Solr XML文件中的示例/example文档/:
linux下使用:bin/post -c gettingstarted example/exampledocs/*.xml
windows下使用:
java -Dc=gettingstarted -Dauto=yes -Ddata=files -Drecursive=yes -jar example/exampledocs/post.jar example\exampledocs\*.xml
你将会看到:

D:\machine\solr\solr-6.6.0>java -Dc=gettingstarted -Dauto=yes -Ddata=files -Drecursive=yes -jar example/exampledocs/post.jar example\exampledocs\*.xml
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/gettingstarted/update...
Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
Entering recursive mode, max depth=999, delay=0s
POSTing file gb18030-example.xml (application/xml) to [base]
POSTing file hd.xml (application/xml) to [base]
POSTing file ipod_other.xml (application/xml) to [base]
POSTing file ipod_video.xml (application/xml) to [base]
POSTing file manufacturers.xml (application/xml) to [base]
POSTing file mem.xml (application/xml) to [base]
POSTing file money.xml (application/xml) to [base]
POSTing file monitor.xml (application/xml) to [base]
POSTing file monitor2.xml (application/xml) to [base]
POSTing file mp500.xml (application/xml) to [base]
POSTing file sd500.xml (application/xml) to [base]
POSTing file solr.xml (application/xml) to [base]
POSTing file utf8-example.xml (application/xml) to [base]
POSTing file vidcard.xml (application/xml) to [base]
14 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/gettingstarted/update...
Time spent: 0:00:03.233

注意:您可以浏览文档索引在http://localhost:8983/solr/ge...

索引JSON

  • Solr支持索引JSON,即任意结构化JSON或“Solr JSON”(类似于Solr XML)
  • Solr包含一个很小的示例Solr JSON文件,以演示该功能。再次使用bin/post,索引示例JSON文件:

linux使用: bin/post -c gettingstarted example/exampledocs/books.json
windows使用:java -Dc=gettingstarted -Dauto=yes -Ddata=files -Drecursive=yes -jar example/exampledocs/post.jar example\exampledocs\books.json

你将看到如下信息:

D:\machine\solr\solr-6.6.0>java -Dc=gettingstarted -Dauto=yes -Ddata=files -Drecursive=yes -jar example/exampledocs/post.jar example\exampledocs\books.json
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/gettingstarted/update...
Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
Entering recursive mode, max depth=999, delay=0s
POSTing file books.json (application/json) to [base]/json/docs
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/gettingstarted/update...
Time spent: 0:00:01.211
  • 要了解关于索引Solr JSON的更多信息,请参阅Solr参考指南部分Solr-Style JSON

索引CSV

  • 数据到Solr的一个重要通道是通过CSV,尤其是当文档是均匀的,所有的记录都有相同的字段。CSV可以方便地从电子表格中导出,例如Excel,或者从MySQL等数据库导出。在开始使用Solr时,通常最容易将结构化数据转换为CSV格式,然后将其索引到Solr,而不是一个更复杂的单步操作。
  • 使用bin/post索引包含的示例CSV文件:

linux下使用:bin/post -c gettingstarted example/exampledocs/books.csv
windows下使用:java -Dc=gettingstarted -Dauto=yes -Ddata=files -Drecursive=yes -jar example/exampledocs/post.jar example\exampledocs\books.csv

在你的终端,你会看到:

D:\machine\solr\solr-6.6.0>java -Dc=gettingstarted -Dauto=yes -Ddata=files -Drecursive=yes -jar example/exampledocs/post.jar example\exampledocs\books.csv
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/gettingstarted/update...
Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
Entering recursive mode, max depth=999, delay=0s
POSTing file books.csv (text/csv) to [base]
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/gettingstarted/update...
Time spent: 0:00:00.874

更多信息,请参阅Solr指南部分CSV格式的索引更新CSV Formatted Index Updates

其他索引技术

  • 使用数据导入处理程序(DIH)从数据库中导入记录。
  • 使用Solr在基于jvm的语言或其他Solr客户端,以编程方式创建文档发送到Solr。
  • 使用Solr管理页面的文档选项卡粘贴一个要被索引的文档,或者选择Document Type的下拉选项卡选择Document Builder每次添加一个字段来构建文档.单击表单下面的Submit文档按钮,以索引文档。

数据操作

更新数据

  • 默认情况下,schema.xml指定了一个uniqueKey字段id,即使我们索引一个内容多次,它也不会重复添加,当我们POST命令到Solr添加文档时,如果uniqueKey字段当前值已存在,它会自动替换原来的内容.

删除数据

  • 可以通过将delete命令发送到更新URL并指定文档的惟一键字段的值,或者匹配多个文档的查询(小心使用这个!)来删除数据。
  • 执行以下命令删除一个特定的文档:

linux使用:bin/post -c gettingstarted -d "<delete><id>SP2514N</id></delete>"
windows使用:java -Dc=gettingstarted -Ddata=args -jar example\exampledocs\post.jar "<delete><id>1</id></delete>"

搜索

Solr可以通过REST客户端,cURL,wget,POSTMAN等来查询,以及许多编程语言都可以使用的本地客户端。

  • Solr管理UI包含一个查询构建器接口——gettingstarted默认文档查询:http://localhost:8983/solr/#/...如果你不改变表单里的任何内容,直接点击Execute Query按钮,你将得到默认10条JSON格式的文档(*:*作为q的参数表示匹配所有文档)

Solr6 快速入门教程

由Admin UI发送到Solr的URL显示在上面屏幕右上角的浅灰色中,如果你点击它,你的浏览器将会显示原始的响应。要使用cURL,请在cURL命令行中使用相同的URL:

curl "http://localhost:8983/solr/gettingstarted/select?indent=on&q=*:*&wt=json"

基础

搜索一个词

搜索一个特定的词,需要把在Solr Admin UI查询板块中q的参数值*:*替换成你想要查询的词

curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation"

你将得到:

$ curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2017  100  2017    0     0   123k      0 --:--:-- --:--:-- --:--:--  123k{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":17,
    "params":{
      "q":"foundation",
      "indent":"true",
      "wt":"json"}},
  "response":{"numFound":3,"start":0,"maxScore":3.4038174,"docs":[
      {
        "id":"0553293354",
        "cat":["book"],
        "name":["Foundation"],
        "price":[7.99],
        "inStock":[true],
        "author":["Isaac Asimov"],
        "series_t":["Foundation Novels"],
        "sequence_i":1,
        "genre_s":"scifi",
        "_version_":1576664844219711488},
      {
...

响应表明,有3个命中("numFound":3),其中前10个被返回,因为默认的start=0rows=10。您可以通过指定这些params查询结果,其中start是第一个结果返回的(基于零的)位置,而raws是一页的大小。

  • 要限制响应中返回的字段,请使用fl param,该命令将使用逗号分隔的字段名列表。只返回id字段:
curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation&fl=id"
  • q=foundation匹配了我们已经索引的几乎所有文档,因为文档中的大多数文件都包含“Apache软件基金会”。要限制搜索到特定字段,使用语法"q=field:value",例如只在name字段中搜索Foundation:
curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=name:Foundation"

短语检索

要搜索一个多词短语,用双引号括起来:q="这里的多个词语"。例如,搜索"CAS latency"注意,术语之间的空格必须转换为"+"(Admin UI将自动处理URL编码):

curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=\"CAS+latency\""

你将看到:

"responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":9,
    "params":{
      "q":"\"CAS latency\"",
      "indent":"true",
      "wt":"json"}},
  "response":{"numFound":2,"start":0,"maxScore":2.9027793,"docs":[
      {
        "id":"TWINX2048-3200PRO",
        "name":["CORSAIR  XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail"],
        "manu":["Corsair Microsystems Inc."],
        "manu_id_s":"corsair",
        "cat":["electronics",
          "memory"],
        "features":["CAS latency 2,  2-3-3-6 timing, 2.75v, unbuffered, heat-spreader"],
...

组合搜索

默认情况下,当你在单一查询中搜索多个词或短语时,Solr只要求其中一个匹配,以便让文件匹配,包含更多词语的文档将在结果列表中排序更高。

  • 你可以查询一个词通过前缀加上"+"来限定;相反,为了不允许出现一个词,用"-"前缀来限定。
  • 因为"+"字符在url中有一个保留的目的(空格字符编码),所以必须使用URL encode进行编码在curl中使用.
curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=on&q=%2Baaa+%2BFoundatio"
  • 查找含有"Foundation"但是不含有"aaa"的文档,在Admin UI 的查找页面的q参数中输入+Foundation -one,在curl中将"+"编码为"%2B"
$ curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=on&q=%2BFoundation+-aaa"

深入学习:要了解更多Solr搜索选项,请参阅Solr参考指南的搜索部分

清除

  • 当你在完成了上面示例后,你可能想要阻止Solr,并把环境重新设定到起点。下面的命令行将停止Solr并删除开始脚本创建的两个节点的目录:
bin/solr stop -all ; rm -Rf example/cloud/

接下来去哪里?

  • 有关Solr的更多信息,请查看以下参考资料:

相关推荐