本文介绍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 – 查询语法的版本,建议不使用它,由服务器指定默认值。
This work is licensed under a CC A-S 4.0 International License.