solr8.0.0基本安装和在springboot中的基本使用(win10)

1、下载solr

  下载地址:http://archive.apache.org/dist/lucene/solr/

  该地址可以也可以下载以前的版本,我这边下载的solr-8.0.0.zip版本。下载完成之后放在的D:\project目录下,然后解压到当前目录。

  注:如果下载比较慢,可以尝试使用迅雷有可能要快很多

2、启动、关闭solr

  在解压之后的solr目录中找到bin文件夹,进去之后右键进入Powershell输入以下命令:

启动Solr: .\solr start
关闭Solr: .\solr stop -all

3、创建Core

  在solr目录中的\server\solr文件夹中创建一个名为kawhi的文件夹。然后把\server\solr\configsets\sample_techproducts_configs下面的conf文件夹复制到刚才创建的kawhi文件夹下面。

  完成上面操作之后启动solr,启动成功之后打开浏览器进入http://127.0.0.1:8983/solr/#/地址,就可以看见solr的管理界面。点击左侧的Core Admin,在新页面的name和instanceDir输入框中分别修改为刚才创建的文件夹名称kawhi,然后点击下面Add Core按钮即可成功创建core。

  页面显示创建成功之后,会在你刚才创建的kawhi文件夹下面生成一个data文件夹和一个core.properties文件,这样即表示创建成功。

4、创建springboot项目和测试代码

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
server:
  port: 8087
spring:
  data:
    solr:
      #后面这个kawhi就是刚才创建文件夹的名称,这里也可以不用写这个,如果这里不指定,那么在代码中使用的时候,就必须指定(后面代码有提到)。
      host: http://127.0.0.1:8983/solr/kawhi
@Getter
public class News{
    @Field
    private String id;
    @Field
    private String name;
    @Field
    private String author;
    @Field
    private String keywords;
    @Field
    private String category;
    @Field
    private String url;

    public News(String id, String name, String author, String keywords, String category, String url) {
        this.id = id;
        this.name = name;
        this.author = author;
        this.keywords = keywords;
        this.category = category;
        this.url = url;
    }
}
@RestController
@RequestMapping("/solr")
public class SolrController {

    @Autowired
    private SolrClient client;

    private static List<News> newsList= null;

    static{
        newsList = new ArrayList<>();
        newsList.add(new News(String.valueOf(System.currentTimeMillis() + 0l), "季后赛场均赢22分!广东这是刚重建就能冲冠?", "新浪体育",
                "季后赛,广东,冲冠", "体育", "http://sports.sina.com.cn/cba/2017-03-01/doc-ifycaafm4644256.shtml"));
        newsList.add(new News(String.valueOf(System.currentTimeMillis() + 1l), "广东晋级仍攒人品 杜锋:已达成赛季预期目标", "苏俊朗",
                "广东,杜锋,赛季,目标", "体育", "http://sports.sina.com.cn/cba/2017-03-02/doc-ifycaasy7215085.shtml"));
        newsList.add(new News(String.valueOf(System.currentTimeMillis() + 2l), "关键的季后赛杜锋却要废掉他,这样的广东队隐患很大", "开心奎哥",
                "季后赛,杜锋,广东,隐患", "体育", "http://blog.sina.com.cn/s/blog_7e892c0b0102x7jb.html?tj=tiyu"));
        newsList.add(new News(String.valueOf(System.currentTimeMillis() + 3l), "CBA新科MVP正与NBA球队接触 季后赛后加盟?”", "新浪体育",
                "CBA,NBA,季后赛", "体育", "http://sports.sina.com.cn/basketball/nba/2017-03-02/doc-ifycaafm4672837.shtml"));
    }

