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

接着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;
    }

}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页