由于测试数据比较少,昨天用Java爬了简书的几百篇文章,唉,又特么两点多睡的。如果你需要这些测试文件GitHub。
如果你看过我前面的文章,直接打开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>.insolr 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>.insolr 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>.insolr create -c jianshu -s 2 -rf 2 WARNING: Using _default configset. Data driven schema functionality is enabled b y default, which is NOT 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); // id Map<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); // } // } }
运行结果:
如果放在前台大概是这样的:
细心会发现,通过高亮获得的文本只是一部分,想一下也是情理之中。当我们使用搜索功能的时候,每条信息显示的只是摘要。