solr简单学习---1

Posted 努力中国

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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模糊查询,模糊查询数据库中使用的是全表扫描算法,
这样效率低级,所以需要使用全文检索,来优化查询速度.

以上是关于solr简单学习---1的主要内容,如果未能解决你的问题,请参考以下文章

solr简单学习---1

在 solr 3.4 中放置突出显示片段配置的位置

Solr 高亮是不是还可以指示返回的片段在原始字段中的位置或偏移量?

solr-5.3.1学习

Solr的知识点学习(Solr有问有答哦)

Solr Highlighting:如何为同一字段请求多个片段长度?