solr的简明使用

Posted by Sunder on October 19, 2016

本文介绍solr的基本用法

安装

建议在linux环境下使用。 到这里下载solr的最新版,比如solr-6.2.1.tgz。 然后将其放置于任意目录,假设在

/home/user/

目录中,然后将其解压。

tar zxf solr-6.2.1.tgz

其实这样就安装好了。但是solr6.2版本需要java1.8的支持,因此如果我们的系统中没有安装java1.8,或者版本太低,则需要安装java1.8

可以用以下命令查看当前java的版本:

java -version

如果需要安装java1.8,可以参考linux中安装java

使用

solr本身有非常多的功能,我们不介绍那些复杂的功能,只对常用的功能介绍。

概述

solr的使用可以分为以下几个步骤:

  • 开启solr服务
  • 定义自己的schema
  • 对数据进行索引
  • 查询

如果之前已经构建过索引,现在只是用来查询的话,那只需要上述的第一步和第四步。

开启solor服务

使用下面的命令开启solr服务:

bin/solr start

现在我们可以用浏览器访问 http://localhost:8983/solr/ 来访问Solr Admin UI。如果是远程访问,用本地的浏览器打开 http://your_server_ip:8983/solr/ 即可,其中your_server_ip是远程服务器的ip地址。 如果要停止solr服务,使用:

bin/solr stop -all

但此时我们只是开启了solr的服务,为了对数据进行索引和和检索,我们还需要创建一个core,命令如下:

bin/solr create -c your_core_name

your_core_name是我们自己定义的名字,比如叫做studentinfor等。之后的操作都是针对这个core来进行的。

在不需要这个core时,我们可以通过下面的命令来删除它

bin/solr delete -c your_core_name

定义自己的schema

我们首先要明白几个概念:

  • field: 域。比如书名是一个域,书的作者也是一个域。
    • name: 每个域都要有一个唯一的名字,这就是field的name。比如书名这个域的名字可以是”title”,也可以是”book_title”,还可以是别的。但是一旦定义好就不能再改了。
    • type: 域的值的类型。比如上面说到的书名这个域,它的type一般是string。如果是价格这个域,它的type可以定义为float。同样的,你可以给每个域定义你想定义的类型,但是一旦定义好,就不能再修改了。而且solr会根据类型的具体值(string、folat等)来确定如何处理这个域的值。

schema就是solr用来定义有哪些field,每个field的name和type分别是什么的文件。

我们可以通过schema API来定义。下面用一个例子来说明。

现在我们要对一份学生的基本信息进行索引。学生的基本信息有姓名和年龄这两个域。我们认为,姓名域的类型应该是string类型的,而不是int类型的,而年龄类型应该是int类型而不是float类型的。并且我们将姓名域的名字应该叫做”student_name”,年龄域的名字叫做”student_age”。

在命令窗口中输下面的命令,就可以添加我们自定义的schema:

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field":{ 
     "name":"student_name",
     "type":"text_general",
     "stored":true },
    "add-field":{ 
     "name":"student_age",
     "type":"int",
     "stored":true }
}' http://localhost:8983/solr/your_core_name/schema

如果是要修改某个已经定义过的field,那我们需要对上面的代码做一些修改,比如现在要将student_name这个field的类型设置为string,可以按如下代码:

curl -X POST -H 'Content-type:application/json' --data-binary '{
  "replace-field":{ 
     "name":"student_name",
     "type":"string",
     "stored":true }
}' http://localhost:8983/solr/your_core_name/schema

值得注意的是text类型和string类型的区别:

  • 二者都是字符串的类型
  • text类型的字符串会按照一定的规则进行切分、忽略大小写等操作(solr中称这些规则为Analyzer)
  • string类型的字符串不会做任何变化,比如索引中有”apple juice”,你检索时输入了”apple”,这样是不会返回”apple juice”的。
  • 用户需要根据具体的需求来决定使用哪种类型。其中text类型因为Analyzer的类型有很多种,所以text其实也有很多种,比如text_general、text_en等等。

自定义schema时一定要注意把core的名称写对,否则会出错,比如将your_core_name错写成了your_corrrrre_name,就会返回下面所示的错误:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 404 Not Found</title>
</head>
<body><h2>HTTP ERROR 404</h2>
<p>Problem accessing /solr/your_corrrrre_name/schema. Reason:
<pre>    Not Found</pre></p>
</body>
</html>

