solr5.5部署

solr5.5部署

总体步骤:
1.solr服务的启动(单纯服务启动,不涉与文档配置(managed-schema.xml)、数据源、java调用)
2.添加一个core(类似服务,实际业务服务)
3.Solr文档配置(sql,字段映射定义,配置数据源)(从数据库导入相关数据到搜索引擎)
4.Java实现api调用solr服务(索引增删改查)
环境:
WINDOWS+TOMCAT8+JDK7+SOLR5.5(注:JDK的安装,以及tomcat的下载,tomcat下解压版,此处不介绍)
一、solr5.5 下载地址
http://apache.fayea.com/lucene/solr/5.5.0/
搭建solr 5.5
第一步,建立一个search的文件夹,文件夹名随便取,如:solr_server
第二步,将下载好的tomcat 8 拷贝到此目录下,此时的目录结构如下图:
在这里插入图片描述


第三步,下载solr 5.5 ,下载完solr 5.5 后,解压,目录结构如图
在这里插入图片描述
第四步,将solr-5.5.0\server\solr-webapp 下的webapp 文件夹拷贝到tomcat-8\webapps 目录下,并改名为SHFW_SEARCH(可自行命名),目录结构如下图
在这里插入图片描述

第五步, 进入到solr-5.5.0\server 目录,将此目录下的solr文件夹,拷贝到与tomcat同一目录下,如图
在这里插入图片描述
第六步,进入到solr_server\tomcat-8\webapps\SHFW_SEARCH\WEB-INF,打开web.xml,在web.xml中找到env-entry,修改solr home, 如下图
在这里插入图片描述
注:此处 …/…/solr/ 为什么会使这个值呢,为什么要如此配置,这个是因为solr默认的env-entry-value 的起始位置是tomcat的bin文件夹下,因此…/…/solr/ 这个的意思就是,bin文件夹下的上一层目录,再上一层目录的solr文件夹下,也就是solr_server下的solr文件夹下,就是solr的solrhome的位置,网上其他人都将solrhome(此处的solr)文件夹直接放在tomcat的bin目录下,我觉得不是很好。此处这样配置的另一个好处就是,当我们部署应用程序时,只要将solr_server拷贝到目标服务器上,启动tomcat,即可,不需要再修改任何配置,按常规配置,指定到具体的盘符的话,从开发移植到部署服务器上去时,就需要修改solrhome的位置了。
第七步,进入到solr-5.5.0\server\lib\ext,将所有jar包,拷贝到solr_server\tomcat-8\webapps\SHFW_SEARCH\WEB-INF\lib 下
第八步,进入到solr-5.5.0\server\resources,将log4j.properties 拷贝到solr_server\tomcat-8\webapps\SHFW_SEARCH\WEB-INF\classes 目录下(没有就新建空文件夹)
第九步,启动tomcat服务器,在地址栏中输入http://localhost:8080/SHFW_SEARCH/admin.html,即可看到solr配置成功。结果图如下:
在这里插入图片描述
添加core
进入到solr_server\solr 文件夹,建立一个文件夹,用于存放你的core,例如我的jobs(可自行命名)
在这里插入图片描述
-进入到solr-5.5.0\server\solr\configsets\sample_techproducts_configs 文件夹,将此文件夹下的conf 目录拷贝到刚刚建立的core的文件夹下,即我的jobs文件夹下
在浏览器中输入http://localhost:8080/SHFW_SEARCH/admin.html,进入solr管理页面,点击左侧的core admin,然后点击add core,在name 和instanceDir下都输入jobs(在步骤一中取得名称) ,点击add core即可
在这里插入图片描述
-此时在输入http://localhost:8080/SHFW_SEARCH/admin.html, 在左侧即可看见刚刚建立的core
在这里插入图片描述
然后在进入到solr_server\solr\jobs目录,此时会发现多了一个data文件夹和一个properties文件,如图
在这里插入图片描述
data目录,用于存储索引文件,core.properties文件用于存放core的配置信息
到此solr5.5的搭建,以及第一个core的就到此结束了
二、solr文档配置(managed-schema.xml(sql字段的映射关系),数据源配置)
1.2 安装ik中文分词器
1.准备好ik分词器的jar包,可以自己编译,也可以下载我生成的。然后把它复制到tomcat/webapp/SHFW_SEARCH/WEB-INF/lib里面。(千万不要复制到tomcat/lib中,这样会找不到lucene的类)
2.然后把IK分词器的配置文件放到 tomcat /webapps/SHFW_SEARCH/WEB-INF/classes目录下
3.打开solr/core1/conf/managed-schema文件,在最下方,追加如下配置
4.

