全文检索技术—Solr

前言:
solr是一个现成的全文检索引擎系统, 放入tomcat下可以独立运行, 对外通过http协议提供全文检索服务(就是对索引和文档的增删改查服务),企业中可以通过solrJ(solr的客户端的jar包)来调用solr服务。
全文检索技术—Solr_第1张图片

Solr与Lucene的区别:
lucene是一个全文检索引擎工具包, 就是一堆jar包, 它放入tomcat下不能独立运行, 但是我们可以使用lucene来构建全文检索引擎系统;
solr底层是用lucene来开发的一个全文检索引擎系统, 放入tomcat下就可以独立运行, 对外通过http的形式,提供全文检索服务(索引和文档的增删改查服务).

一、Solr安装及配置:
Solr官方网站(http://lucene.apache.org/solr/ )下载Solr4.10.3,Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。

整合步骤
全文检索技术—Solr_第2张图片
全文检索技术—Solr_第3张图片
全文检索技术—Solr_第4张图片
Solr域的类型:

    基本类型:string, long, double等等
    动态域(dynamicField): 因为域要先定义后使用,对于没有定义的域,使用是会报错的, 所以可以使用动态域模糊匹配域名.
    主键域(uniquekey): 主键域只有一个, 唯一
    复制域(copyField): 将多个域中的内容复制到目标域, 从目标域中查询就相当于从多个域中进行查询

集成IK中文分词器:
全文检索技术—Solr_第5张图片
schema.xml设置Field
全文检索技术—Solr_第6张图片
数据导入到solr

1、把dataimport插件依赖的jar包添加到solrcore(solrHome\collection1\lib)中
全文检索技术—Solr_第7张图片
2、配置solrconfig.mxl文件,添加一个requestHandler。
全文检索技术—Solr_第8张图片
3、创建一个data-config.xml,保存到collection1\conf\目录下
全文检索技术—Solr_第9张图片
4、重启tomcat
全文检索技术—Solr_第10张图片

二、使用Solr管理索引库

1、solr中索引和文档的增加和删除

首先根据id来查询,如果在现有的文档库和索引库中查不到则,将这条数据添加进索引库和文档库;若根据id查找到了,则把查找到的删除, 然后将新的数据添加到索引库和文档库。

2、删除索引格式如下:
全文检索技术—Solr_第11张图片
全文检索技术—Solr_第12张图片

三、使用SolrJ管理索引库

SolrJ是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务.
全文检索技术—Solr_第13张图片
使用步骤:
全文检索技术—Solr_第14张图片
代码实现

增删改

public class IndexManagerTest {

      //solr中没有专门的修改方法, 先是根据id查询,查找到了则先边原来的删掉,再将新的增加, 如果没查询到,则直接增加新的
      @Test
      public void testIndexCreate() throws Exception{
         //指定solr默认服务的url, 如果想连接其他实例可以   http://localhost:8080/solr/collection2
       SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
       //创建solr文档对象, 域一定要先定义后使用,在solr服务端中的schema.xml中定义
       //一定要有id域
       SolrInputDocument doc = new SolrInputDocument();
       doc.addField("id", "a001");
       doc.addField("title_ik", "国人");
       doc.addField("content_ik", "我是中国人");
       solrServer.add(doc);
       //提交
       solrServer.commit();
   }

   @Test
   public void testDelIndex() throws Exception{
       //连接默认实例, collection1
       SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
       //根据id删除
       //solrServer.deleteById("a001");
       //删除所有
       solrServer.deleteByQuery("*:*");
       //提交
       solrServer.commit();
   }

}

public class IndexSearchTest {

    @Test
    public void testIndexSearchSample() throws Exception{
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");

        //创建查询条件对象
        SolrQuery solrQuery = new SolrQuery();
        //查询所有
        solrQuery.setQuery("*:*");

        //查询并返回响应
        QueryResponse queryResponse = solrServer.query(solrQuery);
        //从响应中获取查询结果集
        SolrDocumentList results = queryResponse.getResults();

        //查询到的数据的总数
        System.out.println("=====count=====" + results.getNumFound());

        //遍历结果集
        for(SolrDocument doc : results){
            //根据域名取出数据
            System.out.println(doc.get("id"));
            System.out.println(doc.get("product_name"));
            System.out.println(doc.get("product_price"));
            System.out.println(doc.get("product_picture"));
            System.out.println("=========================");
        }
    }

      @Test
      public void testIndexSearch() throws Exception{
          SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");

          //创建查询条件对象
          SolrQuery solrQuery = new SolrQuery();
          //设置查询条件
          solrQuery.setQuery("台灯");
          //设置过滤条件
          solrQuery.addFilterQuery("product_price:[1 TO 100]");
          //设置按照价格排序, 这里是升序
          solrQuery.setSort("product_price", ORDER.asc);

          //设置分页
          //从第几条开始查询
          solrQuery.setStart(0);
          //查询多少条
          solrQuery.setRows(10);

          //设置查询到后显示哪些域
            solrQuery.addField("id,product_name,product_price,product_catalog_name,product_picture");

          //设置默认搜索域, df代表默认搜索域, 后面的是域名
          solrQuery.set("df", "product_keywords");

          //设置高亮显示: 高亮默认是关闭的, 需要开启
          solrQuery.setHighlight(true);
          //设置需要高亮显示的域名
          solrQuery.addHighlightField("product_name");
          //设置高亮前缀
          solrQuery.setHighlightSimplePre("");
          //设置高亮后缀
          solrQuery.setHighlightSimplePost("");


          //查询并返回响应
          QueryResponse queryResponse = solrServer.query(solrQuery);
          //从响应中获取查询结果集
          SolrDocumentList results = queryResponse.getResults();

          //查询到的数据的总数
          System.out.println("=====count=====" + results.getNumFound());

          //遍历结果集
          for(SolrDocument doc : results){
              //根据域名取出数据
              System.out.println(doc.get("id"));

              //获取高亮显示结果
              Map>> highlighting = queryResponse.getHighlighting();
              if(highlighting != null){
                  List list = highlighting.get(doc.get("id")).get("product_name");
                  if(list != null && list.size() > 0){
                      System.out.println("==hlighting==" + list.get(0));
                  }
              }


              System.out.println(doc.get("product_name"));
              System.out.println(doc.get("product_price"));
              System.out.println(doc.get("product_picture"));
              System.out.println("===================");
          }
      }

}

四、案例实现
1、流程图
全文检索技术—Solr_第15张图片
2、创建一个web工程导入jar包(springmvc的相关jar包+solrJ的jar包+Example\lib\ext下的jar包)
3、配置SpringMvc.xml




            
            

            
            

            
            
                
                
            

            
            
                
            

    

4、配置Web.xml



      solrjd0608
      
        index.html
        index.htm
        index.jsp
        default.html
        default.htm
        default.jsp
      

      
        
            springmvc
            org.springframework.web.servlet.DispatcherServlet
            
                contextConfigLocation
                classpath:SpringMvc.xml
            
            1
        
        
            springmvc
            *.action
        

      
      
            CharacterEncodingFilter
            org.springframework.web.filter.CharacterEncodingFilter
            
                encoding
                utf-8
            
        
        
            CharacterEncodingFilter
            /*
        
    

5、实体类
全文检索技术—Solr_第16张图片
全文检索技术—Solr_第17张图片
5、Controller
全文检索技术—Solr_第18张图片
6、Service

@Service
public class ProductServiceImpl implements ProductService {
    //设置每页显示条数
    private final static Integer PAGE_SIZE = 60;

    @Autowired
    private ProductDao productDao;

    @Override
    public ResultModel querySolr(String queryString, String catalog_name, 
            String price, Integer page, String sort) throws Exception{

        //创建查询条件对象
        SolrQuery solrQuery = new SolrQuery();

        //设置默认搜索域
        solrQuery.set("df", "product_keywords");

        //设置查询条件
        if(queryString != null && !"".equals(queryString)){
            solrQuery.setQuery(queryString);
        } else {
            solrQuery.setQuery("*:*");
        }

        //设置过滤条件按照分类查询
        if(catalog_name != null && !"".equals(catalog_name)){
            solrQuery.addFilterQuery("product_catalog_name:" + catalog_name);
        }

        //设置过滤条件  按照价格区间进行查询
        if(price != null && !"".equals(price)){
            String[] split = price.split("-");
            if(split != null && split.length > 1){
                solrQuery.addFilterQuery("product_price:["+split[0]+" TO "+split[1]+"]");
            }
        }

        //按照价格进行排序
        if("0".equals(sort)){
            solrQuery.setSort("product_price", ORDER.asc);
        } else {
            solrQuery.setSort("product_price", ORDER.desc);
        }

        //设置起始页
        if(page == null){
            page = 1;
        }

        //设置从第几条开始查
        Integer start = (page - 1) * PAGE_SIZE;
        solrQuery.setStart(start);
        //设置每页显示条数
        solrQuery.setRows(PAGE_SIZE);

        //设置高亮显示
        //开启高亮显示
        solrQuery.setHighlight(true);
        //设置高亮显示的域
        solrQuery.addHighlightField("product_name");
        //设置高亮显示前缀
        solrQuery.setHighlightSimplePre("");
        //设置高亮显示后缀
        solrQuery.setHighlightSimplePost("");

        //调用dao查询,并返回结果
        ResultModel resultModel = productDao.query(solrQuery);
        //设置当前页
        resultModel.setCurPage(page);

        //计算总页数
        Long pageCount = resultModel.getRecordCount() / PAGE_SIZE;
        if(resultModel.getRecordCount() % PAGE_SIZE > 0){
            pageCount++;
        }
        resultModel.setPageCount(pageCount);
        return resultModel;
    }
}    

7、Dao

 @Repository
 public class ProductDaoImpl implements ProductDao {
        @Autowired
        private SolrServer solrServer;

        @Override
        public ResultModel query(SolrQuery solrQuery) throws Exception {
            //通过solr服务端查询,并返回响应
            QueryResponse queryResponse = solrServer.query(solrQuery);

            //返回的数据对象
            ResultModel resultModel = new ResultModel();
            List productList = new ArrayList();

            //从响应中获取结果集
            SolrDocumentList results = queryResponse.getResults();
            if(results != null){
                //获取查询到的总记录数
                resultModel.setRecordCount(results.getNumFound());
                //遍历结果集
                for(SolrDocument doc : results){
                    ProductModel product = new ProductModel();
                    product.setPid(String.valueOf(doc.get("id")));

                    //获取高亮数据
                    Map>> highlighting = queryResponse.getHighlighting();
                    if(highlighting != null){
                        List list = highlighting.get(doc.get("id")).get("product_name");
                        if(list != null && list.size() > 0){
                            product.setName(list.get(0));
                        } else {
                            product.setName(String.valueOf(doc.get("product_name")));
                        }
                    } else {
                        product.setName(String.valueOf(doc.get("product_name")));
                    }


                    if(doc.get("product_price") != null && !"".equals(doc.get("product_price"))){
                        product.setPrice(Float.valueOf(String.valueOf(doc.get("product_price"))));
                    }

                    product.setCatalog_name(String.valueOf(doc.get("product_catalog_name")));
                    product.setPicture(String.valueOf(doc.get("product_picture")));

                    //将单个的ProductModel对象放入集合中
                    productList.add(product);
                }
                //将封装后的结果集放入返回对象中
                resultModel.setProductList(productList);
            }
            return resultModel;
        }

    }

你可能感兴趣的:(java增强)