ITKeyword,专注技术干货聚合推荐

注册 | 登录

使用SolrJ管理索引库

qq_28334711 分享于 2016-07-29

推荐:如何处理PB级别数据(2)——Apache Solr 之 使用SolrJ操作索引库

 Solrj是Solr搜索服务器的一个比较基础的客户端工具,可以非常方便地与Solr搜索服务器进行交互。最基本的功能就是管理Solr索引,包括添加、更新、删除和查询等。

使用SolrJ管理索引库

一、SolrJ介绍

solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:

这里写图片描述
依赖的jar包 solr-4.10.3\dist\
这里写图片描述

二、SolrJ与Java项目整合

2.1 导入相应的jar包

导入SolrJ需要的jar包
还需要导入solr-4.10.3\example\lib\ext

这里写图片描述

2.3 删除索引操作

步骤:
1、创建与Solr连接,获取SolrServer对象
2、创建文档对象 SolrInputDocument
3、文档对象中添加相应的域
4、将文档对象添加到索引库
5、提交
示例代码

//向索引库中添加索引
@Test
public void addDocument() throws Exception {
    //和solr服务器创建连接
    //参数:solr服务器的地址
    SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    //创建一个文档对象
    SolrInputDocument document = new SolrInputDocument();
    //向文档中添加域
    //第一个参数:域的名称,域的名称必须是在schema.xml中定义的
    //第二个参数:域的值
    document.addField("id", "c0001");
    document.addField("title_ik", "使用solrJ添加的文档");
    document.addField("content_ik", "文档的内容");
    document.addField("product_name", "商品名称");
    //把document对象添加到索引库中
    solrServer.add(document);
    //提交修改
    solrServer.commit();

}

2.3 根据id删除索引操作

步骤:
1、与Solr连接获取SolrServer对象
2、根据id进行删除、
3、提交
示例代码:

@Test
public void deleteById() throws SolrServerException, IOException{
    SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/");
    solrServer.deleteById("c001");

    solrServer.commit();
}

2.4 根据条件删除索引操作

步骤:
1、与Solr连接获取SolrServer对象
2、根据条件进行删除、
3、提交
示例代码:

推荐:【对象管理】管理索引

       索引的创建的目的在于更快捷地查找定位数据行和数据块,提高数据库语句的查找速度,提高性能。oracle 为我们提供的索引基本上都是以B+树的这种数据结构为

查询语法完全支持Lucene的查询语法。
//根据查询条件删除文档
@Test
public void deleteDocumentByQuery() throws Exception {
    //创建连接
    SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    //根据查询条件删除文档
    solrServer.deleteByQuery("id:c001");
    //提交修改
    solrServer.commit();
}

2.5 修改索引操作

在solrJ中修改没有对应的update方法,只有add方法,只需要添加一条新的文档,和被修改的文档id一致就,可以修改了。本质上就是先删除后添加。

2.6 简单查询索引操作

步骤:
1、与Solr连接获取SolrServer对象
2、创建查询条件SolrQury对象
3、设置查询条件
4、设置查询结果个数,默认为10
5、执行查询获取QueryResponse对象
6、获取查询结果SolrDocumentList
7、遍历查询结果

@Test
public void baseQuery() throws SolrServerException{
    SolrServer solrServer = new HttpSolrServer(url);
    //创建查询条件
    SolrQuery query = new SolrQuery();
    //设置查询条件
    query.setQuery("*:*");
    //设置查询结果的个数
    query.setRows(20);
    //执行查询,获取查询相应
    QueryResponse response = solrServer.query(query);
    //获取查询结果 里面封装了SolrDocument对象
    SolrDocumentList solrDocumentList = response.getResults();
    System.out.println("查询到的商品数量是:"+solrDocumentList.getNumFound());
    for (SolrDocument doc : solrDocumentList) {
        System.out.println("-------------");
        System.out.println(doc.get("id"));
        System.out.println(doc.get("product_name"));
        System.out.println(doc.get("product_price"));
    }
}

2.7 复杂查询索引操作

需求:查询条件、过滤条件、分页、关键词高亮、排序
API介绍:
1、查询对象
SolrQuery query = new SolrQuery();
2、设置查询条件
query.setQuery(“product_name:花儿”);
3、设置默认搜索域
query.set(“df”,”product_keywords”);
4、设置排序
query.addSort(“product_price”, ORDER.desc);
ORDER.desc降序 ORDER.asc升序
5、设置过滤条件
两种方式
query.addFilterQuery(“域名”,”条件”);
query.setFilterQueries(“域名:条件”,”域名:条件”…);
6、设置分页
query.setStart(0);设置开始 (page-1)*pageSize
query.setRows(10);设置查询的个数
7、处理高亮
开启高亮
query.setHighlight(true);
设置高亮域
query.addHighlightField(“product_name”);
高亮显示的前缀
query.setHighlightSimplePre(““);
高亮显示的后缀
query.setHighlightSimplePost(““);
获取高亮结果 第一个map的key为id值,value: 第二个map key为域名 value 为数据
Map

