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

    xiaoxiao2023-03-24  2

    接着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; } }
    转载请注明原文地址: https://ju.6miu.com/read-1200229.html
    最新回复(0)