首先,大家要调整一下概念,对应于普通的关系型数据库,你可以暂时这样考虑
| Relational DB |
Elasticsearch |
| Databases |
Indexes |
| Tables |
Types |
| Rows |
Documents |
| Columns |
Fields |
1、创建索引myindex
curl -XPUT http://localhost:9200/myindex
2、创建类型user
curl -XPOST http://localhost:9200/myindex/user/_mapping -d'
{
"user": {
"_all": {
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
"term_vector": "no",
"store": "false"
},
"properties": {
"用户ID": {
"type": "string",
"store": "no",
"analyzer": "keyword",
"search_analyzer": "keyword",
"include_in_all": "true",
"boost": 8
},
"姓名": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
"include_in_all": "true",
"boost": 8
},
"性别": {
"type": "string",
"store": "no",
"analyzer": "keyword",
"search_analyzer": "keyword",
"include_in_all": "true",
"boost": 8
},
"年龄": {
"type": "integer",
"store": "no",
"index": "not_analyzed",
"include_in_all": "true",
"boost": 8
},
"家庭住址": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
"include_in_all": "true",
"boost": 8
},
"注册时间": {
"type": "date",
"format": "yyy-MM-dd HH:mm:ss",
"store": "no",
"index": "not_analyzed",
"include_in_all": "true",
"boost": 8
}
}
}
}'
在这里类型user中,有几种索引类型,
| key |
类型 |
分词方式 |
| 用户ID |
string |
keyword |
| 姓名 |
string |
ik_max_word |
| 性别 |
string |
keyword |
| 年龄 |
integer |
not_analyzed |
| 家庭住址 |
string |
ik_max_word |
| 注册时间 |
date |
not_analyzed |
其中,
ik_max_word,指的是用ik分词,然后将分词结果作为term,需要分词检索的字段,需要这样处理
keyword,指的是,不要分词,而是把整个词作为term,ID及字典很适合这样做
not_analyzed,是不做分词处理,如数字、时间,没有必要
3、上传文档
curl -XPUT http://localhost:9200/myindex/user/u001 -d'
{
"用户ID": "u001",
"姓名":"张三",
"性别":"男",
"年龄":"25",
"家庭住址":"北京市崇文区天朝大街001号",
"注册时间":"2015-01-01 08:30:00"
}'
curl -XPUT http://localhost:9200/myindex/user/u002 -d'
{
"用户ID": "u002",
"姓名":"李四",
"性别":"男",
"年龄":"25",
"家庭住址":"上海市闸北区魔都大街007号",
"注册时间":"2015-02-01 08:30:00"
}'
curl -XPUT http://localhost:9200/myindex/user/u003 -d'
{
"用户ID": "u003",
"姓名":"王五",
"性别":"男",
"年龄":"26",
"家庭住址":"广州市花都区花城大街010号",
"注册时间":"2015-03-01 08:30:00"
}'
4、文档是否存在
#判断id为u003的文档是否存在
curl -XHEAD http://localhost:9200/myindex/user/u003
5、获取文档
#获取id为u003的文档
curl -XGET http://localhost:9200/myindex/user/u003
#获取id为u003的文档的姓名及性别字段
http://localhost:9200/myindex/user/u003?_source=姓名,性别
6、查询文档
#查询文档,默认返回前10个
curl -XGET http://localhost:9200/myindex/user/_search
#用参数进行查询
#年龄等于25的记录
curl -XGET http://localhost:9200/myindex/user/_search?q=年龄:25
#姓名等于王五的记录
curl -XGET http://localhost:9200/myindex/user/_search?q=姓名:王五
#姓名等于王五及年龄等于25的记录
curl -XGET http://localhost:9200/myindex/user/_search?q=+姓名:王五+年龄:26
#查询年龄等于25的用户
curl -XGET http://localhost:9200/myindex/user/_search -d'
{
"query" : {
"match" : {
"年龄" : "25"
}
}
}'
#查询年龄大于25,男性用户
curl -XGET http://localhost:9200/myindex/user/_search -d'
{
"query": {
"filtered": {
"filter": {
"range": {
"年龄": {
"gt": 25
}
}
},
"query": {
"match": {
"性别": "男"
}
}
}
}
}'
#查询家庭住址中,包含北京或上海的用户
curl -XGET http://localhost:9200/myindex/user/_search -d'
{
"query" : {
"match" : {
"家庭住址" : "北京 上海"
}
}
}'
#查询词组
curl -XGET http://localhost:9200/myindex/user/_search -d'
{
"query" : {
"match_phrase" : {
"家庭住址" : "北京 崇文"
}
}
}
#按年龄分组聚合,并count
curl -XGET http://localhost:9200/myindex/user/_search -d'
{
"aggs": {
"all_interests": {
"terms": { "field": "年龄" }
}
}
}
#男性患者,按年龄分组聚合,并count
curl -XGET http://localhost:9200/myindex/user/_search -d'
{
"query": {
"match": {
"性别": "男"
}
},
"aggs": {
"all_interests": {
"terms": {
"field": "年龄"
}
}
}
}