A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王高飞 于 2018-12-19 13:39 编辑
一 solr添加自定义Field
1 找到SorlHome下的config/schema.xml 修改内部的配置
    内部配置说明:
    1 field:
          name:域名称   
          type:域类型 这里的type不是普通的  而是solr中的类型   
          indexed:是否创建索引   
          store:是否存储   
          required:必须的
          multiValued:是否可多值 放到数组里 存储一个用户的好友id(多个)
    2 dynamicField: *_i  动态域,扩展了域  可以使用域名:size_i,name_i,gender_i,school_i等
    3 <uniqueKey>id</uniqueKey> :id作为唯一标识
    4 copyField属性:source源域名
                     dest目标域名
                     可以将多个Field复制到一个Field中,以便进行统一的检索
                     用来做分组查询 查目标域名就是查所有的源域 or连接
    5 FieldType:类型   
            name:是这个FieldType的名称
            class:是Solr提供的包solr.TextField,solr.TextField 允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter)
            positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误,此值相当于Lucene的短语查询设置slop值,根据经验设置为100。
    6 默认情况下:
        索引分析器中:使用solr.StandardTokenizerFactory标准分词器,solr.StopFilterFactory停用词过滤器,solr.LowerCaseFilterFactory小写过滤器。
        搜索分析器中:使用solr.StandardTokenizerFactory标准分词器,solr.StopFilterFactory停用词过滤器,这里还用到了solr.SynonymFilterFactory同义词过滤器。
2    自定义Field  自定义FieldType 使用分析器IKAnayner 在schema.xml中加以下配置:
    //自定义field
     
[XML] 纯文本查看 复制代码
  
       <field name="title_ik" type="text_ik" indexed="true" stored="true" />
       <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>

    //自定义类型 使用IKAnalyzer分词器-->
      
[XML] 纯文本查看 复制代码
 
        <fieldType name="text_ik" class="solr.TextField">
          <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
        </fieldType>

3  把IKAnalyzer2012FF_u1.jar添加到服务器下的solr项目 solr/WEB-INF/lib
4  把IKAnayner的3个配置文件(配置文件和自定义词典和停用词词典)放到项目WEB-INF/classes文件夹下 没有classes就创建该文件夹
二 数据库的数据导入到索引库中
     定义dataimport-handler: lib 加载的jar
     1 导入jar 两个 放到solrHome\collection1\lib 没有lib自己创建的lib  再添加驱动包
         solr-4.10.3\dist\solr-dataimporthandler-extras-4.10.3.jar
         solr-4.10.3\dist\ solr-dataimporthandle-4.10.3.jar
     2 配置solrHome\collection1\conf\solrconfig.mxl文件,添加一个requestHandler。
      
[XML] 纯文本查看 复制代码
    

          <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">

            <lst name="defaults">
              <str name="config">data-config.xml</str>
             </lst>
          </requestHandler>

     3 创建配置文件data-config.xml 放到solrconfig.xml同目录 添加数据库的配置 添加数据库驱动jar
      
[XML] 纯文本查看 复制代码
 
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root"
password="root"/>
<document>
<entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products ">
<field column="pid" name="id"/>
<field column="name" name="product_name"/>
<field column="catalog_name" name="product_catalog_name"/>
<field column="price" name="product_price"/>
<field column="description" name="product_description"/>
<field column="picture" name="product_picture"/>
</entity>
</document>
</dataConfig>

     4 在SorlHome下的config/schema.xml文件中自定义域:
      
[XML] 纯文本查看 复制代码
  <!--类型IKAnalyzer 使用Ik分析器-->
        <fieldType name="text_ik" class="solr.TextField">
          <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
        </fieldType>
        

        //已经定义好的类型分析器text_ik 已经有的域就不用定义了 id域
      
[XML] 纯文本查看 复制代码
 
       <field name="product_name" type="text_ik" indexed="true" stored="true"/>
       <field name="product_price"  type="float" indexed="true" stored="true"/>
       <field name="product_description" type="text_ik" indexed="true" stored="false" />
       <field name="product_picture" type="string" indexed="false" stored="true" />
       <field name="product_catalog_name" type="string" indexed="true" stored="true" />
       <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
       <copyField source="product_name" dest="product_keywords"/>
       <copyField source="product_description" dest="product_keywords"/>

     5 再次重启tomcat 点击“execute”按钮导入数据
       导入数据前会先清空索引库,然后再导入。
三  solr设置条件查询
        q:查询条件  
        fq:过滤掉查询结果中id为1的  id:1 在q查询符合结果中同时是fq查询符合的
           [包含临界值]   price:[0 TO 5]   
           {不包含临界值} price:{* To 100}
        sort: 按照id升序 id asc
              按照id降序 id desc
        start,rows:分页     默认显示10条
                    start:开始查询的索引
                    rows:显示的条数
        fl:id title 显示要显示的列/域 指定返回那些字段内容,用逗号或空格分隔多个
        df:可以指定默认查询的域 查询条件就可以简写了直接写该域的值
        wt:写出的数据格式  xml, json, php, phps等
        hl:enable highlight 高亮显示 hl是否高亮 ,设置高亮Field,设置格式前缀和后缀。
           fl:要高亮显示的列  product_name
           hl.simple.pre:开始标签 <span color="red">
           hl.simple.post:结束标签</span>
四 在java代码中设置solr查询条件:
   
[Java] 纯文本查看 复制代码
    solrQuery.setQuery("花儿朵朵")//设置主条件
    solrQuery.add("fq", "product_catalog_name:时尚卫浴");//设置过滤条件
    //注意多个fq条件的时候要使用add添加多个条件 不能使用set,set会覆盖前面的条件
    solrQuery.setStart(0);//设置起始位置
    solrQuery.setRows(10);//设置条数
    solrQuery.add("df","product_keywords");//设置默认查询的域名
    solrQuery.setSort("product_price", ORDER.asc);//设置排序
    //设置高亮的字段 主查询条件必须有的
    solrQuery.setHighlight(true);//开启高亮
    solrQuery.setHighlightSimplePre("<span color=\"red\">");
    solrQuery.setHighlightSimplePost("</span>");
    solrQuery.addHighlightField("product_name");//高亮需要包住的字段
    查询出来的总条数:results.getNumFound()

11 个回复

倒序浏览
回复 使用道具 举报
mark
回复 使用道具 举报
回复 使用道具 举报
谢谢分享~
回复 使用道具 举报
张志辉 来自手机 中级黑马 2018-12-19 14:38:25
地板
学习了,很详细
回复 使用道具 举报
回复 使用道具 举报
关于原理部分,请参考: http://www.importnew.com/12707.html
回复 使用道具 举报
回复 使用道具 举报
顶顶顶顶顶起来
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马