解决solr关键字搜索高亮,截断语句(不是完整的一句话)问题,附带按关键字权重排序

用的ik分词器

所在core的solrconfig.xml部分配置

<requestHandler name="/select" class="solr.SearchHandler">
     <lst name="defaults">
         <str name="echoParams">explicit</str>
         <int name="rows">10</int>	   
         <str name="defType">edismax</str>
	  <str name="qf">name^20 descripe^2 text ^2</str>
	  <str name="hl.usePhraseHighlighter">false</str>
	 <str name="hl.useFastVectorHighlighter">true</str>
	 <str name="hl.boundaryScanner">breakIterator</str>
	  <str name="hl.encoder">html</str>
          <str name="hl.formatter">htmla</str>
     </lst>
  </requestHandler>


<searchComponent class="solr.HighlightComponent" name="highlight">
   <highlighting>  		
    <formatter name="htmla" default="true" class="solr.highlight.HtmlFormatter">
        <lst name="defaults">
          <str name="hl.simple.pre"><![CDATA[<b>]]></str>
          <str name="hl.simple.post"><![CDATA[</b>]]></str>
        </lst>
      </formatter>
      <encoder name="html" class="solr.highlight.HtmlEncoder" />  		
	  	<boundaryScanner name="default" default="false" class="solr.highlight.SimpleBoundaryScanner">
  	      <lst name="defaults">
                 <str name="hl.bs.maxScan">10</str>
          	  <str name="hl.bs.chars">.,!? </str>
              </lst>
	  	</boundaryScanner>
	  	<boundaryScanner name="breakIterator" default="true" class="solr.highlight.BreakIteratorBoundaryScanner">
	  		<lst name="defaults">
	  	      <str name="hl.bs.type">SENTENCE</str>
	  		</lst>
	  	</boundaryScanner>
  	</highlighting>
  </searchComponent>

 所在core的schema.xml部分配置

<field name="text" type="text_ik" indexed="true" stored="true" omitNorms="true" termVectors="true" termPositions="true" termOffsets="true"/>
<field name="name" type="text_ik" indexed="true" stored="true" omitNorms="true" termVectors="true" termPositions="true" termOffsets="true"/>
<field name="descripe" type="text_ik" indexed="true" stored="true" omitNorms="true" termVectors="true" termPositions="true" termOffsets="true"/>

用solrquery查询 版本是5.4.1

        StringBuilder params = new StringBuilder();
        params.append("name:测试 OR descripe:测试 OR text:测试");

        SolrQuery sq = new SolrQuery();        
        sq.setHighlight(true);
        sq.setQuery(params.toString());
        sq.set("defType","dismax");
        sq.setStart(1);  
        sq.setRows(20);//每一页多少值        
        sq.setHighlightFragsize(20);//分片大小
        sq.setHighlightSnippets(1);
        sq.setRequestHandler("/select");
        sq.set("fl", "*,score");
        sq.addSort(new SortClause("score", ORDER.desc)); // 排序  

HttpSolrClient hsc = new HttpSolrClient("http://地址:端口/solr/bookCore");

几个关键点

hl.usePhraseHighlighter

hl.useFastVectorHighlighter   

<str name="defType">edismax</str>

<str name="qf">name^20 descripe^2 text ^2</str>(^后面是分值)

<str name="hl.boundaryScanner">breakIterator</str>

这个参数的意思,网上有很多,这里就不介绍了

原文地址:https://www.cnblogs.com/zxcgy/p/7160618.html