1. 什么是Solr

Solr是基于lucene的全文检索服务器。

不同于lucene工具包,solr是一个web应用,运行在servlet容器,屏蔽了底层细节,并对外提供服务。

Solr创建及维护索引:

solr客户端向solr服务端发送POST请求,请求内容是包含Field等信息的一个xml文档。通过该文档,solr实现对索引的维护(增删改)。

Solr的搜索:

solr客户端向solr服务端发送GET请求,solr服务器返回一个xml文档。

作为一个web应用,我们更多的工作不是编码而是配置。

2. Solr的安装与配置

解压solr压缩文件,可以看到下面几个目录

bin    : 存放solr命令

contrib  : solr增强功能

dist   : solr编译后产生的war包和依赖包

exapmle: solr的示例,其中,example/solr->solrhome, example/solr/collection1->solrcore

slorhome是solr服务运行的主目录,一个solrhome里包含多个solrcore。

solrcore存放了solr实例运行时需要的配置文件和索引数据,每个solrcore都可以单独提供服务,多个solrcore之间没有关系。

不同的业务模块可以使用不同的solrcore来提供服务;建立solr集群的时候,必须配置多个solrcore。

`solrcore`/conf->配置文件

`solrcore`/data->solr的数据,包含索引文件和log

`solrcore`/core.properties->本solrcore对外的名字

安装配置步骤:

1.解压war包至servlet容器,删除war包

2.添加日志:

example/lib/ext复制到solr的WEB-INF/lib下

example/resources/log4j.properties复制到WEB-INF/classes下

3. 添加分词器:

分词器的jar包复制到solr的WEB-INF/lib下

分词器的字典,停止词,配置文件复制到WEB-INF/classes下

记得在后面配置分词器的fieldType

4. 复制example下面的solrhome(含solrcore),至自定义目录下。如果需要,复制example下面的dist和contrib,至自定义目录下

5. 修改Web.xml的,设置solrhome的位置

6. 配置`solrcore`/conf/solrconfig.xml

1)lib标签。如果需要,指定相关增强功能包的位置。其中solr.install.dir表示solrcore的位置,作相应修改("../"部分)

2)datadir标签。指定data的位置,其中solr.data.dir表示`solrcore`/data,不用修改

3)requestHandler标签。设置请求url和服务器索引维护(update),搜索(search)行为之间的对应关系。后面使用dataimport插件时需要设置。

explicit

10

json

text

7. 配置`solrcore`/conf/schema.xml

详解:

id

添加dataimport插件

dataimport插件实现将sql语句的查询结果批量导入到solr索引库中, 当然该功能也可以通过下面的SolrJ实现

solr管理界面dataimport默认不可用, 以下步骤可开启:

1.添加`solrcore`/conf/solrconfig.xml的lib标签, 指定dist/solr-dataimporthandler

2.复制mysql数据库驱动包至contrib/db/lib下, 添加lib标签

3.添加`solrcore`/conf/solrconfig.xml的requestHandler标签, class:DataImportHandler, name:/dataimport, 指定sql语句配置文件data-config.xml

4.建立data-config.xml文件

3. 通过SolrJ访问Solr

维护索引:

public classIndexManager {

@Testpublic void createAndUpdateIndex() throwsException {//创建Document对象

SolrInputDocument doc = newSolrInputDocument();//field要求已经在solar服务器的配置文件中定义

doc.addField("id", "testId");

doc.addField("name", "testName");//创建HttpSolrServer

HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");//根据唯一键查找, 没有则创建, 有则修改

server.add(doc);//提交

server.commit();

}

@Testpublic void deleteIndex() throwsException {

HttpSolrServer server= new HttpSolrServer("http://localhost:8080/solr");//根据ID删除

server.deleteById("c001");//根据条件删除

server.deleteByQuery("id:c001");//删除全部(慎用)

server.deleteByQuery("*:*");//提交

server.commit();

}

}

搜索:

