Solr7.1--- 高亮查询

Posted 小LUA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr7.1--- 高亮查询相关的知识,希望对你有一定的参考价值。

由于测试数据比较少,昨天用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>.\\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 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);
//            }
//        }
        
    }

 

运行结果:

 

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

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

 

以上是关于Solr7.1--- 高亮查询的主要内容,如果未能解决你的问题,请参考以下文章

Solr7.1---简单搜索

Elasticsearchelasticsearch 查询 高亮

Elasticsearch--搜索

Solr 高亮是不是还可以指示返回的片段在原始字段中的位置或偏移量?

03代码格式化+高亮

ES--highlight(高亮)查询