zoukankan      html  css  js  c++  java
  • solr简单学习---1

    *服务器配置略,比较复杂,看视频

    1.导入jar包

    package cn.itcast.solr;
    
    import org.apache.solr.client.solrj.SolrServer;
    import org.apache.solr.client.solrj.impl.HttpSolrServer;
    import org.apache.solr.common.SolrInputDocument;
    import org.junit.Test;
    
    public class IndexManagerTest {
    
        @Test
        public void testIndexCreate() throws Exception{
            //创建和Solr服务端连接
            SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
            
            //创建solr文档对象
            SolrInputDocument doc = new SolrInputDocument();
            //域要先定义后使用,还有注意必须要有id主键域
            //solr中没有专用的修改方法, 会自动根据id进行查找,如果找到了则删除原来的将新的加入就是修改,如果没找到,将新的直接加入则就是新增
            doc.addField("id", "a001");
            doc.addField("product_name", "台灯1`111");
            doc.addField("product_price", "12.5");
            
            //将文档加入solrServer对象中
            solrServer.add(doc);
            
            //提交
            solrServer.commit();
        }
        
        @Test
        public void testIndexDel() throws Exception{
            //创建和Solr服务端连接
            SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
            
            //根据主键id进行删除
            //solrServer.deleteById("a001");
            
            //根据查询删除,这里是删除所有*:*
            solrServer.deleteByQuery("*:*");
            //提交
            solrServer.commit();
        }
    }
    package cn.itcast.solr;
    
    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.impl.HttpSolrServer;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.SolrDocument;
    import org.apache.solr.common.SolrDocumentList;
    import org.junit.Test;
    
    public class IndexSearchTest {
    
        @Test
        public void testIndexSearch1() throws Exception{
            //连接solr服务端
            SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
            
            //创建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("====================================================");
            }
        }
        
        @Test
        public void testIndexSearch2() throws Exception{
            //连接solr服务端
            SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
            
            //创建solr查询条件对象
            SolrQuery solrQuery = new SolrQuery();
            //查询关键字输入
            solrQuery.setQuery("台灯");
            //设置默认搜索域
            solrQuery.set("df", "product_keywords");
            //设置过滤查询
            solrQuery.addFilterQuery("product_price:[1 TO 100]");
            //设置排序,这里是降序
            solrQuery.setSort("product_price", ORDER.desc);
            //=======设置分页========
            //设置起始条数
            solrQuery.setStart(0);
            //设置查询多少条
            solrQuery.setRows(50);
            
            //========设置高亮显示=======
            //高亮默认是关闭的,所以要手动开启
            solrQuery.setHighlight(true);
            //设置需要高亮显示的域
            solrQuery.addHighlightField("product_name");
            //设置高亮前缀
            solrQuery.setHighlightSimplePre("<span style="color:red">");
            //设置高亮后缀
            solrQuery.setHighlightSimplePost("</span>");
            
            //===================查询并获取查询响应对象=====================================
            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<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
                List<String> list = highlighting.get(doc.get("id")).get("product_name");
                if(list != null && list.size() > 0){
                    String hlName = list.get(0);
                    System.out.println("=======high lighting=====" + hlName);
                }
                
                System.out.println("============="+doc.get("product_name"));
                System.out.println("============="+doc.get("product_price"));
                System.out.println("====================================================");
            }
        }
    }

    -------------------------------------------------------------总结------------------------------------------------------------

    1.solr是一个全文检索引擎系统,通过部署到tomcat下就可以独立运行,通过http协议对外提供全文检索服务,
    就是索引和文档的正删改查服务
    2. solr直接操作索引库和文档库, 我们的业务系统中可以使用solrJ(solr的客户端,就是一堆jar包)来调用solr服务端,
    让solr服务端操作文档库和索引库,完成正删改查的任务,将结果返回给solrJ客户端,我们在业务系统中就可以,
    获取到结果然后返回给客户在浏览器中显示.

    3. solrHome:solrhome就是solr最核心的目录, 一个solrhome中可以有多个solr实例
    4. solrCore:一个solrCore就是一个solr实例,solr中实例与实例之间他们的索引库和文档库是相互隔离的
    每个实例对外单独的提供索引和文档的增删改查服务,默认实例叫做collection1

    5. 文档和索引的增加和修改必须要有id, 主键域,没有会报错
    6. 域名和类型必须先定义后使用,如果没有定义就使用会报错

    7. 域的分类
    普通域:string long 等
    动态域:起到模糊匹配的效果,可以模糊匹配没有定义过的域名
    例如:xxxx这个域名没有定义,但是xxxx_s这个域名模糊匹配了*_s这个域,所以相当于xxxx_s这个域定义了
    主键域:<uniqueKey>id</uniqueKey> 一般主键域就用默认的这个就可以不需要更改或者添加
    复制域: 复制域用于查询的时候从多个域中进行查询,这样可以将多个域复制到某一个统一的域中,
    然后搜索的时候从这个统一的域中进行查询,就相当于从多个域中查询了.

    6.是否存储和是否索引无关, 索引后就能查询,不索引就不能根据这个域搜索,
    存储后就能取出来里面的内容,不存储就取不出这个域内容

    7. 一般企业中将数据全部放入数据库中, 由于查询的时候需要使用like模糊查询,模糊查询数据库中使用的是全表扫描算法,
    这样效率低级,所以需要使用全文检索,来优化查询速度.

  • 相关阅读:
    模拟赛总结
    2018.04.06学习总结
    2018.04.06学习总结
    Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
  • 原文地址:https://www.cnblogs.com/kaiwen1/p/8279697.html
Copyright © 2011-2022 走看看