Solr之高亮查询

准备:配置好solr服务器以及我们的词库


步骤:

1,配置好我们的词库,然后将分词配置到 schema.xml 中

<fieldtype name="textComplex" class="solr.TextField" positionIncrementGap="100">
		<analyzer>
			<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="d:\solr\my_dic"/>
		</analyzer>
	</fieldtype>
	 
	<fieldtype name="textMaxWord" class="solr.TextField" positionIncrementGap="100">
		<analyzer>
			<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" />
		</analyzer>
	</fieldtype>
	 
	<fieldtype name="textSimple" class="solr.TextField" positionIncrementGap="100">
		<analyzer>
			<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="dic" />
		</analyzer>
	</fieldtype>

2,配置好数据库的相关导入配置,特别注意需要查询的字段的数据类型是我们上面配置好的分词类型

<field name="mall_title" type="textComplex" indexed="true" stored="true" required="true" multiValued="true" />

其他的配置这里不写了,之前都有些过

3,导入数据库数据,作为演示,我们可以直接在界面上导入。而在实际运用中,可能需要配置定时任务进行增量导入。注意,导入之前一定要先配置好词库,这样在索引的时候才会按照指定的分词进行索引,才可以查询出数据,要不然是查询不出数据的。

4,测试查询 

我们的分词配置如下:

爱他美
高富帅
荷兰
牛栏
特福芬
有机奶粉
喜宝

在界面中,搜索  “爱他美”

104402_s8ms_238296.png

可以出来对应的结果,然后高亮显示再试试

104811_AkCI_238296.png

104906_ATnv_238296.png

如果没有按照我们指定的分词进行查询,那么有可能出现两种情况,一种是搜索不到数据,另一种是分词不识别 “爱他美”这个词,将他们拆成了3个字,这样就会搜索到很多我们不想要的结果,并对他们每个字高亮了。

例如:

"5034032335": {
      "mall_title": [
        "德国<em>爱</em><em>他</em><em>美</em>Aptamil奶粉pre段 0-6个月  1200g"
      ]
    },

接下来,在java代码中测试一下

package demo;

import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;

public class DemoQuery {
	
	//solr url
    public static final String URL = "http://localhost:8080/solr";
    //solr应用
    public static final String SERVER = "mysolr";
    
    public static SolrClient getSolrClient(){
        return new HttpSolrClient(URL+"/"+SERVER);
    }
	
	public static void queryHighlight() {
		SolrClient client = getSolrClient();
		SolrQuery query = new SolrQuery();
		query.setQuery("mall_title:爱他美");
        query.setHighlight(true);//开启高亮功能
        query.addHighlightField("mall_title");//高亮字段
        query.setHighlightSimplePre("<em>");//渲染标签
        query.setHighlightSimplePost("</em>");//渲染标签
        query.setStart(1);
        query.setRows(10);
        
        QueryResponse response = null;
        try {
            response = client.query(query);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //查询结果集
        Map<String,Map<String,List<String>>> highlightMap=response.getHighlighting();
        System.out.println(highlightMap);
	}
	
	public static void main (String[] args) {
		queryHighlight();
	}
}

运行结果如下:

{5034032327={mall_title=[德国原装<em>爱他美</em>Aptamil奶粉 2+段2岁以上 600g *2]}, 5034032338={mall_title=[德国<em>爱他美</em>Aptami奶粉2段 6-10个月 1200g]}, 5034032320={mall_title=[德国原装<em>爱他美</em>Aptamil奶粉 2段6-10个月  800g]}, 5034032336={mall_title=[德国<em>爱他美</em>Aptamil奶粉1段 0-6个月  1200g]}, 5034032335={mall_title=[德国<em>爱他美</em>Aptamil奶粉pre段 0-6个月  1200g]}, 5034032325={mall_title=[德国原装<em>爱他美</em>Aptamil奶粉 1+段12个月以上  600g *2]}, 7217397550={mall_title=[德国原装<em>爱他美</em>Aptamil奶粉 2+段2岁以上 600g]}, 5034032324={mall_title=[德国原装<em>爱他美</em>Aptamil奶粉 3段10-12个月  800g]}, 5034032315={mall_title=[德国原装<em>爱他美</em>Aptamil奶粉 pre段0-6个月  800g]}, 5034032317={mall_title=[德国原装<em>爱他美</em>Aptamil奶粉 1段0-6个月  800g]}}


转载于:https://my.oschina.net/u/238296/blog/598727

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值