Solr的基本使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/happy_meng/article/details/79129061

Solr的基本使用

1.schema.xml


1.1.Field和fieldType(重点)

schema.xml,在SolrCore的conf目录下,它是Solr数据表配置文件,它定义了加入索引的数据的数据类型的。主要包括FieldTypes、Fields和其他的一些缺省设置。

field:进行索引,需要创建document,document中包括 了很多的field(域)。
field属性:是否索引、是否存储、是否分词 ,是否多值multiValued

multiValued:该Field如果要存储多个值时设置为true,solr允许一个Field存储多个值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图),通过使用solr查询要看出返回给客户端是数组:

Fieldtype:在solr中对每个Field都有一个Type类型。

在Solr中进行索引、搜索时需要用哪些field需要提前在schema.xml文件中定义!!!!

通过界面查看 solrCore中有哪些field被定义:

这里写图片描述

比如:

<field name="name" type="text_general" indexed="true" stored="true"/>
 
  • 1

filed的name:name
indexed:是否索引,true表示要索引,索引的目的为了搜索
stored:是否存储,存储的目的是为了从索引文件读取数据

type:text_general

这里写图片描述

1.2.主键(重点)

Solr在维护索引时要根据主键进行维护,比如创建索引没有指定主键,报如下错误:

这里写图片描述

如何指定solr的主键:

在schema.xml配置<uniqueKey>id</uniqueKey>

Solr中默认定义唯一主键key为id域,如下:

<uniqueKey>id</uniqueKey>
Solr在删除、更新索引时使用id域进行判断,也可以自定义唯一主键。
注意在创建索引时必须指定唯一约束。

1.3.copyField复制域

copyField复制域,可以将多个Field复制到一个Field中,以便进行统一的检索:
比如,输入关键字要搜索title标题和内容content这两个域时,要用到复制域

定义目标域:

这里写图片描述

必须要使用:multiValued=”true”

将以下的域复制到目标域中:
这里写图片描述

如果在搜索时,搜索text域,solr会分别从以上cat、name、manu、features、includes这域中搜索,类似lucene中组合 域 搜索。

1.4.dynamicField

使用 solr时要定义很多field比较麻烦,可以定义一种动态域,动态域没有具体的域名是定义一个规则,比如:name 为*_i。
当创建索引,指定field名称匹配上规则solr就执行成功,比如:动态域*_i,只要以_i结尾 的就可以索引创建成功。

2.安装中文分词器


2.1.IKAnalyzer部署

将 Ikanalyzer的jar拷贝到Solrcore中
将IKAnalyzer2012FF_u1.jar拷贝到 solr\contrib\IKAnalyzer\lib下

在solrconfig.xml中配置加载IKanalyzer的jar,添加配置:

 <lib dir="${solr.install.dir:../..}/contrib/IKAnalyzer/lib" regex=".*\.jar" />
 
  • 1

配置扩展词库文件:

在Tomcat的webapps/solr/WEB-INF/下创建classes目录
将IKAnalyzer.cfg.xml、ext_stopword.dic mydict.dic copy到
Tomcat/webapps/solr/WEB-INF/classes下

注意:ext_stopword.dic 和mydict.dic必须保存成无BOM的utf-8类型。

2.2.修改schema.xml文件添加新的fieldType及Field测试

添加fieldType

这里写图片描述

自定义Field:

这里写图片描述

3.自定义业务系统Field


要使用Solr去实现业务系统站内搜索功能,需要在solrCore中schema.xml文件中自定义field。

3.1.需求

要使用solr实现电商网站中商品搜索。

电商中商品信息在mysql数据库中存储了,将mysql数据库中数据在solr中创建索引。

需要在solr的schema.xml文件定义商品Field。

3.2.定义步骤

先确定定义的商品document的field有哪些?
可以根据mysql数据库中商品表的字段来确定:

products商品表:
这里写图片描述

商品document的field包括:pid、name、catalog、catalog_name、price、description、picture

先定义Fieldtype:
solr本身提供的fieldtype类型够用了不用定义新的了。

再定义Field:

pid:商品id主键
使用solr本身提供的:
<field name=”id” type=”string” indexed=”true” stored=”true” required=”true” multiValued=”false” />

这里写图片描述

4.SorlJ创建索引


4.1.SorlJ介绍

Solr是一个全文检索的服务,对外提供webservice服务,webservice使用的http协议。
Solr作为一个服务端,同时也提供很多的不同编程语言的客户端,供程序员开发使用。

这里写图片描述

4.2.SorlJ安装

solrj就是一推api,即jar包。

业务系统的应用程序(javaEE程序)通过solrJ提供的api调用solr服务。

下载的solr的zip包中就有solrj的jar:

这里写图片描述

要使用solrJ需要哪些jar包?

jar包明细:
solr-4.10.3\dist\solrj-lib*
solr-4.10.3\dist\ solr-solrj-4.10.3.jar
solr-4.10.3\example\lib\ext*
junit包

4.3.Solrj索引维护

4.3.1.添加及更新索引

这里写图片描述

4.3.2.删除索引

这里写图片描述

5.数据导入处理器


