solr测试项目(下)--索引数据与查询

来源:互联网 发布:站长站源码 编辑:程序博客网 时间:2024/06/05 07:11

接着solr测试项目(中)–整合spring-data-mongo
和solr测试项目(上)–基于maven的springmvc环境搭建

今天开始导入数据和实现查询

Schema API

如果没有定义Fields,那么所有的Fields都是数组类型[]

这里写图片描述

所以第一步就是根据对象模型创建Fields,这里使用Schema API,而且类型都很简单。

这里写图片描述

Fields创建好之后,新增的数据

这里写图片描述

过程

这里写图片描述

存在的问题

在用schema api创建fields的时候没有为中文分词,导致查询时将所有的中文按照汉字一个一个分开,只要匹配到就查询到任何一个就被查询出来

查询“猫和老鼠”,正确的查询结果应该只有一个,而实际查询除了3个,如果自定字段查询比如name:猫和老鼠,那么只能是完全匹配,像这个name是“猫和老鼠爆笑精华版”的就无法匹配到

这里写图片描述

这里写图片描述

这里写图片描述

解决方案

参考Solr6.1配置中文分词
配置好中文分词,并定义了一个fieldType为text_ik

第一步 创建field

接口地址

http://localhost:8983/solr/wechat/schema

请求方式:POST
请求报文:

{    "add-field" : {        "name" : "name",        "type" : "text_ik"    },    "add-field" : {        "name" : "actors",        "type" : "text_ik"    },    "add-field" : {        "name" : "description",        "type" : "text_ik"    },    "add-field" : {        "name" : "directors",        "type" : "text_ik"    }}

这里写图片描述

重建索引

现在已name:猫和老鼠就可以查到了,如果没有中文分词,name必须是猫和老鼠爆笑精华版

这里写图片描述

我们测试一下没有分词的样子

新建一个testcore

这里写图片描述

使用schema api创建fields,因为如果不创建的话就是数组类型。

接口地址

http://localhost:8983/solr/testcore/schema

请求方式:POST
请求报文:

{    "add-field" : {        "name" : "name",        "type" : "string"    },    "add-field" : {        "name" : "actors",        "type" : "string"    },    "add-field" : {        "name" : "description",        "type" : "string"    },    "add-field" : {        "name" : "directors",        "type" : "string"    },    "add-field" : {        "name" : "showtime",        "type" : "string"    },    "add-field" : {        "name" : "imgurl",        "type" : "string"    },    "add-field" : {        "name" : "playcount",        "type" : "int"    },    "add-field" : {        "name" : "userscore",        "type" : "int"    },    "add-field" : {        "name" : "imguistyle",        "type" : "int"    }}

接下来我们导入数据,倒入数据后看一下具体的一条数据

这里写图片描述

没有中文分词

SolrQuery query = new SolrQuery();query.setQuery("name:猫和老鼠");QueryResponse rsp = client.query(query);SolrDocumentList docs = rsp.getResults();System.out.println(docs);query.setQuery("name:猫和老鼠爆笑精华版");QueryResponse rsp1 = client.query(query);SolrDocumentList docs1 = rsp1.getResults();System.out.println(docs1);

没有配置分词必须完全匹配

这里写图片描述

如果配置了分词则都可以查找到

这里写图片描述

总结

从头到尾测试了一下solr,也总结了一下之前用过的maven,spring,mongo,solr

附Solrj工具类

import org.apache.solr.client.solrj.SolrClient;import org.apache.solr.client.solrj.beans.DocumentObjectBinder;import org.apache.solr.client.solrj.impl.HttpSolrClient;import org.apache.solr.common.SolrInputDocument;public class SolrjTest {    private static SolrClient client;    private static String url;    static {        url = "http://localhost:8983/solr/wechat";        client = new HttpSolrClient.Builder(url).build();    }    /**     * 保存或者更新solr数据     *      * @param res     */    public static <T> boolean saveSolrResource(T solrEntity) {        DocumentObjectBinder binder = new DocumentObjectBinder();        SolrInputDocument doc = binder.toSolrInputDocument(solrEntity);        try {            client.add(doc);            client.commit();        } catch (Exception e) {            e.printStackTrace();            return false;        }        return true;    }    /**     * 删除solr 数据     *      * @param id     */    public static boolean removeSolrData(String id) {        try {            client.deleteById(id);            client.commit();        } catch (Exception e) {            e.printStackTrace();            return false;        }        return true;    }}
0 0