Solr--CURD操作(下)

导入jar包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spaider_parent</artifactId>
        <groupId>spaider</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>day05</artifactId>
    <dependencies>
        <!--solr包-->
        <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
            <version>4.10.2</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging-api</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

//--------------添加部分------------------------------------------------------------------------

1  solr添加一条document

//添加一条document  
@Test
public void creatIndexToSolr() throws IOException, SolrServerException {
    //获取连接solr的连接对象,构造中需要传入一个地址
    SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");//第一步
    //写入东西
    SolrInputDocument solrInputFields = new SolrInputDocument();//第三步
    solrInputFields.addField("id",1);
    solrInputFields.addField("title","大数据12期");
    solrInputFields.addField("content","这一阶段我学习了爬虫已经搜索相关的内容");
    solrServer.add(solrInputFields);//第二步
    solrServer.commit();
}

 

2  solr添加多条document

//添加多条document
@Test
public void createManyIndexToSolr() throws IOException, SolrServerException {
    //获取连接solr的对象
    SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");//第一步
    //添加document
    List<SolrInputDocument> list=new ArrayList<SolrInputDocument>();//第三步
    for(int i=2;i<=10;i++){
        SolrInputDocument solrInputFields = new SolrInputDocument();
        solrInputFields.addField("id",i);
        solrInputFields.addField("title","赵佳乐老师");
        solrInputFields.addField("age","18");
        solrInputFields.addField("content","爬虫,检索相关,京东,慢慢网"+i);
        list.add(solrInputFields);
    }
    solrServer.add(list);//第二步
    solrServer.commit();
}

 

3  solr添加一个javabean

javabean实体类,实体类中要使用注释field,否则无法和solr的field进行匹配

public class User {
    @Field
    private String id;
    @Field
    private String title;
    @Field
    private String age;
    @Field
    private String content;

       ......}

 

//使用javabean写入一个对象
@Test
public  void createIndexJavaBean() throws IOException, SolrServerException {
    //获取连接对象
    SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
    User user = new User("11","小川老师","28","这个阶段我学习了:mybatis,spring,springMVC");
    solrServer.addBean(user);
    solrServer.commit();
}

4  solr添加多个javabean

//使用addBean写入多个对象
@Test
public void createIndexManyJavaBean() throws IOException, SolrServerException {
    //获取连接对象
    SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
    List<User> beanList=new ArrayList<User>();
    for(int i=12;i<22;i++){
        User user = new User();
        user.setId(i+"");
        user.setTitle("夯夯老师");
        user.setAge("48");
        user.setContent("这个阶段我学习了javaweb相关知识"+i);
        beanList.add(user);
    }
    solrServer.addBeans(beanList);
    solrServer.commit();
}

//--------------------------修改,删除部分-------------------------------------------------------------------------

修改的话只要覆盖原来的id值就可以修改,此处不演示了,大家可以自己试一试很简单,在约束配置文件里已经配置了id

 1   删除操作

 //删除索引
    @Test
    public void deleteByIdToSolr() throws IOException, SolrServerException {
        //获取连接对象
        SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
        //solrServer.deleteById(1+""); //删除id=1的
        //删除list集合中的id
//        List<String> list= new ArrayList<String>();
//        list.add("2");
//        list.add("3");
//        solrServer.deleteById(list);
        solrServer.deleteByQuery("*:*");//里面放的是根据什么条件删除
        solrServer.commit();
    }

 

-------------------------查询部分-------------------------------------------------------------------------

下图是在约束配置schema.xml中配置的Filed

1 solr的基本查询,(返回集合)

//solr的基本查询
@Test
public void baseQueryToSolr() throws SolrServerException {
    //获取连接对象
    SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");

    SolrQuery solrQuery = new SolrQuery("*:*");
    QueryResponse response = solrServer.query(solrQuery);
    //解析respongs
    SolrDocumentList documentList = response.getResults();
    for (SolrDocument document : documentList) {
        Object id = document.get("id");
        Object title = document.get("title");
        Object age = document.get("age");
        Object content = document.get("content");
        System.out.println(id+"--"+title+"--"+age+"--"+content);
    }
}

2  solr的javabean查询(返回封装对象)

//返回javabean的查询
@Test
public void javaBeanQueryToSolr() throws Exception {
    //获取连接对象
    SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
    SolrQuery solrQuery = new SolrQuery("*:*");
    QueryResponse response = solrServer.query(solrQuery);
    //解析response
    List<User> userList = response.getBeans(User.class);
    for (User user : userList) {
        System.out.println(user);
    }
}

