文档章节

Solr环境搭建及IK分词的集成及solrJ的调用(三)【完结】

zimingforever
 zimingforever
发布于 2013/04/10 22:05
字数 1471
阅读 3425
收藏 18

前两篇的连接到这里:

Solr环境搭建及IK分词的集成及solrJ的调用(一) http://my.oschina.net/zimingforever/blog/120732

Solr环境搭建及IK分词的集成及solrJ的调用(二) http://my.oschina.net/zimingforever/blog/120928

第一篇讲了如何搭建solr环境,第二篇讲了如何在solr中加入IK的分词。本篇主要介绍如何使用solrJ,solrJ是java客户端调用的api

首先在pom中引入solrJ

<dependency>
   <groupId>org.apache.solr</groupId>
   <artifactId>solr-solrj</artifactId>
   <version>3.6.0</version>
</dependency>
<dependency>
   <groupId>org.apache.solr</groupId>
   <artifactId>solr-core</artifactId>
   <version>3.6.0</version>
</dependency>

接着是solrJ的一些主要用法:

A如何获取一个solrServer并清空里面的索引

public static SolrServer getSolrServer() throws IOException, SolrServerException {
        //连接到solr
        String solrServerUrl = "http://localhost:8084/solr";
        SolrServer solrServer = new CommonsHttpSolrServer(solrServerUrl);
        // 清空之前建立的索引数据 
        solrServer.deleteByQuery("*:*");
        return solrServer;
}
B 建立索引,这里使用的是solrDocument类
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField( "id", "id1", 1.0f );
doc1.addField( "name", "doc1", 1.0f );
doc1.addField( "price", 10 );

SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField( "id", "id2", 1.0f );
doc2.addField( "name", "doc2", 1.0f );
doc2.addField( "price", 20 );

Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
docs.add( doc1 );
docs.add( doc2 );

server.add( docs );
server.commit();
这里建立两个文档,每个文档有3个field,分别是id,name,price,这里要注意一下,这3个filed其实已经在schemal中配置好了,如果你自己定义了filed一定要在schemal.xml中配置好,这也是稍后为什么使用addbean的时候我自定义的field不起作用的原因。

然后把这两个文档放到一个collection中,然后加入到server中,并做一个commit。

这时候solr中就有内容了。可以访问这个地址试试:http://localhost:8084/solr/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on 会出现索引的内容

C 使用addBean增加索引

上面使用的是solrDocument对象增加的索引,其实还有更方便的方法增加索引,方法如下:

Collection<SeacheIndexDO> solrInputDocs = new ArrayList<SeacheIndexDO>();
for(SpiderResultDescribeDO spiderResultDescribeDO:spiderResultDescribeDOs){
   SpiderResultInforDO spiderResultInforDO= (SpiderResultInforDO) sqlMapClient.queryForObject("hunter.getSpinderInfor", spiderResultDescribeDO);
   String fileType=spiderResultInforDO.getUrlKey();
   String fileFullName= AddressUtils.appendUrl(spiderResultInforDO.getBaseUrl(),spiderResultInforDO.getFileName());
   String fileContent=FileUtils.getFileStringByPath(fileFullName, Commons.DEFAULT_DB_CHARSET);
   SeacheIndexDO solrInputDoc=new SeacheIndexDO();
   //id是唯一标示,url是跳转的连接
   solrInputDoc.setId(spiderResultInforDO.getId());
   solrInputDoc.setHunterUrl(spiderResultInforDO.getUrl());
   solrInputDoc.setHunterTitle(spiderResultInforDO.getTitle());
   if(fileType.equals(SpiderSourceType.DBA_WIKI.getStringValue())){
        solrInputDoc.setHunterContent(fileContent);
   }else {
        System.out.println("不支持的类型");
   }
   solrInputDocs.add(solrInputDoc);
}
//增加文档
solrServer.addBeans(solrInputDocs);
// 提交
solrServer.commit();

这里要注意一下,SearchIndexDo是我自定义的类,它里面的属性solr是不认识的,也不知道如何去做索引,所以这个地方必须要把这些属性字段在schemal中做配置

<!--自定义的分词部分-->
<field name="hunterTitle" type="text" indexed="true" stored="true" />
<field name="hunterAuthor" type="string" indexed="true" stored="true" />
<field name="hunterContent" type="text" indexed="true" stored="true" />
<field name="hunterQuestion" type="text" indexed="true" stored="true" />
<field name="hunterAnswers" type="text" indexed="true" stored="true" />
<field name="hunterCreateTime" type="date" indexed="true" stored="true" />
<field name="hunterUpdateTime" type="date" indexed="true" stored="true" />
<field name="hunterUrl" type="string" indexed="true" stored="true" />
<field name="hunterAll" type="text" indexed="true" stored="false" multiValued="true"/>
这里type中的text是我配置好的用IK来分词的filedType,date和string都是默认的类型,另外hunterAll是一个复合字段,再下面有个copyfiled的配置
<!-- 自定义的copyfiled -->
  <copyField source="hunterContent" dest="hunterAll"/>
  <copyField source="hunterTitle" dest="hunterAll"/>
表示把title和content都集合在一起,一起作为搜索的字段。这样之后就可以在搜索的字段中直接搜索hunterAll字段了。


另外还要注意的一点是在bean中对应schemal的字段要加上@Field的注解

