准备:配置好solr服务器以及咱们的词库java
步骤:shell
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,配置好数据库的相关导入配置,特别注意须要查询的字段的数据类型是咱们上面配置好的分词类型apache
<field name="mall_title" type="textComplex" indexed="true" stored="true" required="true" multiValued="true" />
其余的配置这里不写了,以前都有些过服务器
3,导入数据库数据,做为演示,咱们能够直接在界面上导入。而在实际运用中,可能须要配置定时任务进行增量导入。注意,导入以前必定要先配置好词库,这样在索引的时候才会按照指定的分词进行索引,才能够查询出数据,要否则是查询不出数据的。
测试
4,测试查询 ui
咱们的分词配置以下:url
爱他美 高富帅 荷兰 牛栏 特福芬 有机奶粉 喜宝
在界面中,搜索 “爱他美”spa
能够出来对应的结果,而后高亮显示再试试code
若是没有按照咱们指定的分词进行查询,那么有可能出现两种状况,一种是搜索不到数据,另外一种是分词不识别 “爱他美”这个词,将他们拆成了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]}}