solr multivalue的实现分析

线上业务准备使用solr做数据存放和索引的功能,其中有的字段要求会存入多个字,solr的field的
multivalue可以实现这个功能。

<dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/>

下面看看其实现原理:
和solr的写入document相关的两个类是SolrInputDocument 和SolrInputField,其中SolrInputDocument 是和整条document有关,SolrInputField 是和field相关(属性包含field的名称,值和boost值)。
SolrInputDocument 类中和document添加的方法主要有addField 和setField,其中setField是覆盖前面的value,addField是追加value.
看看其具体实现:

public SolrInputDocument() {
    _fields = new LinkedHashMap <String,SolrInputField>(); // 通过构造方法构建一个map,value是SolrInputField
  }
  private final Map<String,SolrInputField> _fields;
  public void addField(String name, Object value, float boost ) //addFiled的方法中,参数value是个object
    SolrInputField field = _fields.get( name ); // name是指field的名称,value是指field的值,判断map中是否已经有这个field的信息
    if( field == null || field.value == null ) { // 如果filed或者filed value为空,就用本类的setField(即第一次添加有效地值,类似于overwrite)
      setField(name, value, boost);
    }
    else {
      field.addValue( value, boost ); // 否则用SolrInputField的addValue方法(类似于append)
    }
  }

其中setField的实现如下:

public void setField(String name, Object value, float boost )
  {
    SolrInputField field = new SolrInputField( name );
    _fields.put( name, field );
    field.setValue( value, boost );  //其实是调用了SolrInputField的setValue方法
  }

再来看看SolrInputField类:

