当前位置: 代码迷 >> 综合 >> Solr7.1--- 高亮查询
  详细解决方案

Solr7.1--- 高亮查询

热度:94   发布时间:2024-01-06 14:07:17.0

 如果你看过我前面的文章,直接打开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);
//            }
//        }
        }
复制代码

 

运行结果:

 

如果放在前台大概是这样的:

细心会发现,通过高亮获得的文本只是一部分,想一下也是情理之中。当我们使用搜索功能的时候,每条信息显示的只是摘要。