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取代,这是在看其他老版本的教程中发现的问题,最后在官网提供的文档中给出了一下基本类型
当然还有其他复合类型,比如IP类型,email类型具体可以参考官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
字段索引类型:索引是ES中的核心,ES之所以能够实现实时搜索,完全归功于Lucene这个优秀的Java开源索引。在传统数据库中,如果字段上建立索引,我们仍然能够以它作为查询条件进行查询,只不过查询速度慢点。而在ES中,字段如果不建立索引,则就不能以这个字段作为查询条件来搜索。也就是说,不建立索引的字段仅仅能起到数据载体的作用。string类型的数据肯定是日常使用得最多的数据类型,下面介绍mapping中string类型字段可以配置的索引类型。
如果索引类型设置为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" : "嘎然而止" } } }'
- ELK第五篇:mapping的创建和中文模糊查询
- Mybatis模糊查询,查询不到中文,却可以查询到英文和数字的一种解决办法
- 中文拼音模糊查询的一种解决方法
- Hibernate中文模糊查询
- hibernate的模糊查询和sql查询
- MySql解决不区分大小写和中文模糊查询问题
- 【服务端】hibernate中文模糊查询
- Mysql中文模糊查询问题
- comboBox 的模糊查询和自动填充
- mybatis 模糊查询和<![CDATA[ ]]>的作用
- SearchView和Listview的绑定,模糊查询
- 模糊查询,concat和concat_ws的使用
- linq的模糊查询和分页
- SQLITE中文模糊查询的问题及解决办法
- 模糊查询和排序
- SQL的模糊查询
- 模糊查询的关键字
- webdynpro的模糊查询
- [bfs序 线段树] HDU5957. Query on a graph
- 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中
- Microsoft OneNote
- ARP原理、利用、防御(链路层)
- C 语言 define 变参__VA_ARGS__使用
- ELK第五篇:mapping的创建和中文模糊查询
- Java中的String为什么是不可变的?
- 在自己的数据集上微调Light CNN
- RecyclerView的基本用法与四种数据展示(listview,griderview,单行,多行)
- Android_ButterKnife入门
- 提升方法Adaboost
- scala实现YARN中ResourceManager与NodeManager的主从关系模型
- 2.3.3 理解复合类型的声明
- mybatis的增删查改之通用Mapper