• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

Solr的基本使用

技术杂谈 勤劳的小蚂蚁 4个月前 (01-02) 75次浏览 已收录 0个评论 扫描二维码

schema.xml


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”/>
filed的name:name
indexed:是否索引,true表示要索引,索引的目的为了搜索 
stored:是否存储,存储的目的是为了从索引文件读取数据
type:text_general

主键(重点)

Solr在维护索引时要根据主键进行维护,比如创建索引没有指定主键,报如下错误:
如何指定solr的主键:
在schema.xml配置<uniqueKey>id</uniqueKey>
Solr中默认定义唯一主键key为id域,如下:
<uniqueKey>id</uniqueKey> 
Solr在删除、更新索引时使用id域进行判断,也可以自定义唯一主键。
 
注意在创建索引时必须指定唯一约束。

copyField复制域

copyField复制域,可以将多个Field复制到一个Field中,以便进行统一的检索: 
比如,输入关键字要搜索title标题和内容content这两个域时,要用到复制域
定义目标域:
必须要使用:multiValued=”true”
将以下的域复制到目标域中: 
如果在搜索时,搜索text域,solr会分别从以上cat、name、manu、features、includes这域中搜索,类似lucene中组合 域 搜索。

dynamicField

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

安装中文分词器


IKAnalyzer部署

将 Ikanalyzer的jar拷贝到Solrcore中 
将IKAnalyzer2012FF_u1.jar拷贝到 solrcontribIKAnalyzerlib下
在solrconfig.xml中配置加载IKanalyzer的jar,添加配置:
<lib dir=${solr.install.dir:../..}/contrib/IKAnalyzer/lib” regex=“.*.jar” />
配置扩展词库文件:
在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类型。

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

添加fieldType
自定义Field:

自定义业务系统Field


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

需求

要使用solr实现电商网站中商品搜索。
电商中商品信息在mysql数据库中存储了,将mysql数据库中数据在solr中创建索引。
需要在solr的schema.xml文件定义商品Field。

定义步骤

先确定定义的商品document的field有哪些? 
可以根据mysql数据库中商品表的字段来确定:
products商品表: 
商品document的field包括:pid、name、catalog、catalog_name、price、description、picture
先定义Fieldtype: 
solr本身提供的fieldtype类型够用了不用定义新的了。
再定义Field:
pid:商品id主键 
使用solr本身提供的: 
<fieldname=”id”type=”string”indexed=”true”stored=”true”required=”true”multiValued=”false” />

SorlJ创建索引


SorlJ介绍

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

SorlJ安装

solrj就是一推api,即jar包。
业务系统的应用程序(javaEE程序)通过solrJ提供的api调用solr服务。
下载的solr的zip包中就有solrj的jar:
要使用solrJ需要哪些jar包?
jar包明细:
solr-4.10.3distsolrj-lib*
solr-4.10.3dist solr-solrj-4.10.3.jar
solr-4.10.3examplelibext*
junit包

Solrj索引维护

1、添加及更新索引
2、删除索引

数据导入处理器


dataimport-Handler介绍

solr提供dataimport-Handler数据导入处理器,工作流程:
1、solr通过dataimport-Handler查询关系数据库中的数据 
2、对查询到的数据创建索引
上边的过程是自动化完成的。
可以通过此dataimport-Handler,批量将关系数据库中的数据创建索引到solr索引库中。

第一步:加载dataimport的jar包

 
将solrdist solr-dataimporthandler-4.10.3.jar拷贝至solrcontribdataimporthandler
配置solrconfig.xml加载jar包:
 
<lib dir=${solr.install.dir:../..}/contrib/dataimporthandler/lib” regex=“.*.jar” />

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

方法同上,将mysql数据库驱动的jar拷贝至solrcontribdatabaseDriver下
配置solrconfig.xml加载jar包:
<lib dir=${solr.install.dir:../..}/contrib/databaseDriver/lib” regex=“.*.jar” />

第三步:配置dataimport导入数据

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

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

测试数据导入

 

solrj进行搜索


solr的查询语法

1、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,设置格式前缀和后缀。

solrj搜索方法

@Test
publicvoidtestSearchIndex() 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));
               }
           }
       }
   }
}

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Solr的基本使用
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00