乐趣区

关于elasticsearch:ES学习二字段类型

1,text
当一个字段的内容须要被全文检索时,能够应用 text 类型,它反对长内容的存储,如文章内容、商品信息等,该类型的字段在保留时 会被分词器剖析,并拆分成多个词项,而后依据拆分后的词项生成对应的索引。须要留神的是 text 类型的字段无奈进行准确匹配,也不能间接用于排序、聚合,也被称为 ananlyzed 字符串。

2,keyword
keyword 类型的字段内容 不会被分词器剖析、拆分,而是依据原始文本间接生成倒排索引,所以 keyword 类型的字段能够间接通过原始文本准确的检索到。该类型的字段个别用于过滤、排序、聚合操作。

3,日期类型
ES 中的 date 类型黑夜反对如下两种格局:
strict_date_optional_time,示意 yyyy-MM-dd’T’HH:mm:ss.SSSSSSZ 或者 yyyy-MM-dd 格局的日期
epoch_millis,示意从 1970.1.1 零点到当初的毫秒数,
除了指定 date 类型外,尽量指定相应的格局,如下:

PUT blog{
  "mappings": {
    "properties": {
      "publishDate":{
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

这里补充下,字段类型如果是 date 类型,在应用 canal 同步 mysql 数据到 ES 的时候会现出工夫格局转换问题。具体如下:

 java.lang.RuntimeException: ES sync commit error ElasticsearchException[Elasticsearch exception 
[type=mapper_parsing_exception, reason=failed to parse field [createTime] of type [date] in document with id 'XXX']]; 
nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Invalid format: "2020-08-25T15:27:01+08:00" is malformed at "-08-25T15:27:01+08:00"]];

很多的解决方案是通过批改 canal 源码解决的。具体阐明可查看 canal 同步数据到 ES 工夫格局问题。
我之前应用 ES 只是通过工夫进行排序,所以我间接将相应的工夫字段以 long 类型即工夫戳的格局存储的。在数据同步的时候将数据表里的工夫字段转成了工夫戳后再进行同步。

4,布尔类型
bolean 类型,有 true、false 两个值

5,数值类型

类型 取值范畴
byte -2^7 ~ 2^7-1
short -2^15 ~ 2^15-1
integer -2^31 ~ 2^31-1
long -2^63 ~ 2^63-1
float 32 位单精度 IEEE 754 浮点类型
double 64 位双精度 IEEE 754 浮点类型
half_float 16 位半精度 IEEE 754 浮点类型
scaled_float 缩放类型的的浮点数

个别状况下,优先应用范畴小的类型

6,数组类型
ES 里没有专门的数组类型,因为 ES 中黑夜每个字段能够蕴含多个值,只有多个值的类型统一即可。比方有如下索引构造:

PUT index_study
{
    "mappings":{
        "game":{
            "properties":{
                "keyword_id":{"type":"long"},
                "keyword_name":{
                    "type":"text",
                    "fields":{
                        "keyword":{"type":"keyword"}
                    }
                }
            }
        }
    }
}

增加两条数据,其中一条中的 keyword_name 有多个值:

POST index_study/game/1
{
  "keyword_id":1,
  "keyword_name":"青叶"
}
POST index_study/game/2
{
  "keyword_id":2,
  "keyword_name":["山河","曜"]
}

查问后后果如下,GET index_study/_search?q=*

"hits" : [
      {
        "_index" : "index_study",
        "_type" : "game",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "keyword_id" : 2,
          "keyword_name" : [
            "山河",
            "曜"
          ]
        }
      },
      {
        "_index" : "index_study",
        "_type" : "game",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "keyword_id" : 1,
          "keyword_name" : "青叶"
        }
      }
    ]

再聊一下 text 与 keyword 类型

咱们在应用 ES 过程中,常常会遇到这样的问题:既要对一下字段进行全文检索,又须要对该字段进行等值查问,如果简略的应用 text 类型是能够满足全文检索的需要但 text 是没方法进行等值匹配的。这个时候就须要用到 fields 来进行配置了
fields 的应用场景:

  1. 对一个字段配置我销售点类型的 type 以应答不同的查问场景
  2. 对一个字段配置多个分词规定以反对多种全文检索规定

索引示例可参看 index_study 这个索引,在查问的时候应用 multi_match 进行查问:

GET index_study/_search
{
    "query": {
        "multi_match": {
            "query": "山河",
            "fields": [
                "keyword_name",
                "keyword_name.keyword"
            ],
            "type": "most_fields"
        }
    }
}

参考文章:
es 索引字段类型
ES 中如何对 text 字段进行准确匹配

退出移动版