public classIndexSearch {

@Testpublic void searchSimple() throwsException {

HttpSolrServer server= new HttpSolrServer("http://localhost:8080/solr");//创建SolrQuery对象

SolrQuery query = newSolrQuery();//查询条件

query.setQuery("product_name:玩具");//执行查询并接收响应

QueryResponse response =server.query(query);//拿到结果

SolrDocumentList queryResults =response.getResults();//匹配结果总数

long count =queryResults.getNumFound();

System.out.println("结果总数:" +count);for(SolrDocument doc : queryResults) {

System.out.println(doc.get("id"));

System.out.println(doc.get("product_name"));

System.out.println(doc.get("product_catalog"));

System.out.println(doc.get("product_price"));

System.out.println(doc.get("product_picture"));

}

}

@Testpublic void searchComplicate() throwsException {

SolrQuery query= newSolrQuery();

query.set("q", "product_name:玩具");//设置过滤条件, 可添加多个

query.addFilterQuery("product_price:[1 TO 10]");//设置排序

query.setSort("product_price", ORDER.asc);//设置结果分页

query.setStart(0);

query.setRows(10);//设置结果显示的Field域集合

query.setFields("id,product_name,product_price");//设置默认搜索域, 查询语句中不需要"product_keywords:"了

query.set("df", "product_keywords");//设置某field高亮显示

query.setHighlight(true);

query.addHighlightField("product_name");

query.setHighlightSimplePre("");

query.setHighlightSimplePost("");

HttpSolrServer server= new HttpSolrServer("http://localhost:8080/solr");

QueryResponse response=server.query(query);//得到结果

SolrDocumentList queryResults =response.getResults();long count =queryResults.getNumFound();

System.out.println("匹配结果总数:" +count);//得到被封装的高亮结果, 类似: 普通字段高亮字段普通字段

Map>> hlResults =response.getHighlighting();for(SolrDocument doc : queryResults) {

System.out.println(doc.get("id"));//解析被封装的带高亮显示的结果. 对可能的高亮field分别处理

List hlLists = hlResults.get(doc.get("id")).get("product_name");if (hlLists != null)

System.out.println("高亮显示商品名:" + hlLists.get(0));else{

System.out.println("正常显示商品名:" + doc.get("product_name"));

}

System.out.println(doc.get("product_price"));

}

}

}

4. SolrCloud的搭建与访问

Solr集群需要用到多个solr与多个zookeeper

这里搭一个如下的简单架构作为例子

zookeeper在这个集群的作用:

1. 集群管理. 负责solr的主从关系, 负载均衡, 作为外界访问集群的入口. 为了保证高可用, zookeeper自身也必须是集群. 为使选举和投票有效, zookeeper至少需要三个节点.

2.配置文件管理. 各solr配置文件相同, 将配置文件上传给zookeeper统一管理, 每个solr节点都到zookeeper上取配置.

如果在一台主机上搭建集群, 注意避免端口冲突.

4.1 搭建zookeeper集群

1)在zookeeper01目录下创建一个data文件夹。

2)在data目录下创建一个myid的文件

3)Myid的内容为1(zookeeper02对应“2”,zookeeper03对应“3”)

4)进入conf文件, 复制zoo_sample.cfg模板文件创建zoo.cfg

5)修改zoo.cfg

把dataDir属性指定为刚创建的data文件夹

指定clientPort, 这是外界访问zookeeper01的端口

添加如下内容:

server.1=`zookeeper01的ip`:`port2`:`port3`

server.2=`zookeeper02的ip`:`port2`:`port3`

server.3=`zookeeper03的ip`:`port2`:`port3`

两个端口号分别是zookeeper间相互通信, 进行投票和选举的端口

6)zookeeper02 03以此类推

7)启动zookeeper. 使用zookeeper的bin目录下的zkServer.sh

启动:./zkServer.sh start

关闭:./zkServer.sh stop

查看服务状态:./zkServer.sh status

4.2 搭建solr集群

1)需要准备4台tomcat与4个solr实例

2)创建solrhome, 修改web.xml关联solrhome等类似单机solr

3)修改`solrhome`/solr.xml. 将solrCloud下的host, hostPort修改为所在的web容器访问地址与端口号

4)使用solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh命令将某台的`solrcore`/conf目录上传到zookeeper集群

./zkcli.sh -zkhost `zookeeper01的ip`:`port1`,zookeeper02的ip`:`port1`,zookeeper03的ip`:`port1` -cmd upconfig -confdir `solrcore`/conf -confname myconf

查看是否上传成功, 使用zookeeper的zkCli.sh命令

5)通知solr实例zookeeper的位置。修改tomcat的catalina.sh添加

JAVA_OPTS="-DzkHost=`zookeeper01的ip`:`port1`,zookeeper02的ip`:`port1`,zookeeper03的ip`:`port1`"

6)启动solr实例, 访问如下url进行分片, 分为2片, 每片一主一从

分片, 创建solrcore collection2:

http://某solr的ip:port/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2

可以删除不用的solrcore collection1

http://某solr的ip:port/solr/admin/collections?action=DELETE&name=collection1

4.3 使用SolrJ访问集群

