Solr--03.SolrJ的使用

版权声明:转载请注明原始链接 https://blog.csdn.net/sswqzx/article/details/84501241

一、SolrJ概述

1、概述

SolrJ是Apache官方提供的一套Java开发的,访问Solr服务的API,
通过这套API可以让我们的程序与Solr服务产生交互,让我们的程序可以实现对Solr索引库的增删改查!

2、依赖

<dependencies>
      <!-- solrj api -->
		<dependency>
			<groupId>org.apache.solr</groupId>
			<artifactId>solr-solrj</artifactId>
			<version>4.10.2</version>
		</dependency>
		<!-- solrj底层用到slf4j日志工具 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.22</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.2</version>
		</dependency>

<!-- Junit单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>

			<!-- java编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.2</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>

		</plugins>
	</build>

二、SolrJ添加或修改索引库数据

1、以Document形式添加或修改索引库数据

package com.solr.Test;

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;
/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 11:03 2018/11/25
 */
public class Create_Solr_Document {
    /**
     * 以Document形式向solr添加或修改数据
     */
    @Test
    public void testCreateIndex() throws Exception{
        //1、连接服务器
        SolrServer server =  new HttpSolrServer("http://localhost:8080/solr/collection1");

        //2、创建solr的输入document
        SolrInputDocument document = new SolrInputDocument();

        //3、添加字段
        document.addField("id","17386");
        document.addField("title","保时捷、一代神车" );
        document.addField("price", 199999999);

        //4、添加document到server
        server.add(document);

        //5、提交请求、如果id不存在就创建数据、如果存在则修改数据
        server.commit();

    }
}

2、使用注解和JavaBean添加或修改索引库数据

package com.solr.Test;

import com.solr.domain.Item;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.junit.Test;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 11:10 2018/11/25
 */
public class Create_Solr_JavaBean {
    /**
     * 以JavaBean形式向solr添加或修改数据
     */
    @Test
    public void testCreateIndexBean() throws Exception{
        //1、连接solr服务器
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");

        //2、创建一个实体类对象
        Item item = new Item();
        item.setId("17386");
        item.setTitle("oppe手机、好用");
        item.setPrice(2999);

        //3、将对象添加到server
        server.addBean(item);

        //4、提交请求、如果id不存在则添加新数据、如果已存在则修改数据
        server.commit();
    }
}

JavaBean类Item.java

package com.solr.domain;

import org.apache.solr.client.solrj.beans.Field;

import java.io.Serializable;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 11:20 2018/11/25
 */
public class Item implements Serializable {
    private static final long SerialVersionUID = 1L;
    @Field("id")
    private String id;
    @Field("title")
    private String title;
    @Field("price")
    private flaot price;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public flaot getPrice() {
        return price;
    }

    public void setPrice(flaot price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Item{" +
                "id='" + id + '\'' +
                ", title='" + title + '\'' +
                ", price=" + price +
                '}';
    }
}

三、SolrJ删除索引库数据

package com.solr.Test;

import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.junit.Test;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 11:30 2018/11/25
 */
public class Delete_Solr {

    /**
     * 根据id删除索引
     */
    @Test
    public void testDeleteIndexById() throws Exception{
        //1、连接solr服务器
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //2、根据id删除索引
        server.deleteById("17386");
        server.commit();
    }

    /**
     * 根据title删除索引
     * @throws Exception
     */
    @Test
    public void testDeleteIndexByQuery() throws Exception{
        //1、连接solr服务器
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //2、根据查询条件删除索引
        server.deleteByQuery("title:iphone");
        //3、提交
        server.commit();
    }
}

四、SolrJ查询索引库数据

1、以Document形式返回查询结果