D 如何读取solr的data,上面的列子其实就是一个读取*:*的查询

q=*%3A*&version=2.2&start=0&rows=10&indent=on

这里有几个参数q,start,rows,还有几个常用的参数如下:

//        q - 查询字符串,必须的。
//        fl - 指定返回那些字段内容,用逗号或空格分隔多个。
//        start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
//        rows - 指定返回结果最多有多少条记录,配合start来实现分页。
//        sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。
//        wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
//        fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的

E 查询的代码如下:

SolrServer server= GetSolrServer.getSolrServer();
SolrQuery query = new SolrQuery();
query.setQuery( "*:*" );
query.addSortField( "price", SolrQuery.ORDER.asc );
QueryResponse rsp = server.query( query );
SolrDocumentList docs = rsp.getResults();
最后一步查询出来的solrDocument,另外也可以使用getBeans方法
List<Item> beans = rsp.getBeans(Item.class);
F 另外在项目中我还用到了高亮查询的结果的方法,这个也是之前在使用luncene没有用到的功能,相关的代码如下:
//设置高亮 给hunterConntent及hunterTitle设置高亮,并设置成红色的格式
        solrQuery.setHighlight(true);
        solrQuery.addHighlightField("hunterTitle");
        solrQuery.addHighlightField("hunterContent");
        solrQuery.setHighlightSimplePre("<font color=\"red\">");
        solrQuery.setHighlightSimplePost("</font>");
表示给其中的title和content设置高亮,高亮的格式是使用红色的font

获取高亮的代码如下,它和获取查询结果返回的对象不是一个,还要分别处理,代码上也有些“不干净”

Map<String, Map<String, List<String>>> queryResponseHighlighting =queryResponse.getHighlighting();

G 另外之前提到了在自定义的field中我做了一个hunterAll字段

//设置查询的范围
        solrQuery.set("df",queryFiled);
        //设置查询的字
        solrQuery.setQuery(queryText);
那么在查询的时候我就不用使用类似于*:*的格式了,而表示直接在hunterAll这个字段中去取queryText

H 另外返回查询的状态和时间如下:

//获取status
        int responseStauts=queryResponse.getStatus();
        //获取responseTime
        int responseTime=queryResponse.getQTime();

总结一下:本篇博客主要介绍了solrj的常用使用方法,我基本上使用上面的代码接完成了建立索引和查询。另外结合前两篇的博客基本上可以使用简单的solr了。


© 著作权归作者所有

zimingforever
粉丝 142
博文 266
码字总数 315040
作品 0
杭州
程序员
私信 提问
Solr环境搭建及IK分词的集成及solrJ的调用(二)

看上一篇请移步到这里:http://my.oschina.net/zimingforever/blog/120732 Solr环境搭建及IK分词的集成及solrJ的调用(一) 这里首先介绍如何做分词,首先solr并没有加入中文分词在里面,所以...

王小明123
2013/04/08
3.7K
5
就是当我配置好了IK分词器后,怎么通过JAVA代码查询的时候分词还是按照空格分词?

@艮子明 你好,想跟你请教个问题:就是我在solr中配置好IK分词器后,通过solrj来查询的时候,他还是安装默认空格分词,怎么样才可以按照就跟这种效果分词,一直搜索解决方法都搞不清楚,我已...

繁华-落幕
2014/04/15
557
0
Solr Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)

Apache Solr 介绍 Solr 是什么? Solr 是一个开源的企业级搜索服务器,底层使用易于扩展和修改的Java 来实现。服务器通信使用标准的HTTP 和XML,所以如果使用Solr 了解Java 技术会有用却不是...

David_Tio
2013/12/05
1K
0
JAVAEE——宜立方商城07:Linux上搭建Solr服务、数据库导入索引库、搜索功能的实现

1. 学习计划 1、Solr服务搭建 2、Solrj使用测试 3、把数据库中的数据导入索引库 4、搜索功能的实现 2. Solr服务搭建 2.1. Solr的环境 Solr是java开发。 需要安装jdk。 安装环境Linux。 需要安...

kent鹏
2018/07/26
0
0
Solr JAVA客户端SolrJ 4.9使用示例教程

简介 SolrJ是操作Solr的JAVA客户端,它提供了增加、修改、删除、查询Solr索引的JAVA接口。SolrJ针对Solr提供了Rest 的HTTP接口进行了封装,SolrJ底层是通过使用httpClient中的方法来完成Sol...

cloud-coder
2014/08/21
3.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

Podman 使用指南

> 原文链接:Podman 使用指南 Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker 类似,不同的是 Podman 没有 daemon。以前使用 Docker...

米开朗基杨
46分钟前
5
0
拯救 项目经理个人时间的5个技巧

优秀的项目经理都有一个共同点,那就是良好的时间管理能力。专业的项目经理会确保他们的时间投入富有成效,尽可能避免时间浪费。 时间管理叫做GTD,即Getting Things Done——“把事情做完”...

Airship
今天
6
0
LNMP环境介绍,Mariadb安装,服务管理,mariadb安装3

LNMP环境介绍 Nginx 处理的请求有两种,分为 静态与动态 图片,js,css,视频,音频,flash 等都是静态请求,这些数据都不是保存在数据库里面的 动态请求一般来说,需要的数据是在数据库里面...

doomcat
今天
1
0
前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
7
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部