初识SolrJ开发, schema.xml的配置与服务初始化.
生活随笔
收集整理的這篇文章主要介紹了
初识SolrJ开发, schema.xml的配置与服务初始化.
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
schema.xml位于solr/collection1/conf/目錄下,是Solr中用戶定義字段類型及字段的配置文件.
Solr版本: 4.6.0
第一步: Schema.xml說明
實例schema.xml結構同solr/collection1/conf/schema.xml結構一致,具體配置通過注解已注明.
<?xml version="1.0" encoding="UTF-8" ?> <schema name="example" version="1.5"> <fields><!--field屬性說明:filed字段用于定義數據源字段所使用的搜索類型與相關設置.name:數據源字段名,搜索使用到.type:搜索類型名例如中文ika搜索名text_ika,對應于fieldType中的name.不需要分詞的字符串類型,string即可,如果需要分詞,types中配置好的分詞type。indexed:是否被索引,只有設置為true的字段才能進行搜索排序分片(earchable, sortable, facetable)。stored:是否存儲內容,如果不需要存儲字段值,盡量設置為false以提高效率。multiValued:是否為多值類型,SOLR允許配置多個數據源字段存儲到一個搜索字段中。多個值必須為true,否則有可能拋出異常。--><field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="name" type="text_ik" indexed="true" stored="true" multiValued="false"/> <field name="phone" type="string" indexed="false" stored="true" /> <field name="email" type="string" indexed="false" stored="true" multiValued="true" /> <field name="city_id" type="int" indexed="true" stored="true" /> <field name="address" type="text_ik" index="true" stored="true" /> <field name="all" type="string" index="true" stored="true" /><!-- 動態字段定義通過*來定義 --><dynamicField name="*_i" type="int" indexed="true" stored="true"/><dynamicField name="*_s" type="string" indexed="true" stored="true"/></fields><!--uniqueKey節點設置主鍵,solr必須有一個主鍵,一般為id也可以自行定義.這個字段決定和增強文檔的唯一性--> <uniqueKey>id</uniqueKey><!--defaultSearchField節點默認搜索的字段,默認值為text, 如果我們已經將需要搜索的字段拷貝至all字段了,在這里設為all即可--> <defaultSearchField>text</defaultSearchField> <!--solrQueryParser節點默認搜索操作符參數,及搜索短語間的邏輯,用AND增加準確率,用OR增加覆蓋面,建議用AND,也可在搜索語句中定義。例如搜索"Java 多線程",使用AND默認搜索為"Java AND 多線程"--> <solrQueryParser defaultOperator="OR"/><!--copyField節點如果我們的搜索需要搜索多個字段該怎么辦呢?這時候,我們就可以使用copyField節點,我們將所有的中文分詞字段全部拷貝至all中,當我們進行全文檢索是,只用搜索all字段就OK了. --> <copyField source="name" dest="all" /> <copyField source="phone" dest="all" /> <copyField source="email" dest="all" /><types><!--定義字段處理類型 --><fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" /> <fieldType name="text" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.WhitespaceTokenizerFactory" /> </analyzer> </fieldType> <!-- 定義常規分詞 類型--><fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"><!-- 建立索引時的分詞器配置 --><analyzer type="index"><!-- 建立索引時使用標準分詞器 --><tokenizer class="solr.StandardTokenizerFactory"/><!-- 停用詞過濾器, 用于索引文檔中的停用詞去掉 --><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /><!-- 大寫轉小寫過濾器 --><filter class="solr.LowerCaseFilterFactory"/></analyzer><!-- 查詢的時候使用的分詞器 --><analyzer type="query"><!-- 查詢索引時使用標準分詞器 --><tokenizer class="solr.StandardTokenizerFactory"/><!-- 停用詞過濾器, 用于索引文檔中的停用詞去掉 --><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /><!-- 定義查詢的時使用同義詞過濾器 --><filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/><!-- 大寫轉小寫過濾器 --><filter class="solr.LowerCaseFilterFactory"/></analyzer></fieldType><!--定義IK分詞類型--><fieldType name="text_ik" class="solr.TextField"><!--索引時候的分詞器--><analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/><!--查詢時候的分詞器--><analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType></types></schema>在默認的solr/collection1/conf/schema.xml文件中,有如下field設定,其中title配置為允許多個值,所以我們抽象類中可以用集合標示.
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/> <field name="author" type="text_general" indexed="true" stored="true"/>第二步: 創建相應的抽象類
package com.test.model; import java.io.Serializable; import java.util.List; import org.apache.commons.lang.builder.ToStringBuilder;public class Article implements Serializable{/*** */private static final long serialVersionUID = 4017316764889231758L;private String id;private List<String> title;private String author;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public List<String> getTitle() {return title;}public void setTitle(List<String> title) {this.title = title;}@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this);}}第三步: 創建solr客戶端
package com.plugin.solr.client;import java.util.Collections; import java.util.HashMap; import java.util.Map;import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class SolrClient {private static final Logger LOG = LoggerFactory.getLogger(SolrClient.class);private static Map<String, SolrServer> solrServerMap = Collections.synchronizedMap(new HashMap<String, SolrServer>());/*** 獲取HttpSolrServer* * @param SOLR_URL* * @return SolrServer*/public static SolrServer getHttpSolrServer(final String solrURL) {SolrServer solrServer = null;if (!solrServerMap.containsKey(solrURL)) {try {solrServer = new HttpSolrServer(solrURL);if (solrServer != null) {solrServerMap.put(solrURL, solrServer);LOG.info("Load " + solrURL + " finish.");}} catch (Exception e) {LOG.warn("sorlURL error ," + solrURL);e.printStackTrace();}}return solrServerMap.get(solrURL);} }第四步: 編寫客戶端連接檢測方法并測試
/*** ping檢測solr是否down掉 [測試通過]* @param server* @return*/public static String ping(SolrServer server){try {return server.ping().getResponse().toString();} catch (SolrServerException e) {LOG.error("Solr system ping error " + e.getMessage(), e);} catch (IOException e) {LOG.error("Solr system ping error " + e.getMessage(), e);}return null;}啟動tomcat服務器(前提是solr與tomcat已集成),本地tomcat端口為8888,編寫junit測試
package com.test.search;import java.util.ArrayList; import java.util.List; import java.util.UUID;import org.apache.solr.client.solrj.SolrServer; import org.junit.Before; import org.junit.Test;import com.plugin.page.Page; import com.plugin.solr.client.SolrClient; import com.plugin.solr.engine.SolrEngineHandler; import com.test.model.Article;public class SolrTest {private SolrServer server;@Beforepublic void init(){String solrURL = "http://localhost:8888/solr"; server = SolrClient.getHttpSolrServer(solrURL);}@Testpublic void pingSolr(){System.out.println("ping solr result: " +SolrEngineHandler.ping(server));} }運行結果
ping solr result: {responseHeader={status=0,QTime=656,params={df=text,echoParams=all,rows=10,echoParams=all,wt=javabin,version=2,q=solrpingquery,distrib=false}},status=OK}連接成功.
轉載請注明出處:[http://www.cnblogs.com/dennisit/p/3620597.html]
轉載于:https://www.cnblogs.com/dennisit/p/3620597.html
總結
以上是生活随笔為你收集整理的初识SolrJ开发, schema.xml的配置与服务初始化.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标准粒子群优化算法 PSO
- 下一篇: Drools规则引擎简介