或者添加下面这个
6.
7.再加上以下

8.启动tomcat,即可看到text_ik分词
9.

1.3 插入的文档必须与域相匹配
域,我个人也称它为字段,它在solr中有特定的含义,就类似数据库中表的列一样,规范着写入的数据,我们先来做个例子。

可以看到,我这次插入的文档,有id,title当然,在solr中,每一条记录都必须有着一个唯一的id,它就类似数据库中的主键,不可重复。这条记录的插入是成功的。
但是,如果我把title改成title1,这就与定义的字段不一样了,就会报错,如下图所示

可以看到,这里提示,未知的字段 title1.

1.4 域的定义 field
注意:有个配置域文件只能有一个id还有对应的域也不能重复,类似一张表,只能有一个主键还有对应的字段
这个配置文件主要就是配置需要查询的sql返回的字段
一个配置文件只能配置一条sql
切记:
一条sql的字段对应的域如下

先拿出一条配置来看一下

认识一下这些属性
  name:域名
  type:域的类型,必须匹配类型,不然会报错
  indexed:是否要作索引
  stored:是否要存储
  required:是否必填,一般只有id才会设置
  multiValued:是否有多个值,如果设置为多值,里面的值就采用数组的方式来存储,比如商品图片地址(大图,中图,小图等)

1.5 配置动态域 dynamicField
同样的,也先拿出一条来看看

何谓动态域呢?就是这个域的名称,是由表达式组成的,只要名称满足了这个 表达式,就可以用这个域
同样的认识一下这些属性
  name:域的名称,该域的名称是通过一个表达式来指定的,只要符合这这个规则,就可以使用这个域。比如 aa_i,bb_i,13_i等等,只要满足这个表达式皆可
  type:对应的值类型,相应的值必须满足这个类型,不然就会报错
  indexed:是否要索引
  stored:是否要存储
  …其它的属性与普通的域一至

1.6 主键域 uniqueKey
给出一条配置
id
指定一个唯一的主键,每一个文档中,都应该有一个唯一的主键,这个值不要随便改(与表作为主键的字段一致)

1.7 复制域 copyField
给出一条配置

说明一下相应的属性
  source:源域
  dest:目标域
复制域,将源域的内容复制到目标域中
注意:目标域必须是允许多值的,如下,nultiValued必须为true,因为可能多个源域对应一个目标域,所以它需要以数组来存储

1.8 域的类型 fieldType
同样的给出一段配置,这段稍微有点复杂,一下定义了域的类型为“text_general”,该域配置了分词器,查询时使用分析器做分词处理。

还有一些域常用的域类型:

给出相应属性的说明
  name:域的名称
  class:指定solr的类型
  analyzer:分词器的配置
    type: index(索引分词器),query(查询分词器)
    tokenizer:配置分词器
    filter:过滤器

1.9 业务字段的实际配置
经过上面的学习,差不多了解了一些常用的配置,如今我们用field来配置实际的业务字段,有属性如下

当然,中文分词还是要用的,因为我们在前面的 1.2 章节中,已经配置了一个fieldType的中文分词,所以我们现在一律用中文分词的域类型

主键的id就不需要配置了,默认已经把id配置为主键了,默认的配置如下

商品名称(需要分词,需要存储)

商品分类(不需要分词,需要存储)

商品分类名称(需要分词,需要存储)

商品价格(不分词,需要存储)

商品描述(需要分词,不需要存储)

商品图片(不需要分词,需要存储)

复制域的应用
前面我们了解了复制域,但是却不知道它的应用场景,现在我们结合实际情况来讲一下复制域
用户在搜索框搜索的时候,有可能输入的是商品名称,也有可能输入的是商品描述,也有可能输入的是一个商品类型,那么这些值的搜索,肯定在后台是对应一个域的,那么既然如此,我们就可以把这些域合并成一个,这样在后台只需要单独的对这一个域进行搜索就可以了
先定义一个目标域

复制域,把商品名称,商品描述,商品类型名称复制到上面的这个域中

