solr的安装与solrJ的使用-java版

solrJ的使用

Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。

1、solr的安装及配置

需要把solr服务器安装到linux环境:

    第一步:安装linux、jdk、tomcat。

        jdk的安装:上传jdk的压缩包到linux上

                            解压jdk

                            配置环境变量的配置文件 vim /etc/prifile

                                    添加三个属性     JAVA_HOME=/jdk目录

                                                              PATH=/jdk目录/bin:$PATH

                                                               export JAVA_HOME PATH

        注销后即可生效

        tomcat的安装: 上传tomcat压缩包到linux上

                                   解压tomcat即可

    第二步:把solr的压缩包上传到服务器。并解压。

    

    第三步:把/../solr-4.10.3/dist/solr-4.10.3.war包部署到tomcat下( cp solr-4.10.3.war /.../tomcat/webapps/solr.war)。并改名为solr.war (这个就是solr工程的war包)

    第四步:解压war包(启动tomcat自动解压)。关闭tomcat。删除solr.war.

    第五步:把/../solr-4.10.3/example/lib/ext 目录下所有的jar包复制到solr工程中(cp * /.../tomcat/webapps/solr/WEB-INF/lib/)。

    第六步:创建solrhome。Solrhome是存放solr服务器所有配置文件的目录(把/.../solr-xxx/example下的solr目录 考到 solrhome目录下 )。

    第七步:告诉solr服务器solrhome的位置。需要修改solr工程的web.xml文件。

                 

    第八步:启动tomcat 在浏览器中访问 linuxIP:8080/solr

2、配置 中文解析器、业务字段

在 solrhome/collection1/conf/schema.xml 中配置中文解析器

①、在solr中默认是中文分析器,需要手工配置。配置一个FieldType,在FieldType中指定中文分析器;Solr中的字段必须是先定义后使用。

<fieldType name="text_ik" class="solr.TextField">

  <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> 

</fieldType>

②、业务字段判断标准:1、在搜索时是否需要在此字段上进行搜索。例如:商品名称、商品的卖点、商品的描述 2、后续的业务是否需要用到此字段。例如:商品id。

在 solrhome/collection1/conf/schema.xml 中配置业务字段

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

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

<field name="item_price"  type="long" indexed="true" stored="true"/> 

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

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

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

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

<copyField source="item_title" dest="item_keywords"/> 

<copyField source="item_sell_point" dest="item_keywords"/> 

<copyField source="item_category_name" dest="item_keywords"/> 

<copyField source="item_desc" dest="item_keywords"/>

重启tomcat;

3、solrJ客户端

需要依赖solrj的jar包。

<!-- solr客户端 -->

<dependency>

    <groupId>org.apache.solr</groupId>

    <artifactId>solr-solrj</artifactId>

</dependency>

solrJ的使用

public class SolrJTest {

 

    //添加索引

    @Test

    public void addDocument() throws Exception {

        //创建一个连接

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

        //创建一个solr的文档对象

        SolrInputDocument document = new SolrInputDocument();

        document.addField("id", "test001");  //第一个是key(需要和solr配置的字段一样),第二个是value

        document.addField("item_title", "测试商品2");

        document.addField("item_price", 54321);

        //把文档对象写入索引库

        solrServer.add(document);

        //提交

        solrServer.commit();

    }

    //删除索引

    @Test

    public void deleteDocument() throws Exception {

        //创建一连接

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

        //solrServer.deleteById("test001");

        solrServer.deleteByQuery("*:*");  //删除所有

        solrServer.commit();

    }

    //查询索引

    @Test

    public void queryDocument() throws Exception {

         SolrServer solrServer = new HttpSolrServer(

                 "http://192.168.253.181:8080/solr");

         // 创建一个查询对象

         SolrQuery query = new SolrQuery();

         // 设置查询条件

         query.setQuery("*:*");

         query.setStart(20);

         query.setRows(50);

         // 执行查询

         QueryResponse response = solrServer.query(query);

         // 取查询结果

         SolrDocumentList solrDocumentList = response.getResults();

         System.out.println("共查询到记录:" + solrDocumentList.getNumFound());

         for (SolrDocument solrDocument : solrDocumentList) {

             System.out.println(solrDocument.get("id"));

             System.out.println(solrDocument.get("item_title"));

             System.out.println(solrDocument.get("item_price"));

             System.out.println(solrDocument.get("item_image"));

         }

    }

}