对数据进行索引

solr可以很方便的对各种格式的数据进行索引。下面我们以json文件为例子。执行

bin/post -c your_core_name some_directory/student.json

就可以将student.json文件进行索引了。

如果要删除某个core中的所有数据,可以用下面的命令:

bin/post -c your_core_name -d "<delete><query>*:*</query></delete>"

查询

查询有两种方法,第一是直接在浏览器中使用可视化界面来查询;第二是在命令窗口中输入查询命令来进行查询。 这里主要讲如何用命令以及在python中如何来查询。

命令行查询

检索单个词

例子中检索了词“apple”

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

第二个例子中指定在furit_name这个域中检索

curl "http://localhost:8983/solr/your_core_name/select?wt=json&indent=true&q=furit_name:apple"

检索短语

例子检索了短语“apple juice”

curl "http://localhost:8983/solr/your_core_name/select?wt=json&indent=true&q=\\"apple+juice\\""

同时检索多个词/短语

第一个例子检索同时包含短语“apple juice”和词“banana”

curl "http://localhost:8983/solr/your_core_name/select?wt=json&indent=true&q=%2B\\"apple+juice\\"+%2Bbanana"

第二个例子检索包含短语“apple juice”并且不包含“banana”

curl "http://localhost:8983/solr/your_core_name/select?wt=json&indent=true&q=%2B\\"apple+juice\\"-banana"

python中查询

在python中查询主要是用到了python的urllib和urllib2这两个库。基本思路是先把查询构建成url,然后通过urllib2来访问这个url并且获得结果。

# 引入相应的库
from urllib2 import *
import urllib
import json

# 构建url
query_word = 'fuel tank'
query_content = "obj_name:" + query_word
q_d = {'q':query_content, 'wt': 'json'}  # 'wt'指定返回的格式,我们这里设置为返回json格式,方便后续处理
query_url = 'http://localhost:8983/solr/your_core_name/select?'
connection = urlopen( query_url, urllib.urlencode(q_d))

# 获取返回结果
response = json.load(connection)	# connection 返回的是json格式的字符串
print response['response']['numFound'], "documents found."  # 返回的文档数	
for document in response['response']['docs']:  # 依次获取文档的信息
	print "  Name =", document['obj_name']
	print "  id = ", document['id']

查询参数的说明(来源

  • q – 查询字符串(必须),Solr 中用来搜索的查询。有关该语法的完整描述,请参阅 参考资料 中的 “Lucene QueryParser Syntax”。 可以通过追加一个分号和字段(已索引且未进行断词)的名称来包含排序信息。默认的排序是 score desc,指按记分降序排序。
示例: 
q=myField:Java AND otherField:developerWorks; date asc 
此查询搜索指定的两个字段并根据一个日期字段对结果进行排序。
  • start – 返回第一条记录在结果集中的偏移位置,从 0 开始,用作分页。
  • rows – 指定最多返回多少条记录,配合 start 来实现分页。
  • sort – 排序,格式:
sort=<field name> <desc|asc>[,<field name><desc|asc>]...
示例: 
sort=inStock desc, price asc 
先按 inStock 降序,再按 price 升序,默认是相关性降序。
  • wt – (writer type) 输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。

  • fq – (filter query) 过滤查询,在q查询的结果中过滤出符合 fq 查询的
  • fl- (field list) 逗号分隔的field列表,指定文档结果中应返回的 Field 集。默认为,指所有的字段。score 指还应返回记分。例如 *,score 将返回所有字段及得分。用 solrj 的 bean 时,得在query中指定query.set(“fl”, “,score”)
  • q.op – 覆盖 schema.xml 的defaultOperator(有空格时用AND还是用OR操作逻辑),一般默认指定
  • df – 默认的查询字段,一般默认指定
  • qt – (query type) 指定那个类型来处理查询请求,一般不用指定,默认是standard。
  • indent – 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
  • version – 查询语法的版本,建议不使用它,由服务器指定默认值。

Creative Commons License
This work is licensed under a CC A-S 4.0 International License.