    @GetMapping("/batchInsert")
    public String insert() throws IOException, SolrServerException {
        try {
            /* 批量插入方案一 */
            /*List<SolrInputDocument> solrInputDocumentList = new ArrayList<>();
            for (int i = 0; i < newsList.size(); i ++){
                News news = newsList.get(i);
                SolrInputDocument solrInputDocument = new SolrInputDocument();
                solrInputDocument.setField("id", news.getId());
                solrInputDocument.setField("name", news.getName());
                solrInputDocument.setField("author", news.getAuthor());
                solrInputDocument.setField("keywords", news.getKeywords());
                solrInputDocument.setField("category", news.getCategory());
                solrInputDocumentList.add(solrInputDocument);
            }
            client.add(solrInputDocumentList);//如果配置文件中没有指定core,这个方法的第一个参数就需要指定core名称,比如client.add("kawhi", doc);*/

            /* 批量插入方案二(实体类属性必须指定@Field注解) */
            client.addBeans(newsList);

            client.commit();//如果配置文件中没有指定core,这个方法的第一个参数就需要指定core名称client.commit("kawhi");
            return "success";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "error";
    }

    @GetMapping("/query")
    public String query(@RequestParam(required = true) String name) throws IOException, SolrServerException {
        try {
            /** 根据字段查询 */
            SolrQuery solrQuery = new SolrQuery();
            // 查询的关键字
            solrQuery.setQuery("name:" + name);
            // 指定返回的字段
            solrQuery.setFields("id", "name", "category");
            // 分页,类似Mysql的limit
            solrQuery.setStart(0);
            solrQuery.setRows(2);
            // 排序方式
            //solrQuery.setSort("id", SolrQuery.ORDER.desc);

            QueryResponse queryResponse = client.query(solrQuery);

            /* 查询结果 */
            SolrDocumentList solrDocumentList = queryResponse.getResults();
            System.out.println("查询结果数量为:" + solrDocumentList.getNumFound() + "\n");
            solrDocumentList.stream().forEach(solrDocument -> {
                System.out.println("id=" + solrDocument.get("id"));
                System.out.println("name=" + solrDocument.get("name"));
                System.out.println("author=" + solrDocument.get("author"));// 上面没有指定返回,所以这里应该是空
                System.out.println("keywords=" + solrDocument.get("keywords"));// 上面没有指定返回,所以这里应该是空
                System.out.println("category=" + solrDocument.get("category"));
                System.out.println("url=" + solrDocument.get("url") + "\n");// 上面没有指定返回,所以这里应该是空
            });

            return "success";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "error";
    }

    @GetMapping("/queryHight")
    public String queryHight(@RequestParam(required = true) String name) throws IOException, SolrServerException {
        try {
            /** 根据字段查询 */
            SolrQuery solrQuery = new SolrQuery();
            // 查询的关键字
            solrQuery.setQuery("name:" + name);
            // 指定返回的字段
            solrQuery.setFields("id", "name", "category");
            //参数hl,设置高亮
            solrQuery.setHighlight(true);
            //设置高亮的字段
            solrQuery.addHighlightField("name");
            //设置高亮的样式
            solrQuery.setHighlightSimplePre("<font color='red'>");
            solrQuery.setHighlightSimplePost("</font>");

            QueryResponse queryResponse = client.query(solrQuery);

            // 高亮结果
            Map<String, Map<String, List<String>>> hightResults = queryResponse.getHighlighting();
            // 查询结果
            SolrDocumentList solrDocumentList = queryResponse.getResults();
            System.out.println("查询结果数量为:" + solrDocumentList.getNumFound() + "\n");
            solrDocumentList.stream().forEach(solrDocument -> {
                String id = solrDocument.getFieldValue("id").toString();

                Map<String, List<String>> hightResult = hightResults.get(id);
                if(hightResult.size() > 0){
                    System.out.println("nameHight=" + hightResult.get("name").get(0));
                }

                System.out.println("name=" + solrDocument.get("name"));
                System.out.println("category=" + solrDocument.get("category") + "\n");
            });

            return "success";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "error";
    }

    @GetMapping("/deleteAll")
    public String deleteAll() throws IOException, SolrServerException {
        try {
            client.deleteByQuery("*:*");
            client.commit();

            return "success";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "error";
    }
}

  启动该项目之后,浏览器输入 http://localhost:8087/solr/batchInsert 地址即可测试插入索引操作。

  插入成功之后,在solr管理界面的左下方有一个下拉框,选择你创建的core之后,再选择Query,往下拖到最后,点击Execute Query即可看见你刚才插入的索引。

  上面controller中包含以下四个操作连接:

    删除所有:http://localhost:8087/solr/deleteAll

    批量插入:http://localhost:8087/solr/batchInsert

    通过name查询:http://localhost:8087/solr/query?name=%E5%AD%A3%E5%90%8E%E8%B5%9B

    通过name高亮查询:http://localhost:8087/solr/queryHight?name=%E5%AD%A3%E5%90%8E%E8%B5%9B

其他问题:

  刚才我们代码中插入了6个列(id、name、author、keywords、category、url),如果你想新增一个列,比如列名叫做 name_new,然后启动项目,在插入索引,在solr管理平台中就看不见这个列名和列对应的值,原因是id、name、author、keywords、category、url这6列在solr中已经默认配置了。这种情况解决方式如下:

  在你创建的kawhi文件夹下面,打开conf文件夹,修改里面的managed-schema文件,修改地点如下:

132行后面增加(后面这几行随意位置增加就可以)
<field name="name_new" type="text_general" indexed="true" stored="true"/>

245行后面增加(后面这几行随意位置增加就可以)
<copyField source="name_new" dest="text"/>

  修改完成之后重启solr,然后重新插入索引就可以成功操作了。

}
posted @ 2019-06-03 12:52  不出特产不出矿  阅读(1918)  评论(0)    收藏  举报