SolrServer solrServer = new HttpSolrServer(url);
    SolrQuery query = new SolrQuery();
    //设置查询条件 
    query.setQuery("product_name:花儿");
    //设置过滤  
    query.setFilterQueries("product_catalog_name:与钟不同");
    //设置排序
    query.addSort("product_price", ORDER.desc);
    //设置默认搜索域
    query.set("df","product_keywords");
    //处理分页
    //设置开始页
    query.setStart(0);
    query.setRows(10);
    //设置每页显示的个数
    //设置显示的域
    //query.setFields("id","product_name");

    //设置高亮
    //开启高亮
    query.setHighlight(true);
    //设置高亮显示的域
    query.addHighlightField("product_name");
    //设置高亮的前缀
    query.setHighlightSimplePre("<span style=\"color:red\">");
    //设置高亮的后缀 
    query.setHighlightSimplePost("</span>");
    //执行查询
    QueryResponse response = solrServer.query(query);
    SolrDocumentList solrDocumentList = response.getResults();
    //获取高亮结果 第一个mao的key为id值,value map为域名加数据
    Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
    for (SolrDocument doc : solrDocumentList) {
        System.out.println("-------------");
        System.out.println(doc.get("id"));
        System.out.println("普通名称:"+doc.get("product_name"));
        System.out.println("高亮显示 :"+highlighting.get(doc.get("id")).get("product_name").get(0));
        System.out.println(doc.get("product_price"));
    }


}

三、web项目实现Solr

3.1 系统架构

这里写图片描述

3.2 编写查询类 QueryVo

public class QueryVo {
    private String queryString;
    private String catalog_name; 
    private String price;
    private Integer sort;
    public String getQueryString() {
        return queryString;
    }
    public void setQueryString(String queryString) {
        this.queryString = queryString;
    }
    public String getCatalog_name() {
        return catalog_name;
    }
    public void setCatalog_name(String catalog_name) {
        this.catalog_name = catalog_name;
    }

    public Integer getSort() {
        return sort;
    }
    public void setSort(Integer sort) {
        this.sort = sort;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
}

3.3 使用springmvc框架,spingmvc的配置略

springmvc.xml中配置SolrServer

<!-- 配置SolrServer对象 -->
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
    <!-- 使用构造函数注值 -->
    <constructor-arg index="0" value="http://localhost:8080/solr/"></constructor-arg>
</bean>

3.4 SolrDaoImpl实现类的编写

package cn.lx.jd.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import cn.lx.jd.dao.SolrDao;
import cn.lx.jd.vo.Product;
import cn.lx.jd.vo.QueryVo;
@Repository
public class SolrDaoImpl  implements SolrDao{
    @Autowired
    private SolrServer solrServer;
    /** * 根据条件查询商品 * @throws SolrServerException * */
    @Override
    public List<Product> findProductByCondition(QueryVo vo) throws SolrServerException {
        SolrQuery query = new SolrQuery();
        //设置默认搜索域
        //query.set("df", "product_keywords");
        if(vo.getQueryString() != null && !"".equals(vo.getQueryString().trim())){
            query.setQuery("product_name:"+vo.getQueryString());
        }else{
            query.setQuery("product_name.*");
        }
        //设置过滤查询
        if(vo.getCatalog_name() !=null && !"".equals(vo.getCatalog_name())){
            query.addFilterQuery("product_catalog_name:"+vo.getCatalog_name());
        }
        //设置排序 0价格升序,1价格降序
        if(vo.getSort() != null){
            if(0 == vo.getSort()){
                query.addSort("product_price", ORDER.asc);
            }else if(1 == vo.getSort()){
                query.addSort("product_price", ORDER.desc);
            }
        }
        //处理查询价格 过滤条件
        if(vo.getPrice() != null ){
            String[]  price = vo.getPrice().split("-");
            if(price.length>1){
                query.addFilterQuery("product_price:["+price[0]+" TO "+price[1]+"]");
            }

        }
        //开启高亮
        query.setHighlight(true);
        //设置高亮域
        query.addHighlightField("product_name");
        //设置高亮前代码
        query.setHighlightSimplePre("<span style=\"color:red\">");
        //后置代码
        query.setHighlightSimplePost("</span>");
        //执行查询
        QueryResponse response = solrServer.query(query);
        //获取查询结果
        SolrDocumentList solrDocumentList = response.getResults();
        List<Product> list = new ArrayList<Product>();
        if(solrDocumentList.size()>0){
            //获取高亮结果
            Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

            //处理查询结果
            for (SolrDocument doc : solrDocumentList) {
                Product p  = new Product();
                //进行 赋值
                p.setPid((String)doc.get("id"));
                p.setCatalog_name((String)doc.get("product_catalog_name"));
                p.setPrice((float)doc.get("product_price"));
                p.setPicture((String)doc.get("product_picture"));
                String name = highlighting.get(doc.get("id")).get("product_name").get(0);
                p.setName(name);

                list.add(p);
            }

        }

        return list;
    }

}

推荐:全文索引----solr客户端工具solrJ

      上一篇博客中,我们使用solr的桌面客户端工具展示返回的数据,如果我们需要在程序中使用这些返回值的话,就需要另外的一个工具了----solrJ。 一 solrJ介绍

使用SolrJ管理索引库 一、SolrJ介绍 solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图: 依赖的jar包 solr

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。