之前写过solr的系列文章,包括对官方文档的学习和solrj的使用,但是今天想在项目中使用却发现很难将所有的知识点串联起来。
solr系列文章
所以今天从头到尾在项目中使用一下solr,记录一下步骤。
目的
实现一个文章搜索服务
第一步 启动solr服务器
参考
http://blog.csdn.net/frankcheng5143/article/details/52291176
我是windows,所以命令如下
cd solrHome(solrHome是solr的路径)
cd bin
solr.cmd start
第二步 创建集合(collection/core)
我们创建一个articles的集合(collection),collection和core是一个概念(后面我都会用collection或集合)
solr.cmd create -c articles
第三步 配置中文分词
经过第一步和第二步我们已经创建了articles集合,这时候就可以在solr的管理控制台看到创建的articles集合了。
管理控制台地址
不过不支持中文分词
测试是否支持中文分词
在core selector区域选择要测试的集合
测试步骤如下,下图是我之前配置了分词的一个collection,并对“吉林市长春药店”进行了测试。
下图是我们刚刚创建的articles集合对“吉林市长春药店”的测试。
由于我们没有配置中文分词,所以第四步选择字段类型中没有“text_ik”,我们选择了“text”,它将“吉林市长春药店”分成了七个单独的字符。
配置中文分词
1 下载资源并放在相应的目录
参考
将解分词资料里的ik-analyzer-solr5-5.x.jar拷贝到你的solr目录下的\server\solr-webapp\webapp\WEB-INF\lib目录中去,将IKAnalyzer.cfg.xml,mydict.dic(搜狗的扩展词库),stopword.dic放在你的solr目录下的\server\solr-webapp\webapp\WEB-INF\classes目录中去
2 修改相应的配置
修改刚才创建的articles集合目录下的managed-schema
将
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
添加在
<schema name="example-data-driven-schema" version="1.6">
之后
大概在48行的位置后添加
3 重新加载articles集合
在重新测试articles的中文分词,我们就会发现在FieldType中多了我们刚才添加的“text_ik”,而且可以进行中文分词。
这个时候我们的环境基本配置完成。
第四步 定义字段类型
跟数据库一样,solr也需要定义字段类型,这里我们的检索服务需要支持中文分词,所以字段类型都是第三步我们定义的中文分词类型。
这里使用Schema API来定义字段,其实solr已经帮我们定义了很多东西
Dynamic field definitions allow using convention over configuration
for fields via the specification of patterns to match field names.
我们来对一个文章定义一下它的文章标题name和文章内容content和文章发布时间createTime
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
定义的json格式如下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
以POST方式提交到
http://localhost:8983/solr/articles/schema
提交之后我们的name和content就支持中文分词检索了。
第五步 建立索引并查询
这里用SolrJ
注意最新版的solr需要jdk1.8及以上版本
提供一个SolrJ的工具类
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
这里首先要在Article实体的字段上加上solr的注解
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
然后我们调用SolrUtil的saveSolrResource插入几条数据
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
高亮显示
参考
首先需要高亮显示的字段在manage-schema中指定的field中的属性store设置为true后。
我们在第四步中的add-field没有设置store
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
在控制台看managed-schema 结果如下
所以先把name和content删掉
删掉方法
提交下面的json
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
以POST方式提交到
http://localhost:8983/solr/articles/schema
重新创建一下name和content
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
以POST方式提交到
http://localhost:8983/solr/articles/schema
这个时候name和content已经重建了
控制台的高亮
勾选了hl
就可以高亮显示了
hl.fl (指定要高亮显示的字段,用空格或逗号隔开的字段列表,要启用某个字段的highlight功能,就得保证该字段在schema中是stored。)
Specifies a list of fields to highlight. Accepts a comma- or
space-delimited list of fields for which Solr should generate highlighted
snippets. A wildcard of ’ ’ (asterisk) can be used to match field globs, *
such as ‘text_*’ or even ‘*’ to highlight on all fields where highlighting is
possible. When using ‘*’, consider adding hl.requireFieldMatch=
true
hl.simple.pre(高亮前缀)
hl.simple.post(高亮后缀)
会将高亮字段以前后缀包围,这里用红色字体
在高亮是查询必须指定字段
不指定查询字段
指定查询字段
高亮查询的Java代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28