ELK第五篇:mapping的创建和中文模糊查询

来源:互联网 发布:nginx 反向代理 403 编辑:程序博客网 时间:2024/05/22 08:22

简介

Mapping是ES中的一个很重要的内容,它类似于传统关系型数据中table的schema,用于定义一个索引(index)的某个类型(type)的数据的结构。

在传统关系型数据库,我们必须首先创建table并同时定义其schema,如下面的SQL语句。下面代码中小括号内的代码的作用就是定义person_info的schema(模式)。

create table person_info(    name varchar(20),    age tinyint )

在ES中,我们无需手动创建type(相当于table)和mapping(相关与schema)。在默认配置下,ES可以根据插入的数据自动地创建type及其mapping。在下面的API介绍部分中,会做相关的试验。当然,在实际使用过程中我们可能就想硬性规定mapping,可以通过配置文件关闭ES的自动创建mapping功能。

mapping中主要包括字段名、字段数据类型和字段索引类型这3个方面的定义。

  • 字段名:这就不用说了,与传统数据库字段名作用一样,就是给字段起个唯一的名字,好让系统和用户能识别。

  • 字段数据类型:定义该字段保存的数据的类型,不符合数据类型定义的数据不能保存到ES中。下表列出的是ES中所支持的数据类型。(大类是对所有类型的一种归类,小类是实际使用的类型。)

mapping和java中的类定义非常相似,这也是它数据存储和搜索的基本,毕竟我们不肯能像前面的篇章那样一直使用id作为搜索的内容吧。而如果要使用字段搜索则必须进行映射,特别是中文搜索不然分词处理可能就不是很理想或者完全无法搜索到结果。

说明:6.0.0版本中已经没有string类型了而是以text取代,这是在看其他老版本的教程中发现的问题,最后在官网提供的文档中给出了一下基本类型

大类 包含的小类 string字符串类型 (text,and,keyword:6.0.0版本)/(string:6.0.0版本之前) Numeric datatypes数字类型 long, integer, short, byte, double, float, half_float, scaled_float Boolean datatype布尔类型 boolean Binary datatype二进制类型 binary Range datatypes 范围类型 integer_range, float_range, long_range, double_range, date_range

当然还有其他复合类型,比如IP类型,email类型具体可以参考官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

字段索引类型:索引是ES中的核心,ES之所以能够实现实时搜索,完全归功于Lucene这个优秀的Java开源索引。在传统数据库中,如果字段上建立索引,我们仍然能够以它作为查询条件进行查询,只不过查询速度慢点。而在ES中,字段如果不建立索引,则就不能以这个字段作为查询条件来搜索。也就是说,不建立索引的字段仅仅能起到数据载体的作用。string类型的数据肯定是日常使用得最多的数据类型,下面介绍mapping中string类型字段可以配置的索引类型。

索引类型 解释 analyzed 首先分析这个字符串,然后再建立索引。换言之,以全文形式索引此字 not_analyzed 索引这个字段,使之可以被搜索,但是索引内容和指定值一样。不分析此字段。 -no 不索引这个字段。这个字段不能被搜索到。

如果索引类型设置为analyzed,在表示ES会先对这个字段进行分析(一般来说,就是自然语言中的分词),ES内置了不少分析器(analyser),如果觉得它们对中文的支持不好,也可以使用第三方分析器。由于笔者在实际项目中仅仅将ES用作普通的数据查询引擎,所以并没有研究过这些分析器。如果将ES当做真正的搜索引擎,那么挑选正确的分析器是至关重要的。

mapping中除了上面介绍的3个主要的内容外,还有其他的定义内容,详见官网文档。

基础信息API

我们需要借助能够发送HTTP请求的工具调用这些API,工具是可以任意的,包括网页浏览器。这里利用Linux上的curl命令来发送HTTP请求。基本的命令结构为:

  curl <-Xaction> url -d 'body'  # 这里的action表示HTTP协议中的各种动作,包括GET、POST、PUT、DELETE等。

注意。文中的示例代码里面包含了用户注释的文字,就是 # 号后面的文字。运行代码时,请注意删除这些注释。
查看集群(Cluster)信息相关API

(1)查看集群健康信息。

  curl -XGET "192.168.1.101:9200/_cat/heath?v"

返回结果为:

epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks 1440206633 18:23:53  elasticsearch green           1         1      0   0    0    0        0             0 

返回结果的主要字段意义:

  • cluster:集群名,是在ES的配置文件中配置的cluster.name的值。
  • status:集群状态。集群共有green、yellow或red中的三种状态。green代表一切正常(集群功能齐全),yellow意味着所有的数据都是可用的,但是某些复制没有被分配(集群功能齐全),red则代表因为某些原因,某些数据不可用。如果是red状态,则要引起高度注意,数据很有可能已经丢失。
  • node.total:集群中的节点数。
  • node.data:集群中的数据节点数。
  • shards:集群中总的分片数量。
  • pri:主分片数量,英文全称为private。
  • relo:复制分片总数。
  • unassign:未指定的分片数量,是应有分片数和现有的分片数的差值(包括主分片和复制分片)。

我们也可以在请求中添加help参数来查看每个操作返回结果字段的意义。

 curl -XGET "192.168.1.101:9200/_cat/heath?help"

返回结果如下:

epoch         | t,time                                   | seconds since 1970-01-01 00:00:00  timestamp     | ts,hms,hhmmss                            | time in HH:MM:SS                   cluster       | cl                                       | cluster name                       status        | st                                       | health status                      node.total    | nt,nodeTotal                             | total number of nodes              node.data     | nd,nodeData                              | number of nodes that can store datashards        | t,sh,shards.total,shardsTotal            | total number of shards             pri           | p,shards.primary,shardsPrimary           | number of primary shards           relo          | r,shards.relocating,shardsRelocating     | number of relocating nodes         init          | i,shards.initializing,shardsInitializing | number of initializing nodes       unassign      | u,shards.unassigned,shardsUnassigned     | number of unassigned shards        pending_tasks | pt,pendingTasks                          | number of pending tasks   

mapping的操作

创建索引

curl -XPUT 'http://192.168.0.91:9200/employee'

查看所有索引

curl '192.168.0.91:9200/_cat/indices?v'

查看一下索引mapping的内容:

curl -XGET "http://192.168.0.91:9200/employee/_mapping?pretty" {  "employee" : {    "mappings" : { }  }}

下面给employee这个索引加一个type,type name为employee并设置mapping:

curl -H 'Content-Type: application/json'  -XPUT 'http://192.168.0.91:9200/employee/employee/_mapping?pretty' -d '{        "employee": {            "properties": {                "account_number": {                    "type": "integer"                },         "firstname": {                    "type": "text"                },                 "lastname": {                    "type": "text"                },                 "age": {                    "type": "integer"                },                 "gender": {                    "type": "text"                },                 "address": {                    "type": "text"                },                 "join_time": {                    "type": "date",                     "format": "yyyy-MM-dd"                }            }        }}'#删除索引时使用curl -X DELETE '192.168.0.91:9200/employee'

插入测试数据

curl -H "Content-Type: application/json"  -X PUT '192.168.0.91:9200/employee/employee/1' -d '{"account_number":1,"firstname":"Virginia","lastname":"Ayala","age":39,"gender":"F","address":"171 Putnam Avenue","join_time":"2017-11-10"}'curl -H "Content-Type: application/json"  -X PUT '192.168.0.91:9200/employee/employee/2' -d '{"account_number":2,"firstname":"Fulton","lastname":"Ayala","age":22,"gender":"M","address":"334 River Street","join_time":"2015-04-10"}'curl -H "Content-Type: application/json"  -X PUT '192.168.0.91:9200/employee/employee/3?pretty' -d '{"account_number":3,"firstname":"Burton","lastname":"Ayala","age":37,"gender":"F","address":"685 School Lane","join_time":"2017-05-1"}'curl -H "Content-Type: application/json"  -X PUT '192.168.0.91:9200/employee/employee/4?pretty' -d '{"account_number":4,"firstname":"Josie","lastname":"Ayala","age":42,"gender":"M","address":"27 Bay Parkway","join_time":"2016-12-10"}'curl -H "Content-Type: application/json"  -X PUT '192.168.0.91:9200/employee/employee/5?pretty' -d '{"account_number":5,"firstname":"Hughes","lastname":"Ayala","age":32,"gender":"F","address":"510 Sedgwick Street","join_time":"2015-12-10"}'curl -H "Content-Type: application/json"  -X PUT '192.168.0.91:9200/employee/employee/6?pretty' -d '{"account_number":6,"firstname":"Hall","lastname":"Ayala","age":24,"gender":"F","address":"927 Bay Parkway","join_time":"2017-9-10"}'curl -H "Content-Type: application/json"  -X PUT '192.168.0.91:9200/employee/employee/7?pretty' -d '{"account_number":7,"firstname":"Deidre","lastname":"Ayala","age":35,"gender":"M","address":"685 School Lane","join_time":"2012-12-10"}'

