zoukankan      html  css  js  c++  java
  • 初识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;
        }
        
        @Override
        public 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;
        
        
        @Before
        public void init(){
            String solrURL = "http://localhost:8888/solr"; 
            server = SolrClient.getHttpSolrServer(solrURL);
        }
        
        @Test
        public 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]

  • 相关阅读:
    dp第三题
    近期(2012/5/15)
    HTML5 地理位置定位(HTML5 Geolocation)原理及应用【转】
    xml 中如何正确使用 & 符号
    Python进阶07 函数对象【转】
    Android 快捷小工具
    解决数据库乱码问题【转】
    Android APK反编译详解(附图)
    字符串转日期【20080808080808】
    HTML+5+从入门到精通
  • 原文地址:https://www.cnblogs.com/dennisit/p/3620597.html
Copyright © 2011-2022 走看看