| 
                             
                              | 
                                   
                                    | 编辑推荐: |   
                                    | 本文主要从solr六个方面介绍了solr的基本应用 
                                      ,希望对您能有所帮助。 本文来自于csdn,由火龙果软件刘琛编辑推荐
 |  |   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"/> |  filed的name:name  indexed:是否索引,true表示要索引,索引的目的为了搜索  stored:是否存储,存储的目的是为了从索引文件读取数据 type:text_general 
 1.2.主键(重点) Solr在维护索引时要根据主键进行维护,比如创建索引没有指定主键,报如下错误: 
 如何指定solr的主键: 在schema.xml配置id Solr中默认定义唯一主键key为id域,如下:id 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" /> |  配置扩展词库文件: 在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" /> |  5.3.第二步:加载mysql数据驱动包 方法同上,将mysql数据库驱动的jar拷贝至solr\contrib\databaseDriver下 配置solrconfig.xml加载jar包: 
                           
                              | <lib dir="${solr.install.dir:../..}/contrib/databaseDriver/lib" 
                                regex=".*\.jar" /> |  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. get Highlighting();
 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));
 }
 }
 }
 } }
 |  |