#徐员外#Solr搜索 代码实现

Posted xuyuanwai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#徐员外#Solr搜索 代码实现相关的知识,希望对你有一定的参考价值。

理解 了 上 一篇 关于 lucene的全文 搜索 原理 ,再来 理解 solr就 比较 容易 了 ,原理 基本 上 相同 ,但solr封装 了 lucene,使得搜索跟应用能够无缝对接

我们先复习一下全文搜索实现的步骤

1、读取文件或者内容,通过分词器分词【中文 使用IKAnalyzer】

2、创建文件field 域对象

3、生成文件索引库

4、查询索引库


solr代码如何实现的呢?

//向索引库中添加索引

      @Test

      publicvoid addDocument() throws Exception {

           //solr服务器创建连接

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

           //创建一个文档对象

           SolrInputDocument document = new SolrInputDocument();

           //向文档中添加域

           //第一个参数:域的名称,域的名称必须是在schema.xml中定义的

           //第二个参数:域的值

           document.addField("id", "c0001");

           document.addField("title_ik", "使用solrJ添加的文档");

           document.addField("content_ik", "文档的内容");

           document.addField("product_name", "商品名称");

           //把document对象添加到索引库中

           solrServer.add(document);

           //提交修改

           solrServer.commit();          

      }

a)         查询文档

1.a.1.   简单查询

//查询索引

      @Test

      publicvoid queryIndex() throws Exception {

           //创建连接

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

           //创建一个query对象

           SolrQuery  query = new SolrQuery();

           //设置查询条件

           query.setQuery("*:*");

           //执行查询

           QueryResponse queryResponse = solrServer.query(query);

           //取查询结果

           SolrDocumentList solrDocumentList =  queryResponse.getResults();

           //共查询到商品数量

           System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());

           //遍历查询的结果

           for (SolrDocument  solrDocument : solrDocumentList) {

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

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

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

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

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

                

           }

      }

 

1.a.2.   复杂查询

其中包含查询、过滤、分页、排序、高亮显示等处理。

//复杂查询索引

      @Test

      publicvoid queryIndex2() throws Exception {

           //创建连接

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

           //创建一个query对象

           SolrQuery query = new SolrQuery();

           //设置查询条件

           query.setQuery("钻石");

           //过滤条件

           query.setFilterQueries("product_catalog_name:幽默杂货");

           //排序条件

           query.setSort("product_price", ORDER.asc);

           //分页处理

           query.setStart(0);

           query.setRows(10);

           //结果中域的列表

           query.setFields("id","product_name","product_price","product_catalog_name","product_picture");

           //设置默认搜索域

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

           //高亮显示

           query.setHighlight(true);

           //高亮显示的域

           query.addHighlightField("product_name");

           //高亮显示的前缀

           query.setHighlightSimplePre("<em>");

           //高亮显示的后缀

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

           //执行查询

           QueryResponse queryResponse = solrServer.query(query);

           //取查询结果

           SolrDocumentList solrDocumentList =  queryResponse.getResults();

           //共查询到商品数量

           System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());

           //遍历查询的结果

           for (SolrDocument  solrDocument : solrDocumentList) {

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

                 //取高亮显示

                 String productName = "";

                 Map<String, Map<String,  List<String>>> highlighting = queryResponse.getHighlighting();

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

                 //判断是否有高亮内容

                 if (null != list) {

                      productName = list.get(0);

                 } else {

                      productName = (String) solrDocument.get("product_name");

                 }

                

                 System.out.println(productName);

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

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

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

                

           }

      }


以上是关于#徐员外#Solr搜索 代码实现的主要内容,如果未能解决你的问题,请参考以下文章

#徐员外#Solr服务器集群及ActiveMQ应用实战

#徐员外# 如何查询 Lucene 建立索引库后的文档内容?

#徐员外# Android|sqlite开发视频1~6

#徐员外#《MyCat权威指南》|100本技术书之4

#徐员外#阿里巴巴Dubbo开源服务框架|100本技术书之3

SolrSolr实现简单的类似百度搜索高亮功能-2代码