1.10 dataimport 导入数据库数据
solr默认是没有开启dataimport这个功能的,所以我们要经过一点配置来开启它
1.首先找到solr5.5/dist/solr-dataimporthandler-5.5.2.jar,把这个文件复制到tomcat/webapp/solr/WEB-INF/lib/下,并且找到相应数据库的驱动包,也同样放到该目录。我这里用的是mysql的驱动包(oracle就用ojdbc)。
2.找到solr5.5/example/example-DIH/solr/db/conf/db-data-config.xml,把其复制到solrHome/core1/conf/下,并改名为data-config.xml.
3.找到solrHome/core1/conf/solrconfig.xml,并打开,在里面添加一段内容,如下
4.


data-config.xml


5.

6.打开并编辑data-config.xml,完整的配置文件如下

8.重启tomcat,然后会看到如下页面
9.
10.点击蓝色的按钮,则开始导入,导入过程依据数量量的大小,需要的时间也不同,可以点击右边的Refresh status来刷新状态,可以查看当前导入了多少条。
11.导入成功如下
12.

三:solrj的使用
代码地址 https://github.com/zxj19951029/useSolrj

使用SolrJ操作Solr会比利用httpClient来操作Solr要简单。SolrJ通过封装httpClient方法,来操作solr的API的。即SolrJ底层还是通过使用httpClient中的方法来完成Solr的操作
添加jar包:首先,你需要在你的web项目中添加SolrJ需要的jar包

上面一章节已经讲完了solr的安装与配置,现在说一下使用solrj来维护solr的索引及操作,solrj就是一个java的客户端,是一个jar包的使用
首先引入MAVEN的依赖,solrj的版本号要对应solr的版本号

org.apache.solr
solr-solrj
5.5.2

2.1 增加及修改
首先说明,在solr中,增加与修改都是一回事,当这个id不存在时,则是添加,当这个id存在时,则是修改
代码很好理解,直接给出
private String serverUrl = “http://192.168.1.4:8080/solr/core1”;
/**
* 增加与修改

* 增加与修改其实是一回事,只要id不存在,则增加,如果id存在,则是修改
* @throws IOException
* @throws SolrServerException
*/
@Test
public void upadteIndex() throws SolrServerException, IOException{
//已废弃的方法
//HttpSolrServer server = new HttpSolrServer(“http://192.168.1.4:8080/solr/core1”);
//创建
HttpSolrClient client = new HttpSolrClient(serverUrl);
SolrInputDocument doc = new SolrInputDocument();

    doc.addField("id", "zxj1");
    doc.addField("product_name", "javaWEB技术");
    doc.addField("product_catalog", "1");
    doc.addField("product_catalog_name", "书籍");
    doc.addField("product_price", "11");
    doc.addField("product_description", "这是一本好书");
    doc.addField("product_picture", "图片地址");
    
    client.add(doc);
    client.commit();
    
    client.close();
}

2.2 删除索引
删除的代码也直接给出,看代码里面的注释就可以了
/**
* 删除索引
* @throws Exception
*/
@Test
public void deleteIndex()throws Exception{
HttpSolrClient client = new HttpSolrClient(serverUrl);

    //1.删除一个
    client.deleteById("zxj1");
    
    //2.删除多个
    List<String> ids = new ArrayList<>();
    ids.add("1");
    ids.add("2");
    client.deleteById(ids);
    
    //3.根据查询条件删除数据,这里的条件只能有一个,不能以逗号相隔
    client.deleteByQuery("id:zxj1");
    
    //4.删除全部,删除不可恢复
    client.deleteByQuery("*:*");
    
    //一定要记得提交,否则不起作用        client.commit();
    client.close();
} 

