solr 在Java中的使用

//先创建一个实体,省略get, set 方法

public class Project{

    @Field(value = "id")
    private String id;
    @Field(value = "title")
    private String title;
    @Field(value = "description")
    private String description;
    @Field(value = "number")
    private String number;
}
//    指定solr服务器的地址
private final static String SOLR_URL = "http://localhost:8180/solr/";

/**
 * 创建SolrServer对象
 * <p>
 * 该对象有两个可以使用,都是线程安全的
 * 1、CommonsHttpSolrServer:启动web服务器使用的,通过http请求的
 * 2、 EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了
 * 3、solr 4.0之后好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为HttpSolrClient
 *
 * @return
 */
public static SolrClient createSolrServer(String core) {
    SolrClient solr = new HttpSolrClient.Builder(SOLR_URL + core)
            .withConnectionTimeout(10000)
            .withSocketTimeout(1000).build();
    return solr;
}
 public static void solrQueryTest(String core) {
        SolrClient solrClient = createSolrServer(core);

        SolrQuery query = new SolrQuery();
        query.add("q", "*:*"); // 查询的
        query.addFilterQuery("title:测试");  // 通过某个功能呢过滤
//        solrQuery.addFilterQuery("id:[10000004119 TO 10000004128]");  // 查询的筛选条件, 限定一定范围
        query.addField("id")
                .addField("title")
                .addField("description")
                .addField("number")
                .setSort("id", SolrQuery.ORDER.desc) // 排序
                .setRows(10); // 显示的行

        //参数hl,设置高亮
//        query.setHighlight(true);
//        //设置高亮的字段
//        query.addHighlightField("title");
//        //设置高亮的样式
//        query.setHighlightSimplePre("<font color='red'>");


        try {
            QueryResponse response = solrClient.query(query);

            SolrDocumentList documents = response.getResults();
            long numFound = documents.getNumFound();
            System.out.println(numFound);
            for (SolrDocument item : documents) {
                Object id = item.getFieldValue("id");
                String title = (String) item.getFieldValue("title");
                String description = (String) item.getFieldValue("description");
                String number = (String) item.getFirstValue("number");

                System.out.println("id:" + id + " title:" + title + " description: " + description + " number:" + number);
            }

            System.out.println("**********************************");
            // 搜索的结果转换成实体
            List<Project> beans = response.getBeans(Project.class);
            for (Project item : beans) {
                System.out.println("id:" + item.getId() + " title:" + item.getTitle() + " description: " + item.getDescription() + " number:" + item.getNumber());
            }


        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

SolrQuery sq=new SolrQuery();

1、多条件查询

//设置查询条件

sq.set("q","item_title:3 AND item_desc:东西 OR item_sell_point:好看" );

2、设置过滤条件

//设置过滤条件 sq.set("fq", "item_price:[1 TO 20]");

3、设置排序

//设置排序

sq.addSort("item_title", ORDER.desc);

4、设置分页

//设置分页

sq.setStart(0);//开始位置 sq.setRows(3);//每页3条

public static void queryDocument() throws Exception{
        //创建Solr的客户端链接对象
        HttpSolrServer solrServer=new HttpSolrServer("http://192.168.6.179:8080/solr/collection1");
        //创建solr的查询对象
        SolrQuery sq=new SolrQuery();
        //设置查询条件
        sq.set("q","item_title:商品" );
        //设置过滤条件
    //    sq.set("fq", "item_price:[1 TO 20]");
        //设置排序
        sq.addSort("item_title", ORDER.desc);
        //设置分页
        sq.setStart(0);//开始位置
        sq.setRows(3);//每页3条
        
        //开启高亮
        sq.setHighlight(true);
        sq.addHighlightField("item_title");//设置高亮域
        sq.setHighlightSimplePre("<b>");//设置高亮样式
        sq.setHighlightSimplePost("</b>");
        //查询
        QueryResponse qr=solrServer.query(sq);
        //获取查询结果
        SolrDocumentList sds=qr.getResults();
        //获取查询的记录数
        long total=sds.getNumFound();
        System.out.println("数量:"+total);
        for(SolrDocument sd:sds){//默认取出10条记录
            String id=(String) sd.getFieldValue("id");
            String item_title=(String) sd.getFieldValue("item_title");
            String item_sell_point=(String) sd.getFieldValue("item_sell_point");
            long item_price=(Long) sd.getFieldValue("item_price");
            String item_desc=(String) sd.getFieldValue("item_desc");
            String item_image=(String) sd.getFieldValue("item_image");
            String item_category_name=(String) sd.getFieldValue("item_category_name");
            System.out.println("========================================");
            System.out.println("id:"+id);
            System.out.println("item_title:"+item_title);
            System.out.println("item_sell_point:"+item_sell_point);
            System.out.println("item_price:"+item_price);
            System.out.println("item_desc:"+item_desc);
            System.out.println("item_image:"+item_image);
            System.out.println("item_category_name:"+item_category_name);
            //获取高亮显示的结构
            Map<String, Map<String, List<String>>> highlighting=qr.getHighlighting();
            if(highlighting!=null){
                //根据Id获得每个域的高亮内容
                Map<String, List<String>> map=highlighting.get(id);
                //根据具体的域获取高亮内容
                List<String> list=map.get("item_title");
                if(list!=null && !list.isEmpty()){
                    for(String str:list){
                        System.out.println("str:"+str);
                    }
                }
            }
        }
    }
/**
 * 添加
 * @param core
 */
public static void addDocument(String core) {
    SolrClient solrClient = createSolrServer(core);
    List<Project> projects = new ArrayList<Project>();
    Project project = new Project();
    project.setId("1");
    project.setTitle("大数据处理权威指南");
    project.setDescription("清华大学出版社");
    project.setNumber("1633");
    projects.add(project);
    Project project2 = new Project();
    project2.setId("2");
    project2.setTitle("深入RabbitMq");
    project2.setDescription("第二版");
    project2.setNumber("1634");
    projects.add(project2);

    try {
        solrClient.addBeans(projects);
        solrClient.commit();
        solrClient.close();
    } catch (SolrServerException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


}

/**
 * 删除
 * @param core
 */
public static void delDocument(String core) {
    SolrClient solrClient = createSolrServer(core);
    try {
        solrClient.deleteById("2");
        solrClient.commit();
        solrClient.commit();
    } catch (SolrServerException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


/**
 * 更新
 * @param core
 */
public static void updDocument(String core) {
    SolrClient solrClient = createSolrServer(core);
    Project project = new Project();
    project.setId("1");  // 有id 就是更新, 没有ID,就是添加
    project.setTitle("大数据处理权威指南22");
    project.setDescription("清华大学出版社");
    project.setNumber("1633");
    try {
        UpdateResponse updateResponse = solrClient.addBean(project);
        solrClient.commit();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SolrServerException e) {
        e.printStackTrace();
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Solr是一个基于Java的搜索引擎,可以用Java实现自定义排序。以下是实现自定义排序的步骤: 1. 创建一个自定义排序器类,实现org.apache.solr.search.SortComparator。 2. 在自定义排序器类实现compare方法,该方法接收两个参数,即要比较的文档对象。 3. 在compare方法实现自定义排序逻辑,根据需要将文档对象进行排序。 4. 在solrconfig.xml文件配置自定义排序器,将其添加到fieldType。 5. 在查询请求指定使用自定义排序器。 下面是一个示例代码,演示了如何使用Java实现自定义排序器: ```java public class CustomSortComparator extends SortComparator { @Override public int compare(SortField sortField, SchemaField schemaField, FieldComparator<?> fieldComparator1, FieldComparator<?> fieldComparator2) throws IOException { // 获取要比较的文档对象 Object value1 = fieldComparator1.value(sortField.getReverse()); Object value2 = fieldComparator2.value(sortField.getReverse()); // 根据自定义逻辑进行排序 if (value1 instanceof Long && value2 instanceof Long) { Long long1 = (Long) value1; Long long2 = (Long) value2; if (long1 > long2) { return sortField.getReverse() ? -1 : 1; } else if (long1 < long2) { return sortField.getReverse() ? 1 : -1; } else { return 0; } } // 默认情况下,按照Solr默认的排序逻辑进行排序 return super.compare(sortField, schemaField, fieldComparator1, fieldComparator2); } } ``` 在solrconfig.xml文件配置自定义排序器: ```xml <fieldType name="text_custom" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> </analyzer> <sortComparator class="com.example.CustomSortComparator"/> </fieldType> ``` 在查询请求指定使用自定义排序器: ```sh http://localhost:8983/solr/mycore/select?q=*:*&sort=custom_field+desc&fl=field1,field2&defType=edismax&wt=json ``` 以上代码演示了如何使用Java实现自定义排序器,通过实现compare方法自定义排序逻辑,将自定义排序器添加到fieldType,在查询请求指定使用自定义排序器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值