5.1.dataimport-Handler介绍

solr提供dataimport-Handler数据导入处理器,工作流程:

1、solr通过dataimport-Handler查询关系数据库中的数据
2、对查询到的数据创建索引

上边的过程是自动化完成的。

可以通过此dataimport-Handler,批量将关系数据库中的数据创建索引到solr索引库中。

5.2.第一步:加载dataimport的jar包

将solr\dist\ solr-dataimporthandler-4.10.3.jar拷贝至solr\contrib\dataimporthandler

配置solrconfig.xml加载jar包:

 <lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar" />
 
  • 1

5.3.第二步:加载mysql数据驱动包

方法同上,将mysql数据库驱动的jar拷贝至solr\contrib\databaseDriver下

配置solrconfig.xml加载jar包:

<lib dir="${solr.install.dir:../..}/contrib/databaseDriver/lib" regex=".*\.jar" />
 
  • 1

5.4.第三步:配置dataimport导入数据

创建data-config.xml文件,存放在SolrCore的conf目录

这里写图片描述

5.5.第四步:修改solrconfig.xml,添加requestHandler

这里写图片描述

5.6.测试数据导入

这里写图片描述

6.solrj进行搜索

6.1.solr的查询语法

1.q - 查询关键字,必须的,如果查询所有使用:
请求的q是字符串

这里写图片描述

2.fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如::
请求fq是一个数组(多个值)

这里写图片描述

过滤查询价格从1到40的记录。
也可以在“q”查询条件中使用product_price:[1 TO 40],如下:
这里写图片描述
也可以使用“*”表示无限,例如:
40以上:product_price:[40 TO *]
40以下:product_price:[* TO 40]

3.sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:
这里写图片描述按价格降序

4.start - 分页显示使用,开始记录下标,从0开始
5.rows - 指定返回结果最多有多少条记录,配合start来实现分页。
实际开发时,知道当前页码和每页显示的个数最后求出开始下标。

6.fl - 指定返回那些字段内容,用逗号或空格分隔多个。


显示商品名称和商品价格

7.df-指定一个搜索Field

这里写图片描述

也可以在SolrCore目录 中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。

这里写图片描述

8.wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开.

9.hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。

这里写图片描述

6.2.solrj搜索方法

 //查询索引
    @Test
    public void testSearchIndex() throws Exception{
        ////创建Solr服务对象,通过此对象向solr服务发起请求
        SolrServer solrServer = new HttpSolrServer(solrUrl);
        //创建查询对象
        SolrQuery query = new SolrQuery();
        //查询关键字,q不能省略
        query.set("q","product_keywords:睡枕");

        //指定过滤
        query.set("fq","product_price:[1 TO 40]");
        query.set("fq","product_catalog_name:幽默杂货");

        //排序
        //参数:field域,排序类型(asc,desc)
        query.addSort("product_price", SolrQuery.ORDER.desc);

        //分页
        //实际开发时,知道当前页码和每页显示的个数最后求出开始下标
        int curPage = 1;
        int rows = 15;

        //计算出开始记录下标
        int start = rows * (curPage - 1);

        //向query中设置分页参数
        query.setStart(start);
        query.setRows(rows);

        //指定显示的field
//        query.addField("product_name");
//        query.addField("id");

        //指定默认搜索域
        query.set("df","product_keywords");

        //开启高亮
        query.setHighlight(true);
        //设置高亮 参数
        query.addHighlightField("product_name");
        //设置高亮前缀和后缀
        query.setHighlightSimplePre("<span style=\"color:red\">");
        query.setHighlightSimplePost("</span>");

        //执行查询
        QueryResponse response = solrServer.query(query);

        //从响应中得到结果
        SolrDocumentList documents = response.getResults();

        //匹配到的总记录数
        long numFound = documents.getNumFound();
        System.out.println("匹配到的总记录数:"+numFound);

        //从响应中获得高亮信息
        Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

        for (SolrDocument document:documents){
            System.out.println("商品id:"+document.get("id"));
            System.out.println("商品名称:"+document.get("product_name"));
            System.out.println("商品价格:"+document.get("product_price"));
            System.out.println("商品分类名称:"+document.get("product_catalog_name"));
            System.out.println("商品图片:"+document.get("product_picture"));

            //获得高亮的信息
            if(highlighting!=null){
                //根据主键获取高亮信息
                Map<String, List<String>> map = highlighting.get(document.get("id"));
                if(map!=null){
                    List<String> list = map.get("product_name");
                    if(list!=null){
                        System.out.println("高亮后:"+list.get(0));
                    }
                }
            }
        }


    }

 
  • 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
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-8cccb36679.css" rel="stylesheet">
            </div>
								<div class="hide-article-box text-center">
					<a class="btn" id="btn-readmore" data-track-view="{&quot;mod&quot;:&quot;popu_376&quot;,&quot;con&quot;:&quot;,https://blog.youkuaiyun.com/happy_meng/article/details/79129061,&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_376&quot;,&quot;con&quot;:&quot;,https://blog.youkuaiyun.com/happy_meng/article/details/79129061,&quot;}">阅读更多</a>
				</div>
				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值