zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Elasticsearch-字符串类型

elasticsearch 字符串 类型
2023-09-11 14:14:34 时间

ES-用于定义文档字段的核心类型

ES中一个字段可以是核心类型之一,如字符串、数值、日期、布尔型,也可以是一个从核心类型派生的复杂类型,如数组。

字符串类型

索引一类型为字符串的数据
doc1:

FengZhendeMacBook-Pro:bin FengZhen$ curl -XPUT 'localhost:9200/music/album/2' -d '{
> "name":"Late Night with Elasticsearch",
> "date":"2019-06-24T22:17"
> }'

doc2:

FengZhendeMacBook-Pro:bin FengZhen$ curl -XPUT 'localhost:9200/music/album/3' -d '{
> "name":"latenight",
> "date":"2019-06-24T22:20"
> }'

在name字符串字段里搜索单词late

FengZhendeMacBook-Pro:bin FengZhen$ curl -XGET 'localhost:9200/music/album/_search?pretty' -d '{
>  "query":{
>     "query_string":{
>       "query":"late"
>     }
>  }
>  }'
{
  "took" : 11,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.095891505,
    "hits" : [ {
      "_index" : "music",
      "_type" : "album",
      "_id" : "2",
      "_score" : 0.095891505,
      "_source" : {
        "name" : "Late Night with Elasticsearch",
        "date" : "2019-06-24T22:17"
      }
    } ]
  }
}

 

索引过程和搜索过程如下

 

当索引"name":"Late Night with Elasticsearch"时,默认的分析器将所有字符转化为小写,然后将字符串分解为单词。
分析过程中生成了4个词条,即late、night、with和elasticsearch。查询的字符串经过同样的处理过程,”late”生成了同样的字符串”late”。因为查询生成的late词条和文档生成的late词条匹配了,所以文档(doc1)匹配上了搜索。doc2没有命中的原因是:在索引latenight时,默认的分析器只创建了一个词条--latenight。
一个词条是文本中的一个单词,是搜索的基本单位。在不同的情景下,单词可以意味着不同的事物,例如,它可以是一个名字,也可以是一个IP地址。如果只想严格匹配某个字段,应该将整个字段作为一个单词来对待。
映射会对这种分析过程起到作用。可以在映射中指定许多分析的选项。例如,可以配置分析,生成原始词条的同义词,这样同义词的查询同样可以匹配。
在设置映射时,有个index选项,可选值有:analyzed(默认)、not_analyzed或no。
将album类型的name字段设置为not_analyzed,映射如下

 curl -XPUT 'localhost:9200/music/_mapping/album' -d '{
     "album":{
        "properties":{
            "name":{
                "type":"string",
                "index":"not_analyzed"
            }
        }
    }
 }'

index类型解释:

(1) analyzed:默认情况下,index会被设置为analyzed;分析器将所有字段转为小写,并将字符串分解为单词。当期望每个单词完整匹配时,可以使用此选项
如:期望通过”late”搜出"Late Night with Elasticsearch"
(2) not_analyzed:分析过程被忽略,整个字符串被当做单独的词条进行索引。当进行精准的匹配时,可使用此选项
如:期望通过”big data”搜出”big data”,通过”big”搜不出”big data”
(3) no : 如果设置为no,则索引过程会被略过,也没有词条产生,因此无法在那个字段上进行搜索。当无需在这个字段上搜索时,这个选项节省了存储空间,也缩短了索引和搜索的时间。