• 8.1Solr API使用(分页,高亮)


    转载请出自出处:http://www.cnblogs.com/hd3013779515/

    一、Solr Deep Paging(深分页)

    长期以来,我们一直有一个深分页问题。如果直接跳到很靠后的页数,查询速度会比较慢。这是因为Solr的需要为查询从开始遍历所有数据。直到Solr的4.7这个问题一直没有一个很好的解决方案。直到solr4.7引入了游标才解决这个问题。游标是一个动态结构,不需要存储在服务器上。游标包含了查询的结果的偏移量,因此,Solr的不再需要每次从头开始遍历结果直到我们想要的记录,游标的功能可以大幅提升深翻页的性能。

    在第一个查询中,我们需要传递一个额外的参数- cursorMark = *,告诉Solr返回游标。在返回中除了搜索结果,我们还可以得到nextCursorMark信息。

    http://192.168.137.168:8080/solr/collection1/select?q=*:*&rows=2&sort=stu_name asc,id asc&cursorMark=*

    001

    下一页查询时,使用上一次查询返回的nextCursorMark。

    http://192.168.137.168:8080/solr/collection1/select?q=*:*&rows=2&sort=stu_name asc,id asc&cursorMark=AoIlamVycnkqMTAwMDAwMDAwNQ==

    002

    二、高亮

    hl  是否高亮,hl=true,表示采用高亮

    hl.fl  设定高亮显示的字段,用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高亮默认字段,standard查询解析器时,会用df参数,dismax查询解析器时,会用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用hl.requiredFieldMatch选项。

    hl.requireFieldMatch   如果置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。它的默认值是false。

    hl.usePhraseHighlighter   如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。

    hl.highlightMultiTerm   如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。

    hl.fragsize   返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。

    Solr高亮设置后执行查询,其实就是多了highlighting的字段,并没有改变原来返回的字段内容。

    SolrJ有三种高亮类型

    如果要对某field做高亮显示,必须对该field设置stored=true

    Standard Highlighter,根据查询的docIdSet,获取Documents,并获取当前document的需要高亮的field的value,根据query的term和该field的value做匹配算法
    FastVector Highlighter,效率比普通的高亮显示要高;需要定义termvector(占用空间和IO),包括position和offset,根据query term的termvector到field value中做快速的定位标记,进而实现快速的高亮显示
    Postings Highlighter,由于高亮显示需要对field设置为store=true,所有对于单节点数据量比较大并且该字段比较大的话,会消耗大量的IO操作,那么可以把该字段存储在另外的地方,比如Hbase,在外部做高亮显示的匹配。

    003

    package cn.ljh.ssm.test;
    
    import java.util.List;
    import java.util.Map;
    
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.SolrServerException;
    import org.apache.solr.client.solrj.impl.HttpSolrServer;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.SolrDocument;
    import org.apache.solr.common.SolrDocumentList;
    import org.junit.Test;
    
    public class SolrHighlightingTest {
       
        @Test
        public void testQueryStudent(){
            try {
                HttpSolrServer server = HttpSolrServerSingleton.getInstance();
                
                SolrQuery query = new SolrQuery();  
                query.setQuery("stu_address:中山");  
                query.setHighlight(true);                //开启高亮  
                query.setHighlightFragsize(10);          //返回的字符个数  
                query.setHighlightRequireFieldMatch(true);  
                query.setHighlightSimplePost("<aa>");    //前缀  
                query.setHighlightSimplePre("</aa>");    //后缀  
                query.setParam("hl.fl", "stu_address");      //高亮字段  
                QueryResponse req = server.query(query);  
                SolrDocumentList list= req.getResults();  
                Map<String, Map<String, List<String>>>  map=req.getHighlighting();  
                for (SolrDocument doc : list) {  
                    System.out.println(map.get(doc.getFieldValue("id").toString()));  
                }  
            } catch (SolrServerException e) {
                e.printStackTrace();
            }
        }
        
    }

    004

  • 相关阅读:
    IsIconic() OnPaint里的用途
    中值滤波
    一个小学生题库生成器
    音视频同步
    [转]字符编码笔记:ASCII,Unicode和UTF8
    项目中常见bug及解决方法
    TSQL基础chp10可编程对象学习笔记[上]
    使用UdpAppender时出现了“使用了与请求协议不兼容的地址”的解决办法
    .net gridview 任意单击某行跳转到新的页面,并且新页面的参数来自于与gridview中的不可见字段
    数组去重的四种方法
  • 原文地址:https://www.cnblogs.com/hd3013779515/p/6882774.html
Copyright © 2020-2023  润新知