public classIndexManager {

@Testpublic void createAndUpdateIndex() throwsException {

SolrInputDocument document= newSolrInputDocument();

document.addField("id", "testId");

document.addField("item_title", "testName");//创建一个SolrServer对象, zkHost地址为三个zookeeper地址

CloudSolrServer solrServer = new CloudSolrServer("192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183");//设置使用的solrcore(分片策略)

solrServer.setDefaultCollection("collection2");

solrServer.add(document);

solrServer.commit();

}

}

可以看出除了获取solrServer, 使用上和单机版没有任何区别. 集群对客户端来说的封闭的.

solor快速_Solr快速入门相关推荐

  1. solor快速_Solr快速入门(一)

    概述 本文档介绍了如何获取和运行Solr,将各种数据源收集到多个集合中,以及了解Solr管理和搜索界面. 首先解压缩Solr版本并将工作目录更改为安装Solr的子目录.请注意,基本目录名称可能随Sol ...

  2. solor快速_Solr快速教程-下载及安装

    Solr快速教程 加载及配置步骤: 1.下载最新版本的Solr(当前为v1.4): 下载地址:http://lucene.apache.org/solr/ 选择resource-download下载 ...

  3. solor快速_Solr快速概述

    Solr 是一个基于 Apache Lucene 之上的搜索服务器,它是一个开源的.基于 Java 的信息检索库.它旨在驱动功能强大的文档检索应用程序 - 无论您需要根据用户的查询将数据服务到何处,S ...

  4. solor快速_Solr快速教程

    本教程包括获取和运行 Solr,将各种数据源摄入到多个集合中,并对 Solr 管理和搜索接口有一定的了解. 它被组织成三个部分,每个部分都建立前一个部分之上.本章的第一个练习将要求您启动 Solr,创 ...

  5. OsharpNS轻量级.net core快速开发框架简明入门教程-代码生成器的使用

    OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...

  6. OsharpNS轻量级.net core快速开发框架简明入门教程-基于Osharp实现自己的业务功能...

    OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...

  7. python开发web教学视频_Python快速Web开发入门与实践视频课程

    Python快速Web开发入门与实践欢迎来到KK的<Python快速Web开发入门与实践>捧场!下面请允许我为这套课程做一点介绍. <Python快速Web开发入门与实践>是一 ...

  8. 年薪百万的阿里P9 Python专家快速带你入门Python

    年薪百万的阿里P9 Python专家快速带你入门Python 本文的目的是尽可能地用简洁的语言介绍 Python 编程语言,以帮助初学者能够快速入门Python.下面,让我们开始吧 什么是 Pytho ...

  9. 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )

    [每日一题]逆序对 链接:https://ac.nowcoder.com/acm/problem/14731 来源:牛客网 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j ...

最新文章

  1. Openldap/ldap 双向同步/复制/Mastsr/slave
  2. 多波次导弹发射中的规划问题(二) 问题一解答
  3. C++五子棋(四)——走棋原理及权值计算
  4. Windows下配置环境变量和需不需要重启?
  5. 3.spring cloud + zookeeper注册中心 + Feign调用案例
  6. Kali Linux Web 渗透测试秘籍 第六章 利用 -- 低悬的果实
  7. 校验插入指定结点是否导致编码循环的示例函数
  8. Java学习资料的汇总
  9. masm5 0的使用介绍
  10. AUC PR曲线 学习曲线
  11. 【React】利用Dooringx快速制作H5搭建平台
  12. 敌兵布阵 HDU - 1166(树状数组-模板线段树写法)
  13. 魔王抓住了公主 等笑话
  14. 数据分析学习记录(四)--在origin中实现单因素方差分析和非参数检验
  15. linux下unison安装配置
  16. c语言中windows.h是什么意思,c语言中memory.h有什么作用
  17. Unity实现遮挡人物的障碍物体设为透明,并在不遮挡时恢复的个人解决方法
  18. windows录屏_录屏软件:如何录制游戏视频?简单方法了解下
  19. Linux 安装数据库
  20. JAVA几种缓存技术介绍说明

热门文章

  1. 应用型本科优秀毕业生天花板
  2. VSCode主题颜色的更改,让字体变暗一些,不那么刺眼(类IDEA风)
  3. python scapy库基本使用
  4. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积起点定理推导过程 )
  5. 在阿里云镜像站下载blender
  6. HFP A2DP,通话过程中打开蓝牙,A2DP连接失败
  7. [QT]实现点击按钮弹出图片的效果
  8. ROS 移动机器人 坐标系统
  9. Struts2框架学习总结(从入门到精通)
  10. fisheyedemo问题