`
mozhenghua
  • 浏览: 324487 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

solr通过单个fieldtype在document中创建多个field

 
阅读更多

 

          在现有的终搜框架之下如果业务方需要在document文档中设置multivalued的属性,例如淘宝房产有这样的需求,每一个房产小区,都有不同面积的户型,比如有40方、60、90、150方的户型。 在实际使用中查询列表页面会根据户型的大小给所有小区的在售房源分类,比如:会查询有40方房子的小区,或者有60方房子的户型,或者查询有50至100方房源的楼盘。
        做之前可以先和业务方协定好存放多值字段在dump文件中的格式,比如可以使用逗号分隔(用啥分隔无所谓只要能识别就行了),淘宝房产的多值字段名字是roomSize,dump源文件中的内容可以是 40,50,60,150这样的字段内容。
  1. 首先要在schema.xml配置文件中设置:
    <fieldType name="multi_tint"   class="com.taobao.terminator.s4fanglist.MultiValuedIntField"    precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
    <field name="roomsSize"       
       type="multi_tint"    indexed="true"  stored="true"     multiValued="true"/> 
  2. 然后写一个TrieIntField类的扩展类,这里使用的是solr.1版本,4.0以下的版本类钩会有点区别 
    package com.taobao.terminator.s4fanglist;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.apache.lucene.index.IndexableField;
    import org.apache.solr.schema.SchemaField;
    import org.apache.solr.schema.TrieIntField;
    /**
    * @author 百岁(baisui@taobao.com)
    * @date 2013-6-13
    */
    public class MultiValuedIntField extends TrieIntField {
    private static final Log log = LogFactory.getLog(MultiValuedIntField.class);
    @Override
    public IndexableField[] createFields(SchemaField field, Object value,
    float boost) {
    if (value == null) {
    return super.createFields(field, value, boost);
    }
    String[] intValues = String.valueOf(value).split(",");
    log.info("raw valule :" + value + " has been split to "
    + intValues.length + " piece");
    IndexableField[] fields = new IndexableField[intValues.length];
    int i = 0;
    for (String val : intValues) {
    fields[i++] = this.createField(field, val, boost);
    }
    return fields;
    }
    //需要覆写isPolyFiled方法,只有这样DocumentBuilder类的addField 在执行的时候才会通过单个fieldtype在document构建出多个field来
    @Override
    public boolean isPolyField() {
    return isMultiValued();
    } 
     
    } 

 以上代码需要覆写isPolyFiled方法,只有这样DocumentBuilder类的addField 在执行的时候才会通过单个fieldtype在document构建出多个field来

以下是DocumentBuilder类的addField方法,供参考:
private static void addField(Document doc, SchemaField field, Object val, float boost) {
if (field.isPolyField()) {
IndexableField[] farr = field.getType().createFields(field, val, boost);
for (IndexableField f : farr) {
if (f != null) doc.add(f); // null fields are not added
}
} else {
IndexableField f = field.createField(val, boost);
if (f != null) doc.add(f); // null fields are not added
}
} 
 将以上代码打包部署到服务端,就可以对roomSize字段进行查询了,查询方法和单值字段相同,例如可以使用
  roomSize:40 来查询有40平方面积的户型的楼盘,可以使用roomSize:[40 TO 60] 来查询有40到60方之内户型的楼盘。
分享到:
评论
2 楼 pzw 2015-09-21  
适用场景描述的再清楚一点就好了!
1 楼 pzw 2015-09-21  
多好的文章
今天看过来还是很实用啊!

相关推荐

    ikanalyzer-solr8.4.0_solr8_solr_ikanalyzer_中文分词_

    3. **配置Schema.xml**:在 Solr 的 schema.xml 文件中,我们需要定义字段类型(FieldType)并指定使用 ikanalyzer。例如,可以创建一个名为 `text_ik` 的字段类型,并设置其`analyzer_class`属性为 `org.apache....

    Solr配置安装(二)--之中文分语器IKAnalyzer

    4. **创建或更新字段**:根据配置的`&lt;fieldType&gt;`,在`&lt;fields&gt;`部分定义字段,指定其类型为`text_ik`或其他自定义的分词器类型。 5. **重启Solr**:保存配置文件后,需要重启Solr服务以使更改生效。 6. **测试...

    solr中文文档.pdf

    &lt;fieldType name="text" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer type="index"&gt; &lt;analyzer type="query"&gt; &lt;/fieldType&gt; ``` - 同时可以定义单词级别的分词字段类型: ```xml ...

    solr 5.x 和 6.x 最新中文分词器

    通常在`schema.xml`或`managed-schema`中定义字段类型(FieldType),并设置对应的分词器。例如,使用IK Analyzer: ```xml &lt;fieldType name="text_ik" class="solr.TextField"&gt; &lt;analyzer type="index"&gt; ...

    solr4.7服务搭建

    3. **创建 Solr Home**:在 solr 目录下创建一个 home 文件夹(可以自定义名称)。 #### 四、部署 Solr 战包 1. **复制 solr.war 文件**:将 `D:\solr\solr-4.7.2\example\webapps` 下的 solr.war 文件复制到 `D:\...

    solr中cache综述

    Apache Solr是一个高性能、可伸缩的企业级搜索平台,它基于Lucene构建,在实际应用中为了提高查询效率和性能,内置了一系列缓存机制(Cache)。这些缓存机制不仅能够有效减少对底层索引的直接访问次数,还能够在很大...

    支持solr 5.3.0的IKAnalyzer中文分词器

    &lt;fieldType name="text_ik" class="solr.TextField"&gt; &lt;analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/&gt; &lt;analyzer type="query" isMaxWordLength="true" class=...

    solr中文分词器

    在`&lt;fields&gt;`标签内,为需要进行中文分词的字段添加`&lt;fieldType&gt;`标签,指定使用IK Analyzer。例如: ```xml &lt;fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer type=...

    solr中的mmesg4j中文分词器安装

    - **添加`fieldType`标签**:在`fieldType`标签中添加以下代码: ```xml &lt;fieldType name="textComplex" class="solr.TextField" positionIncrementGap="100"&gt; &lt;tokenizer class="com.chenlb.mmseg4j.solr....

    solr5配置中文分词

    Solr5是一款强大的开源搜索引擎,尤其在处理大量文本数据时...总之,配置Solr5的中文分词涉及到对分词器的选取、库的添加、`schema.xml`的修改等多个环节。正确配置后,Solr5将能有效地处理中文文档,提升搜索体验。

    solr中文分词高版本

    3. **创建字段**:在schema.xml中,创建一个使用ikanalyzer的字段类型,例如: ```xml &lt;fieldType name="text_ikanalyzer" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer type="index"&gt; ...

    solr6.6-IK

    在 Solr 的各种版本中,Solr 6.6 是一个重要的里程碑,它包含了多个改进和新特性。在这个版本中,IK 分词器是其文本处理核心组件之一,对于中文文档的检索和索引构建至关重要。 IK(Intelligent Chinese)分词器是...

    支持solr5.5 solr6.0中IK分词需要的资料

    Solr是中国最流行的全文...通过以上步骤和注意事项,你应该能够成功地在Solr 5.5和6.0中集成和使用IK分词器,从而提升中文文本的检索效果。所提供的资料将有助于这个过程,帮助你解决可能出现的问题和优化分词性能。

    solr在java中使用总结

    ### Solr在Java中的使用总结 #### 一、Solr简介 Solr是一个高性能的全文搜索引擎,基于Apache Lucene开发,使用Java 5编写。它不仅继承了Lucene的强大功能,还提供了更丰富的查询语言以及更好的性能优化。Solr具备...

    IK分词solr5.0.0

    2. **修改schema.xml**:在Solr的配置文件schema.xml中,我们需要定义一个或多个字段类型(fieldType),并指定使用IK分词器。例如,可以创建一个名为`text_ik`的字段类型,配置如下: ```xml &lt;fieldType name=...

    SOLR-7学习2020.docx

    managed-schema.xml 文件是 Solr 中用于定义字段类型(fieldType)和字段(field)的关键配置文件,其中包含了对索引和搜索行为的详细设定。例如,`Field` 和 `dynamicField` 用于定义字段的属性,如 `indexed`(是否...

    Solr5.4中文分词

    在Solr 5.4版本中,对中文分词的支持是通过特定的分词器实现的。本文将详细介绍如何在Solr 5.4中配置中文分词库。 首先,"Solr5.4中文分词"这个标题表明我们关注的是针对Solr 5.4的一个特定分词解决方案。这通常...

    solr搭建步骤

    Solr 客户端可以使用在项目中,这里案例为一个独立的 Client 项目,可插拔。需要的 jar 文件可以从 Solr 的 lib 目录下获取。基本操作包括创建 SolrClient 对象,创建索引、添加文档、搜索文档等。 Solr 搭建需要...

    支持solr6.x的中文分词,对solr7的支持暂时没有测试过

    在这个特定的情境中,我们关注的是Solr6.x版本中的中文分词支持,以及与ikanalyzer-solr5相关的组件。 中文分词是自然语言处理中的基础步骤,它将连续的汉字序列分割成具有语义的词汇单元,这对于搜索引擎来说至关...

Global site tag (gtag.js) - Google Analytics