隐藏

Java中使用Solr(SolrJ的使用)

发布:2024/1/27 17:52:07作者:管理员 来源:本站 浏览次数:694


1. 什么是SolrJ


SolrJ是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务。

2. 添加/更新/删除


根据业务需要我们一般会在schema.xml中自定义一套Field,如下是商品信息Field(和Bean对应):


<!--product-->

<field name="product_name" type="text_ik" indexed="true" stored="true"/>

<field name="product_price" type="float" indexed="true" stored="true"/>

<field name="product_picture" type="string" indexed="false" stored="true" />

<field name="product_description" type="text_ik" indexed="true" stored="false" />

<field name="product_catalog_name" type="string" indexed="true" stored="true" />

<field name="product_keywords" type="text_ik" indexed="true" stored="false"multiValued="true"/>

<copyField source="product_name" dest="product_keywords"/>

<copyField source="product_description" dest="product_keywords"/>


2.1 创建索引


// 创建索引,如果id存在则更新,如果id不存在则新建

@Test

public void testCreateIndex() {

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

   SolrInputDocument document = new SolrInputDocument();

   document.addField("id", "c0001"); //唯一约束,schema.xml中默认有一个id的field

   document.addField("product_name", "solr全文检索");//商品名称

   document.addField("product_price", 86.5f);//商品价格

   document.addField("product_picture", "382782828.jpg");//商品图片

   document.addField("product_description", "这是一本关于solr的书籍!");//商品描述

   document.addField("product_catalog_name", "javabook");//商品分类

   UpdateResponse response = server.add(document);

   server.commit(); // 提交

}


2.2 删除索引


//删除索引

@Test

public void testDeleteIndex() {

   SolrServer solrServer = new HttpSolrServer("http://192.168.10.1:8080/solr");

   UpdateResponse response = solrServer.deleteById("c0001");//根据id删除

   solrServer.deleteByQuery("product_keywords:教程");//自动查询条件删除

   solrServer.commit(); // 提交

}


3. 搜索

3.1 搜索索引


// 搜索

@Test

public void testSearch() throws SolrServerException {

   SolrServer solr = new HttpSolrServer("http://192.168.10.1:8080/solr");        

   SolrQuery query = new SolrQuery(); // 查询对象

   //设置查询条件,名称“q”是固定的且必须 的

   //搜索product_keywords域,product_keywords是复制域包括product_name和product_description

   query.set("q", "product_keywords:java教程");

   QueryResponse response = solr.query(query); // 请求查询      

   SolrDocumentList docs = response.getResults();   // 查询结果      

   System.out.println("查询文档总数" + docs.getNumFound()); // 查询文档总数

   for (SolrDocument doc : docs) {

       String id = (String) doc.getFieldValue("id"); //商品主键

       String product_name = (String) doc.getFieldValue("product_name"); //商品名称

       Float product_price = (Float) doc.getFieldValue("product_price"); //商品价格

       String product_picture = (String) doc.getFieldValue("product_picture"); //商品图片

       String product_catalog_name = (String) doc.getFieldValue("product_catalog_name"); //商品分类

       System.out.println("=============================");

       System.out.println(id);

       System.out.println(product_name);

       System.out.println(product_price);

       System.out.println(product_picture);

       System.out.println(product_catalog_name);

   }

}


3.2 组合查询


AND 、 OR 、 NOT 条件:

TO 条件:

[6,9] 相当于 6<=price<=9

(6,9) 相当于 1< price< 9


//根据商品分类、价格范围、关键字查询,查询结果按照价格降序排序

@Test

public void testSearch2() throws SolrServerException {

   SolrServer solr = new HttpSolrServer("http://192.168.10.1:8080/solr");

   SolrQuery query = new SolrQuery(); // 查询对象

   // 搜索product_keywords域,product_keywords是复制域包括product_name和product_description

   // 设置商品分类、关键字查询

   // query.set("q", "product_keywords:挂钩 AND  product_catalog_name:幽默杂货");

   query.setQuery("product_keywords:挂钩 AND product_catalog_name:幽默杂货");

   query.set("fq", "product_price:[1 TO 20]"); // 设置价格范围

   // 查询结果按照价格降序排序

   // query.set("sort", "product_price desc");

   query.addSort("product_price", ORDER.desc);


   QueryResponse response = solr.query(query); // 请求查询        

   SolrDocumentList docs = response.getResults(); // 查询结果        

   System.out.println("查询文档总数" + docs.getNumFound()); // 查询文档总数

   for (SolrDocument doc : docs) {

       String id = (String) doc.getFieldValue("id");  // 商品主键            

       String product_name = (String) doc.getFieldValue("product_name"); // 商品名称

       Float product_price = (Float) doc.getFieldValue("product_price"); // 商品价格

       String product_picture = (String) doc.getFieldValue("product_picture"); // 商品图片

       String product_catalog_name = (String) doc.getFieldValue("product_catalog_name"); // 商品分类

       System.out.println("=============================");

       System.out.println("id=" + id);

       System.out.println("product_name=" + product_name);


       System.out.println("product_price=" + product_price);

       System.out.println("product_picture=" + product_picture);

       System.out.println("product_catalog_name=" + product_catalog_name);

   }

}


3.3 分页高亮


// 分页和高亮

@Test

public void testSearch3() throws SolrServerException {

   SolrServer solr = new HttpSolrServer(urlString);

   SolrQuery query = new SolrQuery();

   query.setQuery("product_keywords:透明挂钩 "); // 设置商品分类、关键字查询

   

   // 分页参数

   int pageSize = 2; // 每页显示记录数

   int curPage = 2; // 当前页码

   int begin = pageSize * (curPage - 1); // 开始记录下标

   query.setStart(begin); // 起始下标

   query.setRows(pageSize); // 结束下标

   

   // 设置高亮参数

   query.setHighlight(true); // 开启高亮组件

   query.addHighlightField("product_name");// 高亮字段

   query.setHighlightSimplePre("<span color='red'>");//        前缀标记

   query.setHighlightSimplePost("</span>");// 后缀标记

   QueryResponse response = solr.query(query); // 请求查询

   SolrDocumentList docs = response.getResults();

   System.out.println("查询文档总数" + docs.getNumFound());

   for (SolrDocument doc : docs) {

       String id = (String) doc.getFieldValue("id");

       String product_name = (String) doc.getFieldValue("product_name");

       Float product_price = (Float) doc.getFieldValue("product_price");

       String product_picture = (String) doc.getFieldValue("product_picture");

       String product_catalog_name = (String) doc.getFieldValue("product_catalog_name");

       

       System.out.println("=============================");

       System.out.println("id=" + id);

       System.out.println("product_name=" + product_name);

       System.out.println("product_price=" + product_price);

       System.out.println("product_picture=" + product_picture);

       System.out.println("product_catalog_name=" + product_catalog_name);

       

       // 高亮信息

       if (response.getHighlighting() != null) {

           if (response.getHighlighting().get(id) != null) {

               Map<String, List<String>> map = response.getHighlighting().get(id);// 取出高亮片段

               if (map.get("product_name") != null) {

                   for (String s : map.get("product_name")) {

                       System.out.println(s);

                   }

               }

           }

       }

   }

}


solrj

java