内容简介:Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器。Solr比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。Solr是如何实现全文检索的呢?
Solr是apache的顶级开源项目,它是使用 java 开发 ,基于lucene的全文检索服务器。
Solr比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。
Solr是如何实现全文检索的呢?
索引流程:solr客户端(浏览器、java程序)可以向solr服务端发送POST请求,请求内容是包含Field等信息的一个xml文档,通过该文档,solr实现对索引的维护(增删改)
搜索流程:solr客户端(浏览器、java程序)可以向solr服务端发送GET请求,solr服务器返回一个xml文档。
Solr同样没有视图渲染的功能。
solr 和 lucene 的区别
Lucene 是一个全文检索引擎 工具 包,它是一个 jar 包,不能独立运行,对外提供服务。
Solr 是一个全文检索服务器,它可以单独运行在 servlet 容器,可以单独对外提供搜索和索引功能。Solr 比 lucene 在开发全文检索功能时,更快捷、更方便。
solr 的安装配置
下载
solr 和 lucene 的版本时同步更新的,最新版本是5.2.1
下载地址:http://archive.apache.org/dist/lucene/solr/
环境
jdk:1.7及以上 solr:4.10.3 mysql:5x web服务器:tomcat7
初始化数据库脚本
solr 安装配置
- 安装 tomcat
- 将solr-4.10.3\example\webapps 目录下 solr.war 拷贝到 tomcat webapps 目录下
- 解压缩 war 包,解压缩之后,将 war 包删掉
- 添加 solr 扩展服务包。将 solr-4.10.3\example\lib\ext 目录下 jar 拷贝到 tomcat solr WEB-INF lib 目录下
- 添加 log4j.properties。拷贝 solr-4.10.3\example\resources 目录下 log4j.properties 到 apache-tomcat-7.0.57\webapps\solr\WEB-INF\classes ,目录不存在没有则创建。
- 在 web.xml 中指定 solrhome 的目录
solrcore 安装
solrcore 和 solrhome
Solrhome是solr服务运行的主目录,一个solrhome目录里面包含多个solrcore目录,一个solrcore目录里面了一个solr实例运行时所需要的配置文件和数据文件。
每一个solrcore都可以单独对外提供搜索和索引服务。 多个solrcore之间没有关系。
solrcore 和 solrhome 的目录结构
solrhome: solr-4.10.3\example\solr solrcore: solr-4.10.3\example\solr\collection1 包含配置文件,索引文件日志信息
solrcore 的安装
安装 solrcore 需要先安装 solrhome 将上面solrhome下的文件拷贝到web.xml中指定的solrhome中即可
solrcore 的配置
配置 solrcore 的 conf 目录下的 solrconfig.xml 配置文件,来配置 solrcore 的运行信息。
在该文件中,主要配置三个标签:lib 标签、datadir标签、requestHandler 标签。
lib 标签
solrcore 需要添加一个扩展依赖包,通过 lib 标签来指定依赖包的地址
solr.install.dir 表示 solrcore 的安装目录
拷贝 example 目录下的 contrib 和 dis 目录到
修改 lib 标签
datadir 标签
每个 solrcore 都有自己的索引文件目录,默认在 solrcore 目录下的 data 中。
data数据目录下包括了index索引目录 和tlog日志文件目录。 如果不想使用默认的目录也可以通过solrConfig.xml更改索引目录 ,如下:
requestHandler 标签
requestHandler 请求处理器,定义索引和搜索的访问方式。 通过 /update 维护索引,可以完成对索引的添加、修改、删除操作。
提交 xml、json 数据完成索引维护。
通过 /select 搜索索引
设置搜索参数完成搜索,搜索参数也可以设置一些默认值,如下:
<requestHandler name="/select" class="solr.SearchHandler"> <!-- 设置默认的参数值,可以在请求地址中修改这些参数--> <lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int><!--显示数量--> <str name="wt">json</str><!--显示格式--> <str name="df">text</str><!--默认搜索字段--> </lst> </requestHandler> 复制代码
solr 界面
Dashboard
仪表盘,显示 solr 实例运行时间、版本、系统资源、jvm等信息。 、
Logging
solr 运行日志信息
Cloud
Cloud即SolrCloud,即Solr云(集群),当使用Solr Cloud模式运行时会显示此菜单.
Core Admin
solrcore 的管理界面,这里可以添加 solrcore 实例。
java properties
solr 在 jvm 运行环境中的属性信息。
Thread Dump
显示 solr server 中当前活跃线程信息,同时也可以跟踪线程运行栈信息。
Core selector
选择一个 solrcore 进行详细操作,如下:
Analysis
通过此界面可以测试索引分析器和搜索分析器的执行情况。 注:solr 中,分析器是绑定在域类型中的。
dataimport
可以定义数据导入处理器,从关系数据库导入到 solr 索引库中。默认配置,需要手工配置。
Document
通过 /update 表示更新索引,solr 默认根据 id(唯一约束) 域来更新 document 的内容,如果根据 id 值搜索不到 id 域则会执行添加操作,如果找到则更新。
通过此菜单可以创建索引、更新索引、删除索引等操作,界面如下:
- overwrite="true" : solr在做索引的时候,如果文档已经存在,就用xml中的文档进行替换
- commitWithin="1000" : solr 在做索引的时候,每个1000(1秒)毫秒,做一次文档提交。为了方便测试也可以在Document中立即提交,后添加“”
Query
通过/select执行搜索索引,必须指定“q”查询条件方可搜索。
多 solrcore 配置
配置多solrcore的好处: 1、在进行 solrcloud 的时候,必须配置多solrcore 2、每个 solrcore 之间是独立的,都可以单独对外提供服务。不同的业务模块可以使用不同的solrcore 来提供搜索和索引服务。
添加
- 第一步:复制 solrhome 下的 collection1 目录到本目录下,修改名称为 collection2
- 修改 solrcore 目录下的 core.properties 这样多 solrcore 就配置完成了。
Solr 基本使用
schema.xml
在 schema.xml 文件中,主要配置了 solrcore 的一些数据信息,包括 Field 和 FieldType 的定义等信息,在 solr 中,Field 和 FieldType 都需要先定义后使用。
Field
定义Field域
Name:指定域的名称 Type:指定域的类型 Indexed:是否索引 Stored:是否存储 Required:是否必须 multiValued:是否多值,比如商品信息中,一个商品有多张图片,一个Field像存储多个值的话,必须将multiValued设置为true。
dynamicField
动态域
Name:指定动态域的命名规则
uniqueKey
指定唯一键
id
其中的id是在Field标签中已经定义好的域名,而且该域要设置为required为true。
一个schema.xml文件中必须有且仅有一个唯一键
copyField
复制域
Source:要复制的源域的域名 Dest:目标域的域名
由dest指的的目标域,必须设置multiValued为true。
FieldType
定义域的类型
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <!-- in this example, we will only use synonyms at query time <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> --> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> 复制代码
Name:指定域类型的名称 Class:指定该域类型对应的solr的类型 Analyzer:指定分析器 Type:index、query,分别指定搜索和索引时的分析器 Tokenizer:指定分词器 Filter:指定过滤器
中文分词器
使用ikanalyzer进行中文分词
-
第一步:将ikanalyzer的jar包拷贝到以下目录
-
第二步:将ikanalyzer的扩展词库的配置文件拷贝到 目录
-
配置 FieldType
-
配置使用中文分词的 field
-
重启 tomcat
配置业务 Field
需求
对京东案例中的 products 表的数据进行索引,所以需要定义对应的 field 域。
分析配置
需要往索引库添加的字段有: pid、name、catalog、catalog_name、price、description、picture
FieldType: 经分析,由于中文分词器已经配置完FieldType,所以目前FieldType已经满足需要,无需配置。
Field: Pid: 由于pid在products表中是唯一键,而且在solr的shema.xml中已有一个id的唯一键配置,所以不需要再重新定义pid域。
Name:
<!-- 商品名称 --> <field name="product_name" type="text_ik" indexed="true" stored="true"/> 复制代码
Catalog、catalog_name:
<!-- 商品分类ID --> <field name="product_catalog" type="string" indexed="true" stored="true"/> <!-- 商品分类名称 --> <field name="product_catalog_name" type="string" indexed="true" stored="false"/> 复制代码
Price:
<!-- 商品价格 --> <field name="product_price" type="float" indexed="true" stored="true"/> 复制代码
Description:
<!-- 商品描述 --> <field name="product_description" type="text_ik" indexed="true" stored="false"/> 复制代码
Picture:
<!-- 商品图片地址 --> <field name="product_picture" type="string" indexed="false" stored="true"/> 复制代码
<!-- 目标域 --> <field name="product_keywords" type="text_ik" indexed="true" stored="true" multiValued="true"/> <!-- 将商品名称添加到目标域 --> <copyField source="product_name" dest="product_keywords"/> <!-- 将商品描述添加到目标域 --> <copyField source="product_description" dest="product_keywords"/> 复制代码
Dataimport
该插件可以将数据库中指定的 sql 语句的结果导入到solr索引库中。
-
第一步:添加 jar 包 Dataimport的jar包(solr-4.10.3\dist\solr-dataimporthandler-extras-4.10.3.jar) 复制到
修改 solrconfig.xml 文件,添加 lib 标签<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar" />
mysql 数据库驱动包 复制 mysql 驱动包到:
修改solrconfig.xml文件,添加lib标签<lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*\.jar" />
-
第二步:配置 requesthandler 在 solrconfig.xml 中,添加一个 dataimport 的 requestHandler
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler> 复制代码
- 第三步:创建 data-config.xml 在 solrconfig.xml 同级目录下,创建 data-config.xml ![](http://pbzzkhjh1.bkt.clouddn.com/1c648865-30cb-4dbe-9133-525692211bf4.jpg) ```xml <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/taotao" user="root" password="root"/> <document> <entity name="products" query="select pid,name,catalog,catalog_name,price,description,picture from products "> <field column="pid" name="id" /> <field column="name" name="product_name" /> <field column="catalog" name="product_catalog" /> <field column="catalog_name" name="product_catalog_name" /> <field column="price" name="product_price" /> <field column="description" name="product_description" /> <field column="picture" name="product_picture" /> </entity> </document> </dataConfig> 复制代码
- 第四步:重启 tomcat
solrj 的使用
什么是 solrj
solrj 就是 solr 服务器的 java 客户端
环境准备
jdk ide tomcat solrj
搭建工程
-
solrj 的依赖包和核心包
-
solrj 的扩展服务包
使用 solrj 完成索引维护
添加/修改索引
在solr中,索引库中都会存在一个唯一键,如果一个Document的id存在,则执行修改操作,如果不存在,则执行添加操作。
@Test public void insertAndUpdateIndex() throws Exception { // 创建HttpSolrServer HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr"); // 创建Document对象 SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", "c001"); doc.addField("name", "solr test111"); // 将Document对象添加到索引库 server.add(doc); // 提交 server.commit(); } 复制代码
删除索引
根据指定 id 来删除
根据条件来删除
@Test public void deleteIndex() throws Exception { // 创建HttpSolrServer HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr"); // 根据指定的ID删除索引 // server.deleteById("c001"); // 根据条件删除 server.deleteByQuery("id:c001"); // 删除全部(慎用) server.deleteByQuery("*:*"); // 提交 server.commit(); } 复制代码
查询索引
简单查询
@Test public void search01() throws Exception { // 创建HttpSolrServer HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr"); // 创建SolrQuery对象 SolrQuery query = new SolrQuery(); // 输入查询条件 query.setQuery("product_name:小黄人"); // 执行查询并返回结果 QueryResponse response = server.query(query); // 获取匹配的所有结果 SolrDocumentList list = response.getResults(); // 匹配结果总数 long count = list.getNumFound(); System.out.println("匹配结果总数:" + count); for (SolrDocument doc : list) { 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")); System.out.println("====================="); } } 复制代码
复杂查询
solr的查询语法
1.q - 查询关键字,必须的,如果查询所有使用 *:*
。 请求的q是字符串
2.fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:: 请求fq是一个数组(多个值)
过滤查询价格从1到20的记录。 也可以在“q”查询条件中使用product_price:[1 TO 20],如下:
也可以使用“*”表示无限,例如: 20以上:product_price:[20 TO ] 20以下:product_price:[TO 20]
3.sort - 排序,格式:sort=+<desc|asc>[,+<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,设置格式前缀和后缀。
代码
@Test public void search02() throws Exception { // 创建HttpSolrServer HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr"); // 创建SolrQuery对象 SolrQuery query = new SolrQuery(); // 输入查询条件 query.setQuery("product_name:小黄人"); // query.set("q", "product_name:小黄人"); // 设置过滤条件 // 如果设置多个过滤条件的话,需要使用query.addFilterQuery(fq) query.setFilterQueries("product_price:[1 TO 10]"); // 设置排序 query.setSort("product_price", ORDER.asc); // 设置分页信息(使用默认的) query.setStart(0); query.setRows(10); // 设置显示的Field的域集合 query.setFields("id,product_name,product_catalog,product_price,product_picture"); // 设置默认域 query.set("df", "product_keywords"); // 设置高亮信息 query.setHighlight(true); query.addHighlightField("product_name"); query.setHighlightSimplePre("<em>"); query.setHighlightSimplePost("</em>"); // 执行查询并返回结果 QueryResponse response = server.query(query); // 获取匹配的所有结果 SolrDocumentList list = response.getResults(); // 匹配结果总数 long count = list.getNumFound(); System.out.println("匹配结果总数:" + count); // 获取高亮显示信息 Map<String, Map<String, List<String>>> highlighting = response .getHighlighting(); for (SolrDocument doc : list) { System.out.println(doc.get("id")); List<String> list2 = highlighting.get(doc.get("id")).get( "product_name"); if (list2 != null) System.out.println("高亮显示的商品名称:" + list2.get(0)); else { 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")); System.out.println("====================="); } } 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- TiDB入门(四):从入门到“跑路”
- MyBatis从入门到精通(一):MyBatis入门
- MyBatis从入门到精通(一):MyBatis入门
- Docker入门(一)用hello world入门docker
- 赵童鞋带你入门PHP(六) ThinkPHP框架入门
- 初学者入门 Golang 的学习型项目,go入门项目
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
断点:互联网进化启示录
[美]杰夫·斯蒂贝尔 / 师蓉 / 中国人民大学出版社有限公司 / 2014-11-1 / CNY 49.00
一部神经学、生物学与互联网技术大融合的互联网进化史诗巨著。 我们正置身网络革命中。互联网的每一丝变化都与你我息息相关。当科技变得无处不在时,它就会改变你我。在《断点》一书中,大脑科学家和企业家杰夫·斯蒂贝尔将带领读者来到大脑、生物与技术的交汇处,向读者展示生物学和神经学是如何与互联网技术发生联系的;我们是如何通过生物学上的前车之鉴,来预测互联网的发展的;互联网在经历增长、断点和平衡后又会发生......一起来看看 《断点:互联网进化启示录》 这本书的介绍吧!