2.3 查询
查询稍微复杂一点,但是与solr管理界面的条件一致
这里先给出一些查询的说明,建议查看这篇文章,个人感觉还是不错的http://blog.csdn.net/gufengshanyin/article/details/21098879
q - 查询字符串,如果查询所有*? (id:1)
fq - (filter query)过虑查询,过滤条件,基于查询出来的结果
fl - 指定返回那些字段内容,用逗号或空格分隔多个。
start - 分页开始
rows - 分页查询数据
sort - 排序,格式:sort=+<desc|asc>[,+<desc|asc>]… 。示例:(score desc, price asc)表示先 “score” 降序, 再 “price” 升序,默认是相关性降序。
wt - (writer type)指定输出格式,可以有 xml, json, php, phps。
fl表示索引显示那些field( *表示所有field,如果想查询指定字段用逗号或空格隔开(如:Name,SKU,ShortDescription或Name SKU ShortDescription【注:字段是严格区分大小写的】))
q.op 表示q 中 查询语句的 各条件的逻辑操作 AND(与) OR(或)
hl 是否高亮 ,如hl=true
hl.fl 高亮field ,hl.fl=Name,SKU
hl.snippets :默认是1,这里设置为3个片段
hl.simple.pre 高亮前面的格式
hl.simple.post 高亮后面的格式
facet 是否启动统计
facet.field 统计field

  1. “:” 指定字段查指定值,如返回所有值*?
  2. “?” 表示单个任意字符的通配
  3. ” 表示多个任意字符的通配(不能在检索的项开始使用或者?符号)
  4. “~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam将找到形如foam和roams的单词;roam0.8,检索返回相似度在0.8以上的记录。
  5. 邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
  6. “^” 控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上””符号和增量值,即jakarta4 apache
  7. 布尔操作符AND、||
  8. 布尔操作符OR、&&
  9. 布尔操作符NOT、!、- (排除操作符不能单独与项使用构成查询)
  10. “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在
  11. ( ) 用于构成子查询
  12. [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]

给出基本的代码看一下,仅仅作为一个基本的查询,高级的查询,各位要自己结合文档
package zxj.solrj;
import java.util.List;import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.impl.HttpSolrClient;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.common.SolrDocument;import org.apache.solr.common.SolrDocumentList;import org.junit.Test;
/**

  • 搜索
  • @author Administrator

*/public class IndexSearch {

private String serverUrl = "http://192.168.1.4:8080/solr/core1";
@Test
public void search()throws Exception{
    HttpSolrClient client = new  HttpSolrClient(serverUrl);
    
    //创建查询对象
    SolrQuery query = new SolrQuery();
    //q 查询字符串,如果查询所有*:*
    query.set("q", "product_name:小黄人");
    //fq 过滤条件,过滤是基于查询结果中的过滤
    query.set("fq", "product_catalog_name:幽默杂货");
    //sort 排序,请注意,如果一个字段没有被索引,那么它是无法排序的//        query.set("sort", "product_price desc");
    //start row 分页信息,与mysql的limit的两个参数一致效果
    query.setStart(0);
    query.setRows(10);
    //fl 查询哪些结果出来,不写的话,就查询全部,所以我这里就不写了//        query.set("fl", "");
    //df 默认搜索的域
    query.set("df", "product_keywords");
    
    //======高亮设置===
    //开启高亮
    query.setHighlight(true);
    //高亮域
    query.addHighlightField("product_name");
    //前缀
    query.setHighlightSimplePre("<span style='color:red'>");
    //后缀
    query.setHighlightSimplePost("</span>");
    
    
    //执行搜索
    QueryResponse queryResponse = client.query(query);
    //搜索结果
    SolrDocumentList results = queryResponse.getResults();
    //查询出来的数量
    long numFound = results.getNumFound();
    System.out.println("总查询出:" + numFound + "条记录");
    
    //遍历搜索记录
    //获取高亮信息
    Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
    for (SolrDocument solrDocument : results) {
        System.out.println("商品id:" + solrDocument.get("id"));
        System.out.println("商品名称 :" + solrDocument.get("product_name"));
        System.out.println("商品分类:" + solrDocument.get("product_catalog"));
        System.out.println("商品分类名称:" + solrDocument.get("product_catalog_name"));
        System.out.println("商品价格:" + solrDocument.get("product_price"));
        System.out.println("商品描述:" + solrDocument.get("product_description"));
        System.out.println("商品图片:" + solrDocument.get("product_picture"));

        //输出高亮 
        Map<String, List<String>> map = highlighting.get(solrDocument.get("id"));
        List<String> list = map.get("product_name");
        if(list != null && list.size() > 0){
            System.out.println(list.get(0));
        }
    }
    
    client.close();
}

}
注意:没有索引的域,是不能用作排序的

使用内置jetty启动
在 dosc窗口进入工程bin目录

输入命令:solr start

注意:

修改访问url:
例如将http://localhost:8093/solr-cores/改成http://localhost:8093/solr/

修改两个文件
1.Solr.cmd文件修改solr home 启动路径
2.solr-jetty-context.xml 修改访问应用的url(必须有solr-cores的文件夹)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值