发布一个solr的搜索服务: 创建一搜素的服务工程

    1、使用java程序读取mysql数据库中的商品信息,然后创建solr文档对象,把商品信息写入索引库(在solr服务上写导入的java代码)。

@Override

public TaotaoResult importAllItems() {

    try {

    //查询商品列表

    List<Item> list = itemMapper.getItemList();

    //把商品信息写入索引库

    for (Item item : list) {

    //创建一个SolrInputDocument对象

        SolrInputDocument document = new SolrInputDocument();

        document.setField("id", item.getId());

        document.setField("item_title", item.getTitle());

        document.setField("item_sell_point", item.getSell_point());

        document.setField("item_price", item.getPrice());

        document.setField("item_image", item.getImage());

        document.setField("item_category_name", item.getCategory_name());

        document.setField("item_desc", item.getItem_des());

        //写入索引库

        solrServer.add(document);

        }

        //提交修改

        solrServer.commit();

    } catch (Exception e) {

        e.printStackTrace();

        return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));

    }

    return TaotaoResult.ok();

}

4、搜索服务的发布

    http形式的服务。对外提供搜索服务是一个get形式的服务。调用此服务时需要查询条件

,分页条件可以使用page(要显示第几页)、rows(每页显示的记录数)。返回一个json格式的数据。可以使用TaotaoResult包装一个商品列表转换成json。

dao层

    @Override

    public SearchResult search(SolrQuery query) throws Exception {

         // 返回值对象

         SearchResult result = new SearchResult();  //记录商品列表、总记录、总页、当前页

         // 根据查询条件query查询索引库

         QueryResponse queryResponse = solrServer.query(query);

         // 取查询结果

         SolrDocumentList solrDocumentList = queryResponse.getResults();

         // 取查询结果总数量

        result.setRecordCount(solrDocumentList.getNumFound());

         // 商品列表

         List<Item> itemList = new ArrayList<>();

         // 取高亮显示

         Map<String, Map<String, List<String>>> highlighting = queryResponse

                 .getHighlighting();

         // 取商品列表

         for (SolrDocument solrDocument : solrDocumentList) {

             // 创建一商品对象

             Item item = new Item();

             item.setId((String) solrDocument.get("id"));

             // 取高亮显示的结果

             List<String> list = highlighting.get(solrDocument.get("id")).get(

                     "item_title");

             String title = "";

             if (list != null && list.size() > 0) {

                 title = list.get(0);

             } else {

                 title = (String) solrDocument.get("item_title");

             }

             item.setTitle(title);

             item.setImage((String) solrDocument.get("item_image"));

             item.setPrice((long) solrDocument.get("item_price"));

             item.setSell_point((String) solrDocument.get("item_sell_point"));

             item.setCategory_name((String) solrDocument

                     .get("item_category_name"));

             // 添加的商品列表

             itemList.add(item);

         }

         result.setItemList(itemList);

         return result;

    }

service层

    @Override

    public SearchResult search(String queryString, int page, int rows)

             throws Exception {

         // 创建查询对象 solrJ定制版对象

         SolrQuery query = new SolrQuery();

         // 设置查询条件

         query.setQuery(queryString);

         // 设置分页

         query.setStart((page - 1) * rows);

         query.setRows(rows);

         // 设置默认搜素域

         query.set("df", "item_keywords");

         // 设置高亮显示

         query.setHighlight(true);

         query.addHighlightField("item_title");

         query.setHighlightSimplePre("<em style=\"color:red\">");

         query.setHighlightSimplePost("</em>");

         // 执行查询

         SearchResult searchResult = searchDao.search(query);

         // 计算查询结果总页数

         long recordCount = searchResult.getRecordCount();

         long pageCount = recordCount / rows;

         if (recordCount % rows > 0) {

             pageCount++;

         }

         searchResult.setPageCount(pageCount);

         searchResult.setCurPage(page);

         return searchResult;

    }

controller层

   接收查询参数:查询条件、page、rows调用Service执行查询返回一个查询结果对象。 把查询结果包装到Result中返回,结果是json格式的数据。  

猜你喜欢

转载自blog.csdn.net/weixin_40493969/article/details/82584537
今日推荐