3  复杂查询部分(通配符查询  布尔查询   相似度查询   子查询  范围查询)

由于查询的时候代码重复度比较高此处抽取一个工具类,方便后续查询的时候直接使用

抽取的公共类baseQuery

public void beseQuery(SolrQuery solrQuery) throws SolrServerException {
    //获取连接对象
    SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
    QueryResponse response = solrServer.query(solrQuery);
    //解析response
    List<User> userList = response.getBeans(User.class);
    for (User user : userList) {
        System.out.println(user);
    }
}

3.1  通配符查询

//复杂查询--通配符查询 ? *
@Test
public  void wildcardQueryToSolr() throws SolrServerException {
    //SolrQuery solrQuery = new SolrQuery("title:赵*"); //由于此处进行了分词,分词后中文都分开了,所以得用分词的查询
    SolrQuery solrQuery = new SolrQuery("content:京?");
    solrQuery.setRows(200);//设置查看200条
    beseQuery(solrQuery);
}

3.2 布尔查询

//复杂查询---布尔查询 AND OR NOT
@Test
public void booleanToSolr() throws SolrServerException {
    SolrQuery solrQuery = new SolrQuery("(title:乐*) AND (age:18 NOT content:5* )");
    beseQuery(solrQuery);
}

3.3   相似度查询

//相似度查询  ,相似度查询里面必须加~  另外只能最多匹配2个字符,一个汉字
@Test
public void  queryToSolr() throws SolrServerException {
    SolrQuery solrQuery = new SolrQuery("content:javwe~");
    beseQuery(solrQuery);
}

3.4  范围查询

//范围查询 To
@Test
public void queryToSolr2() throws SolrServerException {
    SolrQuery solrQuery = new SolrQuery("id:[1 TO 2]"); //查出来的结果是id里面带1 或者带2的都出来
    beseQuery(solrQuery);
}

3.5 子查询

//子查询:类似于布尔查询,里面加入了更多的逻辑,此处就不在演示,比较简单,套路一样

 

----------------------------排序操作部分---------------------------------------------------------------------------------

1  查询排序功能

//排序 setSort
@Test
public void sortToSolr() throws SolrServerException {
    SolrQuery solrQuery = new SolrQuery("*:*");
    solrQuery.setSort("age", SolrQuery.ORDER.desc);  //desc表示从大到小
    solrQuery.setRows(200);
    beseQuery(solrQuery);
}

--------------------------分页操作部分------------------------------------------------------------------------------------

//分页 setStat setRows
@Test
public void limitToSolr() throws SolrServerException {
    SolrQuery solrQuery = new SolrQuery("*:*");
    solrQuery.setStart(1); //表示第二页,索引从0开始
    solrQuery.setRows(2);  //每页显示2条数据
    beseQuery(solrQuery);
}

---------------------------高亮操作部分-----------------------------------------------------------------------------------

//高亮
@Test
public  void  hightingToSolr() throws SolrServerException {
    //设置高亮Filed
    SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr/collection1");
    SolrQuery solrQuery = new SolrQuery("content:javaweb");
    solrQuery.setRows(200);//每页展示的数据
    solrQuery.setHighlight(true); //开启高亮
    solrQuery.addHighlightField("content"); //设置高亮字段
    solrQuery.setHighlightSimplePre("<font color='red'>"); //设置前缀
    solrQuery.setHighlightSimplePost("</font>");   //设置后缀
    QueryResponse response = solrServer.query(solrQuery);
    //获取高亮
    /**
     * 最外层的map:
     *      key:  文档的id值
     *      value: 当前文档的高亮内容
     * 内层的map:
     *      key: 高亮的字段
     *      value: 高亮的内容(list一般只有一个)
     *
     */
    //获取高亮方法一:集合获取
    Map<String, Map<String, List<String>>> map = response.getHighlighting();
    for (String key : map.keySet()) {
        Map<String, List<String>> stringListMap = map.get(key);
        for (String fiedKey : stringListMap.keySet()) {
            List<String> strings = stringListMap.get(fiedKey);
            for (String string : strings) {
                System.out.println(string);
            }
        }
    }

        

   //获取高亮方法二:对象获取
    List<User> userList = response.getBeans(User.class);
    for (User user : userList) {
        Map<String, List<String>> map1 = map.get(user.getId());
        user.setContent(map1.get("content").get(0));
        System.out.println(user);
    }

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值