在现有的终搜框架之下如果业务方需要在document文档中设置multivalued的属性,例如淘宝房产有这样的需求,每一个房产小区,都有不同面积的户型,比如有40方、60、90、150方的户型。 在实际使用中查询列表页面会根据户型的大小给所有小区的在售房源分类,比如:会查询有40方房子的小区,或者有60方房子的户型,或者查询有50至100方房源的楼盘。
做之前可以先和业务方协定好存放多值字段在dump文件中的格式,比如可以使用逗号分隔(用啥分隔无所谓只要能识别就行了),淘宝房产的多值字段名字是roomSize,dump源文件中的内容可以是 40,50,60,150这样的字段内容。
- 首先要在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"/>
- 然后写一个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方之内户型的楼盘。
相关推荐
<fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" isMaxWordLength="true" class=...
solr5.x(含5.4)可用的ikanalyzer中文分词 <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index"> <analyzer type="query"> </fieldType>
solr
solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...
solr
solr6.0的中文分词也支持solr5.x,IKAnalyzer.jar和配置文件
solr中文分词器
Solr5.4的中文分词库,解压拷贝到Solr5.4.0的WEB-INF目录下即可,如非默认数据保存路径,要修改web.xml文件
通过继承Analyzer编写自定义类UseSmartIKAnalyzer和NotUseSmartIKAnalyzer,实现智能分词和最细粒度分词,支持solr4.7通过配置schema.xml实现不同的分词效果 <fieldType name="text_ik" class="solr.TextField"> ...
在tomcat中配置solr,以及solr 全文搜索建立索引的相关方法总结
solr中Cache综述 以及部分优化策略
支持solr5.5 solr6.0中IK分词需要的资料
3.3.3 Document 6 3.3.4 Field 6 3.3.5 IndexWriter 6 3.3.6 IndexSearcher 6 3.3.7 Directory 6 3.3.8 Segment 7 3.3.9 QueryParser 7 3.3.10 Hits 7 4.应用示例 7 4.1 创建索引 7 4.1 删除索引 7 4.1 索引查询 8 5...
solr文档
少有的solr中文文档,详细说明了SOLR的文件配置,使用。
这是用Java对solr进行调用需要用到的一些jar包
solr 中文分词
solr manageschema 配置文件,增加了分词器后的配置文件
1. 创建一个solr的文件夹作为服务器的位置,里面再建两个文件夹一个home文件夹一个server文件夹。 2. home文件夹中存放apache-solr-3.6.0\example\solr中的所有文件,删除data中所有的数据,server文件夹存放apache-...