準備:配置好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]}}