如果你看过我前面的文章,直接打开db-data-config.xml文件,添加一个entity
<entity name="jianshu" pk="a_id"query="select * from jianshu"deltaImportQuery="SELECT * FROM jianshu where a_id='${dataimporter.delta.a_id}'"><field column="A_ID" name="aId" /><field column="A_TITLE" name="aTitle" /><field column="A_CONTENT" name="aContent" /><field column="A_TIME" name="aTime" /></entity>
效果:
启动solr集群,然后添加一个名字为jianshu的Collection
D:\solr-7.1.0>.\bin\solr start -c -p 8983 -s example/cloud/node1/solr Waiting up to 30 to see Solr running on port 8983 Started Solr server on port 8983. Happy searching!D:\solr-7.1.0>.\bin\solr start -c -p 7574 -s example/cloud/node2/solr -z localho st:9983 Waiting up to 30 to see Solr running on port 7574 Started Solr server on port 7574. Happy searching!D:\solr-7.1.0>.\bin\solr create -c jianshu -s 2 -rf 2 WARNING: Using _default configset. Data driven schema functionality is enabled b y default, which isNOT RECOMMENDED for production use.To turn it off:curl http://localhost:8983/solr/jianshu/config -d '{"set-user-proper ty": { "update.autoCreateFields":"false"}}' Created collection 'jianshu' with 2 shard(s), 2 replica(s) with config-set 'jian shu'
打开控制台:多了一个jianshu的集合
选择jianshu
点击Schema,添加字段
完毕之后,点击DataImport
点击Query,看看数据是否到位
进行高亮查询--控制台操作
q:查询带有(爱情)的标题和内容
开启高亮,涉及的字段为标题和内容
看高亮结果
高亮查询--Java
实际中大多是用solrJ的API来完成。
// 单机--core,集群--Collection// 指向特定核心或集合的路径(例如,http://hostname:8983/solr/core1)的URL 。当在基本URL中指定核心或集合时,使用该客户端的后续请求不需要重新指定受影响的集合。但是,客户端仅限于向该核心/集合发送请求,而不能将请求发送给其他任何人。// 指向根Solr路径的URL(例如,http://hostname:8983/solr)。如果在基本URL中未指定核心或集合,则可以向任何核心/集合发出请求,但是必须在所有请求上指定受影响的核心/集合。public static SolrClient getClient(){final String solrUrl = "http://localhost:8983/solr"; // final String solrUrl = "http://localhost:8983/solr/bless";return new HttpSolrClient.Builder(solrUrl).withConnectionTimeout(10000).withSocketTimeout(60000).build();}
上面是用来获取客户端的,下面是高亮查询
/* 高亮样式.search-key{color: #d60e3c;font-size: 18px;font-weight: 600;}*/public static void queryOfHighlight() throws SolrServerException, IOException{final SolrClient client = getClient();final SolrQuery query = new SolrQuery("a_title:爱情 a_content:爱情");query.addField("a_id");query.addField("a_title");query.addField("a_content");query.addField("a_time");query.setHighlight(true).setHighlightSimplePre("<span class='search-key'>").setHighlightSimplePost("</span>");query.setParam("hl.fl", "a_title,a_content");final QueryResponse response = client.query("jianshu", query);Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); // 高亮查询的结果集Set<String> set = highlighting.keySet();for (String key : set) {System.out.println("++" + key); // idMap<String, List<String>> map = highlighting.get(key); // id对应的查询结果,可能有多个字段,所以是map结构Set<String> set2 = map.keySet(); // 字段名集合// 遍历字段for (String key2 : set2) {System.out.println("--" + key2); // 字段名List<String> list = map.get(key2); // 字段对应的值,因为分词了,所以是一个String列表for (String s : list) {System.out.print(s + " "); // 输出高亮的文本 }System.out.println();}}// 这段代码获取的是不加处理的结构 // SolrDocumentList results = response.getResults(); // System.out.println("查询到的:" + results.getNumFound()); // for (SolrDocument sd : results) { // Collection<String> names = sd.getFieldNames(); // for (String s : names) { // Object value = sd.getFieldValue(s); // System.out.println("名字?:" + s + ",值:" + value); // } // } }
运行结果:
如果放在前台大概是这样的:
细心会发现,通过高亮获得的文本只是一部分,想一下也是情理之中。当我们使用搜索功能的时候,每条信息显示的只是摘要。