java实现solr全文检索_Solr全文检索引擎配置及使用方法

介绍

Solr是一款开源的全文检索引擎,基于lucene。拥有完善的可配置功能界面。具有丰富的查询语言,可扩展,可优化。

下载安装

进入solr官网下载包(这里我使用的版本是8.0)

启动Solr

命令行进入solr的bin目录,提示Started Solr server on port 8983. Happy searching!即成功启动服务。

常用命令

solr start -p 端口号  启动服务

solr restart -p 端口号 重启服务

solr stop -p 端口号  关闭服务

solr create -c name  创建一个core实例

dfe7f9ece4857c088e08249cd7f032ae.png

创建Core实例

Solr所有操作在Core中进行,所以使用Solr之前需先创建Core实例,Solr服务可创建多个Core实例。

两种方式创建Core实例,创建Core实例将在solr目录下server/solr生成对应目录。

通过命令创建

f280cff9c341c705ed7d5d4bc954a139.png

AdminUI创建

c908c5e9c22c90d07d30467993561945.png

配置Schema

Schema配置将告诉solr服务如何建立索引,它的配置围绕core目录下conf/managed-schema文件,该文件指定每个字段类型,分词方式。

可通过手动编辑或者使用schemaAPI进行配置(推荐使用schemaAPI,可不需要重新加载Core或重启Solr服务,方便维护),不推荐使用手动编辑的方式(可能造成数据丢失)。

配置中文分词器

Solr虽然自带的中文分词器,但不能自定义中文词库,扩展性较差。这里我们使用IK分词器,这是一个第三方的分词器,可以很好的扩展中文词库。

可在AdminUI中Analysis中测试分词效果

DIH导入索引数据

DIH全称是Data Import Handler 数据导入处理器,作用是将数据导入到Solr中,而数据存储在xml,pdf或关系型数据库中。solr首先需要获取这些数据,然后在数据中建立索引达到快速搜索的目的。

1.在core/conf/solrconfig.xml文件中配置数据导入文件映射位置

db-data-config.xml

7bcf067c99586e499da7b33096f73aa6.png

2.copy一份导入数据示例文件到core/conf/目录中,并重命名为db-data-config.xml

ba0ac193ec670b2f042a1378db5d06be.png

3.修改db-data-config.xml配置

4.执行DIH数据导入命令(AdminUI)

22404ed01371ada2c4376520ae8a2a4d.png

5.测试数据是否成功导入

cd9b6c29ccf4f841dc4bda4b8845d94f.png

Query查询参数说明

q  查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,

fl  指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort

start  返回结果的第几条记录开始,一般分页用,默认0开始

rows  指定返回结果最多有多少条记录,默认值为 10,配合start实现分页

sort  排序方式,例如id  desc 表示按照 “id” 降序

wt  (writer type)指定输出格式,有 xml, json, php等

fq  (filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的。

df   默认的查询字段,一般默认指定。

qt  (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。

indent   返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。

version   查询语法的版本,建议不使用它,由服务器指定默认值。

Solr的检索运算符

“:”  指定字段查指定值,如返回所有值*:*

“?”  表示单个任意字符的通配

“*”  表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)

“~”  表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。

AND、||  布尔操作符

OR、&&  布尔操作符

NOT、!、-(排除操作符不能单独与项使用构成查询)

“+”  存在操作符,要求符号”+”后的项必须在文档相应的域中存在²

( )  用于构成子查询

[]  包含范围检索,如检索某时间段记录,包含头尾,date:[201507 TO 201510]

{}  不包含范围检索,如检索某时间段记录,不包含头尾date:{201507 TO 201510}

JAVA连接Solr

maven引入solrj,solrj是java访问Solr的客户端工具包。

org.apache.solr

solr-solrj

8.0.0

SolrUtil.java

packagecom.bret.gis.utils;importorg.apache.solr.client.solrj.SolrQuery;importorg.apache.solr.client.solrj.impl.HttpSolrClient;importorg.apache.solr.client.solrj.response.QueryResponse;importorg.apache.solr.common.SolrDocumentList;public classSolrUtil {//指定solr服务器的地址

private final static String SOLR_URL = "http://localhost:8983/solr/";/*** 创建SolrServer对象

*

* 该对象有两个可以使用,都是线程安全的

* 1、CommonsHttpSolrServer:启动web服务器使用的,通过http请求的

* 2、 EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了

* 3、solr 4.0之后好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为HttpSolrClient

*

*@return

*/

publicHttpSolrClient createSolrServer(){

HttpSolrClient solr= null;

solr= new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();returnsolr;

}/*** 查询

*@throwsException*/

public SolrDocumentList querySolr(String q,int start,int rows) throwsException{

HttpSolrClient solrServer= new HttpSolrClient.Builder(SOLR_URL + "tianjing/").withConnectionTimeout(10000).withSocketTimeout(60000).build();

SolrQuery query= newSolrQuery();//下面设置solr查询参数//query.set("q", "*:*");//参数q 查询所有

query.set("q",q);//相关查询,比如某条数据某个字段含有周、星、驰三个字 将会查询出来 ,这个作用适用于联想查询//参数fq, 给query增加过滤查询条件

query.addFilterQuery("id:[0 TO 9]");//id为0-4//给query增加布尔过滤条件//query.addFilterQuery("description:演员");//description字段中含有“演员”两字的数据//参数df,给query设置默认搜索域

query.set("df", "name");//参数sort,设置返回结果的排序规则

query.setSort("id",SolrQuery.ORDER.desc);//设置分页参数

query.setStart(start);

query.setRows(rows);//每一页多少值//参数hl,设置高亮

query.setHighlight(true);//设置高亮的字段

query.addHighlightField("name");//设置高亮的样式

query.setHighlightSimplePre("");

query.setHighlightSimplePost("");//获取查询结果

QueryResponse response =solrServer.query(query);//两种结果获取:得到文档集合或者实体对象//查询得到文档的集合

SolrDocumentList solrDocumentList =response.getResults();

System.out.println("通过文档集合获取查询的结果");

System.out.println("查询结果的总数量:" +solrDocumentList.getNumFound());//遍历列表

/*for (SolrDocument doc : solrDocumentList) {

System.out.println("id:"+doc.get("id")+" name:"+doc.get("name")+" description:"+doc.get("description"));

}*/

//得到实体对象

/*List tmpLists = response.getBeans(Person.class);

if(tmpLists!=null && tmpLists.size()>0){

System.out.println("通过文档集合获取查询的结果");

for(Person per:tmpLists){

System.out.println("id:"+per.getId()+" name:"+per.getName()+" description:"+per.getDescription());

}

}*/

returnsolrDocumentList;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值