solr的mutivalue字段

本文详细解释了Solr的schema.xml配置文件中MutiValued属性的作用,并通过两个具体例子展示了其在实际应用中的使用方式。包括如何在字段配置中设置MutiValued属性以及查询效果分析。

       solr的schema.xml配置文件在配置Filed的时候,有个属性:

       MutiValued:true if this field may containmutiple values per documents,这个说明有点模糊,下面结合实际应用,列举两个不同的例子

       例子一:一个field有多个值,值来自同一filed

  1. <fields>  
  2.  <!-- general -->  
  3.  <field name="id"      type="int"      indexed="true"  stored="true"  multiValued="false" required="true"/>  
  4.  <field name="planTime"    type="tdate"   indexed="true"  stored="false"  multiValued="false" />  
  5.  <field name="state"   type="string"   indexed="true"  stored="false"  multiValued="false" />  
  6.  <field name="overDate"   type="string"   indexed="true"  stored="false"  multiValued="false" />  
  7.  <field name="type"   type="int"   indexed="true"  stored="false"  multiValued="false" />  
  8.  <field name="contactName"   type="textComplex"   indexed="true"  stored="false"  multiValued="false" />  
  9.  <field name="contactTel"    type="string"   indexed="true"  stored="false"  multiValued="false" />  
  10.  <field name="customer"    type="textComplex"   indexed="true"  stored="false"  multiValued="false" />  
  11.  <field name="alias"    type="textComplex"   indexed="true"  stored="false"  multiValued="false" />  
  12.  <field name="englishName"    type="textComplex"   indexed="true"  stored="false"  multiValued="false" />  
  13.  <field name="executor"    type="int"   indexed="true"  stored="true"  multiValued="true" />  
  14.  <!--[1m~K[1m~][1m~W段-->  
  15.  <field name="keywords" type="text" indexed="true" stored="false" multiValued="true"/>  
  16. lt;/fields>  
 <fields>
  <!-- general -->
  <field name="id"      type="int"      indexed="true"  stored="true"  multiValued="false" required="true"/>
  <field name="planTime"    type="tdate"   indexed="true"  stored="false"  multiValued="false" />
  <field name="state"   type="string"   indexed="true"  stored="false"  multiValued="false" />
  <field name="overDate"   type="string"   indexed="true"  stored="false"  multiValued="false" />
  <field name="type"   type="int"   indexed="true"  stored="false"  multiValued="false" />
  <field name="contactName"   type="textComplex"   indexed="true"  stored="false"  multiValued="false" />
  <field name="contactTel"    type="string"   indexed="true"  stored="false"  multiValued="false" />
  <field name="customer"    type="textComplex"   indexed="true"  stored="false"  multiValued="false" />
  <field name="alias"    type="textComplex"   indexed="true"  stored="false"  multiValued="false" />
  <field name="englishName"    type="textComplex"   indexed="true"  stored="false"  multiValued="false" />
  <field name="executor"    type="int"   indexed="true"  stored="true"  multiValued="true" />
  <!--[1m~K[1m~][1m~W段-->
  <field name="keywords" type="text" indexed="true" stored="false" multiValued="true"/>
</fields>
      其中:
  1. <field name="executor"    type="int"   indexed="true"  stored="true"  multiValued="true" /  
  <field name="executor"    type="int"   indexed="true"  stored="true"  multiValued="true" /

    最后看下查询效果:

    

      从上图看书,executor这个field可以多个值,任何executor:29 OR executor:40,类似查询都能查出id为3的记录

     附注:使用solrj建此索引时,定义成集合类型即可如:

  1. @Field  
  2. private Set<Integer> executor;  
  3.   
  4. public Set<Integer> getExecutor() {  
  5.     return executor;  
  6. }  
  7.   
  8. public void setExecutor(Set<Integer> executor) {  
  9.     this.executor = executor;  
  10. }  
    @Field
    private Set<Integer> executor;

    public Set<Integer> getExecutor() {
        return executor;
    }

    public void setExecutor(Set<Integer> executor) {
        this.executor = executor;
    }
       

       例子二:类似综合搜索,结合copyFiled使用,多个Filed拷贝到该Field上

       

         从上图看出keywords区域,是name、introduction、industryName三个的集合,无论搜索name、introduction、industryName中任意一个,都能通过keywords搜索出来。

<think>我们正在讨论Solr时间字段的格式。根据引用[2]的信息,Solr提供了内建的日期字段类型(Date fields)。在Solr中,日期字段的格式遵循特定的规范,通常是ISO-8601标准的扩展格式。 具体来说,Solr的日期字段格式为: `yyyy-MM-dd'T'HH:mm:ss.SSSZ` 或者 `yyyy-MM-dd'T'HH:mm:ss.SSS'Z'`(当使用UTC时间时) 其中: - `yyyy`:4位数的年份 - `MM`:2位数的月份(01-12) - `dd`:2位数的日期(01-31) - `T`:日期和时间之间的分隔符 - `HH`:2位数的小时(00-23) - `mm`:2位数的分钟(00-59) - `ss`:2位数的秒(00-59) - `SSS`:3位数的毫秒(000-999) - `Z`:表示时区,可以是: - `Z` 表示UTC时间(祖鲁时间) - 或者用`+HH:mm`或`-HH:mm`表示的时区偏移,例如`+08:00`表示东八区 注意:Solr内部将所有日期时间值存储为UTC时间。如果输入的时间字符串没有指定时区(例如,没有`Z`也没有时区偏移),那么Solr会使用在`solrconfig.xml`中配置的默认时区(通过`<dateFormat>`的`defaultTimeZone`属性设置)。如果没有配置,则使用JVM的默认时区。 在Solr的schema定义中,日期字段通常使用`solr.DatePointField`(用于单值)或`solr.DateRangeField`(用于范围)等类型。例如: ```xml <fieldType name="pdate" class="solr.DatePointField" format="yyyy-MM-dd'T'HH:mm:ss.SSSZ"/> ``` 但是,Solr也支持多种格式,可以通过在`format`属性中使用多个格式字符串,用逗号分隔。例如: ```xml <fieldType name="pdate" class="solr.DatePointField" format="yyyy-MM-dd'T'HH:mm:ss.SSSZ, yyyy-MM-dd'T'HH:mm:ss, yyyy-MM-dd"/> ``` 这样,Solr在解析时会尝试按顺序匹配这些格式。 此外,在Solr 7及以上版本中,默认的日期字段类型使用的是`solr.DatePointField`,并且默认支持ISO-8601格式。 总结: - Solr期望的日期时间字符串格式是ISO-8601格式的变体。 - 必须包含日期和时间部分(最少到秒),毫秒和时区是可选的(但强烈建议使用时区)。 - 如果未指定时区,Solr会使用默认时区(可能是JVM时区,也可能在配置中指定)。 例如,以下都是有效的Solr日期时间字符串: - `2023-10-15T12:30:45Z`(UTC时间) - `2023-10-15T12:30:45+08:00`(东八区时间) - `2023-10-15T12:30:45.123Z`(带毫秒的UTC时间) - `2023-10-15T12:30:45.123+08:00`(带毫秒的东八区时间) 但是,请注意,如果我们在索引文档时提供了不符合格式的日期字符串,Solr将无法解析并抛出错误。 因此,在将数据(如从Oracle导出的数据)导入Solr时,需要确保日期字段被转换成上述格式之一。 </think>### Solr 时间字段格式详解 根据引用[2]和实际配置经验,Solr 时间字段采用 **ISO-8601 标准格式**,具体规范如下: #### 核心格式规范 1. **完整格式**(精确到毫秒) `YYYY-MM-DDTHH:mm:ss.SSSZ` 示例:`2023-10-15T12:30:45.123Z` - `YYYY`:4位年份 - `MM`:2位月份(01-12) - `DD`:2位日期(01-31) - `T`:日期时间分隔符(必须大写) - `HH`:24小时制小时(00-23) - `mm`:分钟(00-59) - `ss`:秒(00-59) - `SSS`:毫秒(000-999) - `Z`:时区标识(Z表示UTC,或`+08:00`表示东八区) 2. **简化格式**(精确到秒) `YYYY-MM-DDTHH:mm:ssZ` 示例:`2023-10-15T12:30:45Z` 3. **最小格式**(仅日期) `YYYY-MM-DD`(自动补全为当日00:00:00 UTC) 示例:`2023-10-15` → `2023-10-15T00:00:00Z` #### Schema 配置示例 在`schema.xml`中推荐配置(引用[2]): ```xml <fieldType name="pdate" class="solr.DatePointField" format="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" defaultTimeZone="UTC"/> <field name="timestamp" type="pdate" indexed="true" stored="true"/> ``` 配置说明: - `solr.DatePointField`:Solr 7+ 推荐日期类型 - `format`:指定解析格式(需与数据格式匹配) - `defaultTimeZone="UTC"`:默认UTC时区(避免时区混乱) #### 关键注意事项 1. **时区处理**: - UTC时间用`Z`后缀(如`2023-10-15T12:30:45Z`) - 本地时区需指定偏移(如`2023-10-15T20:30:45+08:00`) - 未指定时区时,默认使用`defaultTimeZone`值[^2] 2. **日期范围查询**: Solr支持高效的范围查询: ```bash # 查询2023年10月数据 q=timestamp:[2023-10-01T00:00:00Z TO 2023-10-31T23:59:59Z] ``` 3. **数据兼容性**: | 原始格式 | 转换结果 | |-------------------|---------------------------| | Oracle DATE | `TO_CHAR(date_col, 'YYYY-MM-DD"T"HH24:MI:SS"Z"')` | | Java Date | `new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")` | | JSON 输入 | `{"timestamp":"2023-10-15T12:30:45Z"}` | > ⚠️ **常见错误**:省略`T`分隔符(如`2023-10-15 12:30:45`)或使用错误时区格式会导致解析失败。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值