public class SolrInputField implements Iterable<Object>, Serializable
{
  String name;
  Object value = null;
  float boost = 1.0f;
  public SolrInputField( String n )
  {
    this. name = n;
  }
  public void setValue(Object v, float b) {
    boost = b;
    if( v instanceof Object[] ) {  // Arrays will be converted to a collection.如果传入的value是个list,会转换为collection
      Object[] arr = (Object[])v;
      Collection<Object> c = new ArrayList<Object>( arr.length );
      for( Object o : arr ) {
        c.add( o );
      }
      value = c;
    }
    else {
      value = v;
    }
  }
  public void addValue(Object v, float b) { //可以看到同样会判断是否为collection
    if( value == null ) {
      if ( v instanceof Collection ) {
        Collection<Object> c = new ArrayList<Object>( 3 );
        for ( Object o : (Collection<Object>)v ) {
          c.add( o );
        }
        setValue(c, b);
      } else {
        setValue(v, b);
      }
      return;
    }

....

通过上面可以看出,在向field传入value的时候,是可以传入数组这种数据结构的,这样,就可以在一个field里面插入多个value
比如下面的两种方法,都可以写入同一个field多个有效值:
例1:

SolrInputDocument doc = new SolrInputDocument();
 String key = "123";
 doc.addField("id", key);
 doc.addField("test_ss", "vv1");
 doc.addField("test_ss", "vv2");
 doc.addField("test_ss", "vv3");

例2:

SolrInputDocument doc = new SolrInputDocument();
String key = "123";
String[] vv = {"vv1","vv2","vv3"};
doc.addField("id", key);
doc.addField("test_ss", vv);

注意,每次实例化一个SolrInputDocument 的对象,都相当于对这一行进行重新overwrite的操作,因为solr是基于lucene的,lucene的update是通过delete+add实现的。也就是如果一个document为id:1,test_ss:aa,在后面重新实例化后,对于相同的id记录,使用addFiled("test_ss","bb")之后document变为id:1,test_ss:bb了。。(setField的覆盖和addField的追加都是对本次实例说的)。

solr multivalue的实现分析,布布扣,bubuko.com

时间: 2024-10-11 21:02:13

solr multivalue的实现分析的相关文章

Solr\Lucene优劣势分析

最早lucene2.4以及以前,追溯到2008年前后,lucene刚刚引起大家的关注,到后来Nutch .solr的出现,lucene变得更加热.Nutch.Solr的发展,极大推动了lucene的升级. 对于一些接触过搜索,使用过lucene.solr的人来说,一般都会感觉lucene.solr很牛逼.我个人也认为solr.lucene确实非常NB,他涵盖了信息检索的几乎全部基础知识和非常高性能的实现方式.从solr的结构,扩展.维护整体看,发现有非常多的"工程亮点",熟读solr定

Solr初始化源码分析-Solr初始化与启动

用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机制弄熟,才能把这个项目做好.今天分享的就是:Solr是如何启动并且初始化的.大家知道,部署solr时,分两部分:一.solr的配置文件.二.solr相关的程序.插件.依赖lucene相关的jar包.日志方面的jar.因此,在研究solr也可以顺着这个思路:加载配置文件.初始化各个core.初始化各个

Solr文本分析剖析【文本分析、分词器详解、自定义文本分析字段及分词器】

一.概述 Solr文本分析消除了索引词项与用户搜索词项之间的语言差异,让用户在搜索buying a new house时能找到类似的内容,例如:purchasing a new home这样的文档.如果搭配恰当,文本分析就能允许用户使用自然语言进行搜索,而无需考虑搜索词项的所有可能形式.毕竟谁也不想看到为了相似搜索而构造这样的查询表达式:buying house OR purchase home OR buying a home OR purchasing a house .... 用户可以使用

solr搜索之demo和集成IKAnalyzer(二)

1      新建demo-solr 关闭运行的solr应用. 进入solr目录:D:\solr-4.10.2\example 1.在example目录下创建demo-solr文件夹: 2.将./solr下的solr.xml拷贝到demo-solr目录下: 3.在demo-solr下创建demo目录,并且在demo目录下创建conf和data目录: 4.将example\solr\collection1\core.properties文件拷贝到example\demo-solr\demo下,并且

【solr基础教程之中的一个】Solr相关知识点串讲

Solr是Apache Lucene的一个子项目.Lucene为全文搜索功能提供了完备的API.但它仅仅作为一个API库存在.而不能直接用于搜索. 因此,Solr基于Lucene构建了一个完整的搜索引擎.它能够为搜索引擎加入文档.对文档内容进行分析,并为用户提供搜索功能,在此基础上提供了一个扩展功能,如hit highline, suggetion等. 一.概述 (一)基础内容 1.Solr的版本与Lucene的版本保持一直,直到2014年7月,最新版本为4.9.0. 2.Solr提供了一个ex

Solr相关知识点串讲

Solr是Apache Lucene的一个子项目.Lucene为全文搜索功能提供了完备的API,但它只作为一个API库存在,而不能直接用于搜索.因此,Solr基于Lucene构建了一个完整的搜索引擎,它可以为搜索引擎添加文档,对文档内容进行分析,并为用户提供搜索功能,在此基础上提供了一个扩展功能,如hit highline, suggetion等. 一.概述 (一)基础内容 1.Solr的版本号与Lucene的版本号保持一直,直到2014年7月,最新版本号为4.9.0. 2.Solr提供了一个e

solr 通过【配置、多值字段、动态字段】来解决文本表达式查询精确到句子的问题20171214

一.Solr Multivalue field属性positionIncrementGap理解 分类:Lucene 2014-01-22 10:39阅读(3596)评论(0) 参考:http://rockiee281.blog.163.com/blog/static/19385222920127225619919/ Solr里头可以设计Field为Multivalue类型,这样的一个好处是可以很方便的设置copyField,在我们的项目中也有使用. 但是一直以来都有一个问题困扰着我,就是对mul

sorl 的介绍和安装

1.基本知识: 1.1solr的安装 1.2solr的基本使用 1.3solrj的使用 2.solr 实现全文检索   索引流程:客户端--->solr 服务器(发送post请求,xml文档包含filed,solr实现对索引的维护) 搜索流程:客户端--->solr 服务器(发送get 请求,服务器返回一个xml 文档) 3.solr和lucene之间的区别 lucene全文检索的工具包,jar包 solr     全文检索服务器,单独运行的servlet容器 4.solr安装 solr 的j

Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建

Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建 由于公司里的Solr调试都是用远程jpda进行的,但是家里只有一台电脑所以不能jpda进行调试,这是因为jpda的端口冲突.所以只能在Eclipse 搭建Solr的环境,折腾了一小时终于完成了. 1. JDPA远程调试 搭建换完成Solr环境后,对${TOMCAT_HOME}/bin/startup.sh 最后一行进行修改,如下所示: 1 set JPDA_ADDRESS=7070 2 exec "$PRGDIR"