  /**
     * 演示:使用SolrJ查询索引,返回的是Document形式
     * @throws Exception
     */
    @Test
    public void testQueryDocument() throws Exception{
        //1、连接solr服务器
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //2、创建查询对象:SolrQuery
        SolrQuery query = new SolrQuery("title:apple");
        //3、执行查询、获取响应
        QueryResponse response = server.query(query);

        //4、获取查询结果、本质就是一个document的集合
        SolrDocumentList results = response.getResults();

        //5、获取总条数
        System.out.println("总条数:"+results.size());

        //6、遍历集合
        for (SolrDocument result : results) {
            System.out.println("id:"+result.getFieldValue("id"));
            System.out.println("title:"+result.getFieldValue("title"));
            System.out.println("price:"+result.getFieldValue("price"));
        }
    }

2、以JavaBean形式返回查询结果

 /**
     * 演示:使用SolrJ查询索引,返回的是JavaBean
     * @throws Exception
     */
    @Test
    public void testQueryBeans() throws Exception{
        //1、连接Solr服务器
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //2、创建查询对象:solrQuery
        SolrQuery query = new SolrQuery("title:apple");

        //3、执行查询、获取响应
        QueryResponse response = server.query(query);


        //4、获取查询结果、指定实体类的类型、返回实体类的集合
        List<Item> list = response.getBeans(Item.class);

        //5、打印总条数
        System.out.println("总条数:"+list.size());

        //6、遍历
        for (Item item : list) {
            System.out.println(item.getId());
            System.out.println(item.getTitle());
            System.out.println(item.getPrice());
        }
    }

3、SolrQuery对象的高级查询

1、通配符查询:
 匹配所有文档:*:* 
(通配符 ?和*   “*”  表示匹配任意字符; “?” 表示匹配任意一个字符)

2、布尔操作:AND、OR和NOT布尔操作(推荐使用大写,区分普通字段)

3、子布尔查询(子查询):可以使用“()”构造子查询。 比如:(query1 AND query2) OR (query3 AND query4)

4、相似度查询:
(1)默认相似度查询:title:appla~ ,此时编辑举例是2
(2)指定编辑举例的相似度查询:对模糊查询可以设置编辑举例,可选0~2的整数。title:appla~1

5、范围查询(Range Query):Lucene支持对数字、日期甚至文本的范围查询。结束的范围可以使用 “*” 通配符。 
	(1)日期范围(ISO-8601 时间GMT):a_begin_date:[1990-01-01T00:00:00Z TO 1999-12-31T24:59:99Z] 
	(2)数字:salary:[2000 TO *] 
(3)文本:entryNm:[a TO a]

6、日期匹配:YEAR, MONTH, DAY, DATE (synonymous with DAY) HOUR, MINUTE,
 SECOND, MILLISECOND, and MILLI (synonymous with MILLISECOND)可以被标志成日期。 
(1)r_event_date:[* TO NOW-2YEAR]:2年前的现在这个时间
(2)r_event_date:[* TO NOW/DAY-2YEAR]:2年前前一天的这个时间 

3.1、布尔查询:

    /**
     * 布尔查询:
     * @throws Exception
     */
    @Test
    public void testBooleanSolr() throws Exception{
        //1、连接solr服务器
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //2、创建查询对象
        SolrQuery solrQuery = new SolrQuery("title:apple OR title:iphoe");
        //3、执行查询、获取响应
        QueryResponse queryResponse = server.query(solrQuery);
        //4、获取查询结果、指定实体类的类型、返回实体类的集合
        List<Item> list = queryResponse.getBeans(Item.class);

        //5、打印总条数
        System.out.println("总条数:"+list.size());

        //6、遍历
        for (Item item : list) {
            System.out.println(item.getId());
            System.out.println(item.getTitle());
            System.out.println(item.getPrice());
        }
    }

 

3.2、相似度查询:

    //相似度查询:
    @Test
    public void testBooleanSolrLike() throws Exception{
        //1、连接solr服务器
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //2、创建查询对象
        SolrQuery solrQuery = new SolrQuery("title:奔*");
        //3、执行查询、获取响应
        QueryResponse queryResponse = server.query(solrQuery);
        //4、获取查询结果、指定实体类的类型、返回实体类的集合
        List<Item> list = queryResponse.getBeans(Item.class);

        //5、打印总条数
        System.out.println("总条数:"+list.size());

        //6、遍历
        for (Item item : list) {
            System.out.println(item.getId());
            System.out.println(item.getTitle());
            System.out.println(item.getPrice());
        }
    }

 

3.3、范围查询