查询所有

curl  -H "Content-Type: application/json"  -XPOST '192.168.0.91:9200/employee/employee/_search?q=*&pretty' -d '        {          "query": { "match_all": {} },          "size": 100        }'

查询所有”address”含有 “Street”的

curl  -H "Content-Type: application/json"  -XPOST '192.168.0.91:9200/employee/_search?pretty' -d '        {          "query": { "match": { "address" : "Street" } }        }'

match的变体(match_phrase),它会去匹配短语”Bay Parkway”:

curl  -H "Content-Type: application/json"  -XPOST '192.168.0.91:9200/employee/_search?pretty' -d '        {          "query": { "match_phrase": { "address" : "Bay Parkway" } }        }'

范围查询年龄25<=&<=37

curl  -H "Content-Type: application/json"  -XPOST '192.168.0.91:9200/employee/_search?pretty' -d '        {          "query": {                      "range": {           "age": {           "gte": 25,           "lte": 37             }            }      }        }'

中文分词mapping创建和搜索

curl -XPUT http://192.168.0.91:9200/ikindex //创建索引

//创建mapping,只有一个字段content,使用ik作为分词器”analyzer”: “ik_smart”

curl  -H "Content-Type: application/json" -XPOST http://192.168.0.91:9200/ikindex/chinese/_mapping?pretty -d'  {   "chinese": {             "_all": {            "analyzer": "ik_max_word",            "store": "false"        },        "properties": {            "content": {                "type": "text",                "store": "false",                "analyzer": "ik_max_word"            }        }    }}'

插入测试数据

curl -H "Content-Type: application/json"  -X PUT '192.168.0.91:9200/ikindex/chinese/1?pretty' -d '{"content":"如花的年轻生命嘎然而止了,而周周妹儿的精神在世间永存,愿周周妹一路走好,周周妹儿家人们节哀"}'

查询测试

curl  -H "Content-Type: application/json"  -XPOST '192.168.0.91:9200/ikindex/_search?pretty' -d '        {          "query": { "match": { "content" : "嘎然而止" } }        }'
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打非洲鼓打的手疼怎么办 无塔供水压力小怎么办 家用增压水塔压力不稳定怎么办 蝴蝶耳堵比较紧怎么办 跑步机踏板坏了怎么办 遥控器电池没电了怎么办 空调遥控器电池没电了怎么办 想要自慰家里没有情趣用品怎么办 对政协提案的答复有意见怎么办 邻居在自建房养殖鳖怎么办 江桥全民健身卡怎么办 南翔全民健身卡怎么办 椭圆机皮带断了怎么办 不小心扭腰了怎么办 扭腰之后腿疼怎么办 扭腰怎么办吃什么补 湖州奥体中心怎么办卡 学车把教练投诉了怎么办 白球鞋鞋边发黄怎么办 公务员体检时心跳过快怎么办 老人心脏跳得慢怎么办 银行月限额10万怎么办 跑步后迎面骨疼怎么办 跑步时迎面骨疼怎么办 爬了楼梯小腿疼怎么办 走路走太多小腿酸痛怎么办 微信转账月限额怎么办 运动后小腿骨疼怎么办 用单杠练腹肌晃怎么办 一跑步小腿就紧怎么办 小腿一跑步就痛怎么办 单杠屈臂悬垂身体摆动怎么办 脸上被打了紫了怎么办 王者荣耀队友太坑怎么办 大脸不想戴泳帽怎么办 脐带掉了有血怎么办 颈椎不小心扭了怎么办 遇不到合适的人怎么办 老爸不爱吃饭身体不好怎么办 小朋友在日本旅游生病怎么办 小朋友不吃饭装生病怎么办