zoukankan      html  css  js  c++  java
  • 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>.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);
    //            }
    //        }
            
        }

    运行结果:

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

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

  • 相关阅读:
    dedecms图片列表效果调用
    ThinkPHP 中M方法和D方法的具体区别
    在线更新dede程序后 网站出现错误 DedeCMS Error:Tag disabled:"php" more...!
    Form元素示例
    PHP使用frameset制作后台界面时,怎样实现通过操作左边框架,使右边框架中的页面跳转?
    删除UTF-8 BOM头的GUI小工具
    解决 ultraedit 菜单字体模糊
    git使用及一些配置、问题
    shell之基本语法
    shell之iptables
  • 原文地址:https://www.cnblogs.com/LUA123/p/8283131.html
Copyright © 2011-2022 走看看