    //范围查询:
    @Test
    public void testBooleanSolrrange() throws Exception{
        //1、连接solr服务器
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //2、创建查询对象
        SolrQuery solrQuery = new SolrQuery("price:[300 TO 4000]");
        //3、执行查询、获取响应
        QueryResponse queryResponse = server.query(solrQuery);
        //4、获取查询结果、指定实体类的类型、返回实体类的集合
        List<Item> list = queryResponse.getBeans(Item.class);

        //5、打印总条数
        System.out.println("总条数:"+list.size());

        //6、遍历
        for (Item item : list) {
            System.out.println(item.getId());
            System.out.println(item.getTitle());
            System.out.println(item.getPrice());
        }
    }

 

4、SolrQuery实现排序

    //SolrQuery实现排序
    @Test
    public void testSolrQuerySort() throws Exception{
        //1、连接solr服务器
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //2、创建查询对象SolrQuery
        SolrQuery query = new SolrQuery("title:apple,ooooooo");
        //3、设置查询的排序参数
        query.setSort("price", SolrQuery.ORDER.desc);//价格降序
        //4、执行查询获取响应
        QueryResponse response = server.query(query);
        //5、获取查询结果、指定实体类的类型、返回实体类的集合
        List<Item> list = response.getBeans(Item.class);
        //打印总条数
        System.out.println("共有:"+list.size());
        //6、遍历
        for (Item item : list) {
            System.out.println(item.getId());
            System.out.println(item.getTitle());
            System.out.println(item.getPrice());
        }
    }

 

5、SolrQuery实现分页

   //SolrQuery实现分页
    @Test
    public void testPageQuery() throws Exception{
        //1、准备分页
        int pageNum = 2;//要查询页数
        int pageSize = 2;//每页显示条数
        int start = (pageNum-1)*pageSize;//当前页的起始条数

        SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");

        SolrQuery query = new SolrQuery("title:apple");
        query.setSort("id", SolrQuery.ORDER.asc);
        query.setStart(start);
        query.setRows(2);

        QueryResponse response = server.query(query);

        List<Item> list = response.getBeans(Item.class);

        System.out.println("当前第" + pageNum + "页,本页共" + list.size() + "条数据。");

        for (Item item : list) {
            System.out.println(item.getId());
            System.out.println(item.getTitle());
            System.out.println(item.getPrice());
        }
    }

 

6、SolrQuery实现高亮显示

   //SolrQuery实现高亮显示
   @Test
   public void testHighlightingQuery() throws Exception {
       // 连接Solr服务器,需要指定地址:我们可以直接从浏览器复制地址。要删除#
       HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
       // 创建查询对象
       SolrQuery query = new SolrQuery("title:apple");
       // 设置高亮的标签
       query.setHighlightSimplePre("<font color = 'red'>");
       query.setHighlightSimplePost("</font>");
       // 高亮字段
       query.addHighlightField("title");

       // 查询
       QueryResponse response = server.query(query);
       // 解析高亮响应结果,是一个Map
       // 外层的Map:它的键是文档的id,值是这个文档的其它高亮字段,又是一个Map
       // 内存的Map:是其它高亮字段,键是其它字段的名称,值是这个字段的值,这个值是一个List
       Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

       // 获取非高亮结果
       List<Item> list = response.getBeans(Item.class);
       for (Item item : list) {
           String id = item.getId();
           System.out.println("id: " + id);
           // 这里ID是long类型,与集合的键不匹配,所以我们需要把id转为String类型,再get
           System.out.println("title: " + highlighting.get(id+"").get("title").get(0));
           System.out.println("price: " + item.getPrice());
       }
   }

猜你喜欢

转载自blog.csdn.net/sswqzx/article/details/84501241
今日推荐