关于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字段进行准确匹配

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理