条件删除文档
一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数据进行删除。
1.首先分别增加多条数据:
{ "query":{ "match":{ "price":4000.00 } } }
POST 请求 :http://127.0.0.1:9200/shopping/_delete_by_query
请求体内容为:
{ "query":{ "match":{ "price":4000.00 } } }
{ "took"【耗时】: 6, "timed_out"【是否超时】: false, "total"【总数】: 1, "deleted"【删除数量】: 1, "batches": 1, "version_conflicts": 0, "noops": 0, "retries": { "bulk": 0, "search": 0 }, "throttled_millis": 0, "requests_per_second": -1, "throttled_until_millis": 0, "failures": [] }
4.3 映射操作
有了索引库,等于有了数据库中的 database。
接下来就需要建索引库(index)中的映射了,类似于数据库(database)中的表结构(table)。创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。
创建映射
创建索引student
PUT 请求 :http://127.0.0.1:9200/student
创建映射
PUT 请求 :http://127.0.0.1:9200/student/_mapping
映射数据说明:
字段名:任意填写,下面指定许多属性,例如:title、subtitle、images、price
type:类型,Elasticsearch 中支持的数据类型非常丰富,说几个关键的:
String 类型,又分两种:
text:可分词
keyword:不可分词,数据会作为完整字段进行匹配
Numerical:数值类型,分两类
基本数据类型:long、integer、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float
Date:日期类型
Array:数组类型
Object:对象
index:是否索引,默认为 true,也就是说你不进行任何配置,所有字段都会被索引。
true:字段会被索引,则可以用来进行搜索
false:字段不会被索引,不能用来搜索
store:是否将数据进行独立存储,默认为 false
原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
analyzer:分词器,这里的 ik_max_word 即使用 ik 分词器,后面会有专门的章节学习
查看映射
GET 请求 :http://127.0.0.1:9200/student/_mapping
索引映射关联
PUT 请求 :http://127.0.0.1:9200/student1
{ "settings": {}, "mappings": { "properties": { "name": { "type": "text", "index": true }, "sex": { "type": "text", "index": false }, "age": { "type": "long", "index": false } } } }
相当于创建索引的时候进行映射关联
4.4 高级查询
Elasticsearch 提供了基于 JSON 提供完整的查询 DSL 来定义查询
定义数据 :
# POST /student/_doc/1001 { "name":"zhangsan", "nickname":"zhangsan", "sex":"男", "age":30 } # POST /student/_doc/1002 { "name":"lisi", "nickname":"lisi", "sex":"男", "age":20 } # POST /student/_doc/1003 { "name":"wangwu", "nickname":"wangwu", "sex":"女", "age":40 } # POST /student/_doc/1004 { "name":"zhangsan1", "nickname":"zhangsan1", "sex":"女", "age":50 } # POST /student/_doc/1005 { "name":"zhangsan2", "nickname":"zhangsan2", "sex":"女", "age":30 }
查看索引库中所有文档
GET/POST 请求 :http://127.0.0.1:9200/_search
查看指定索引下所有文档
GET/POST 请求 :http://127.0.0.1:9200/student/_search
{ "took"【查询花费时间,单位毫秒】: 1, "timed_out"【是否超时】: false, "_shards"【分片信息】: { "total"【总数】: 1, "successful"【成功】: 1, "skipped"【忽略】: 0, "failed"【失败】: 0 }, "hits"【搜索命中结果】: { "total"【搜索条件匹配的文档总数】: { "value"【总命中计数的值】: 5, "relation"【计数规则】: "eq" # eq 表示计数准确, gte 表示计数不准确 }, "max_score"【匹配度分值】: 1, "hits"【命中结果集合】: [ ... ... ] } }
条件匹配查询
2.路径拼接参数查询(推荐第二种)
GET/POST 请求 :http://127.0.0.1:9200/student/_search?q=name:zhangsan
参数 | 说明 |
? | 代码增加查询参数 |
q | 表示查询的意思 |
name | 查询的字段名 |
2.请求体携带参数查询(推荐)
match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系
GET/POST 请求 :http://127.0.0.1:9200/shopping/_search
请求体内容为:
{ "query": { "match":{ "name":"zhangsan" } } }
字段匹配查询
multi_match 与 match 类似,不同的是它可以在多个字段中查询。
GET 请求 :http://127.0.0.1:9200/student/_search
{ "query": { "multi_match": { "query": "zhangsan", "fields": ["name","nickname"] } } }
关键字精确查询
term 查询,精确的关键词匹配查询,不对查询条件进行分词。
GET 请求 :http://127.0.0.1:9200/student/_search
{ "query": { "term": { "name": { "value": "zhangsan" } } } }
多关键字精确查询
terms 查询和 term 查询一样,但它允许你指定多值进行匹配。
如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in。
GET 请求 :http://127.0.0.1:9200/student/_search
{ "query": { "terms": { "name": ["zhangsan","lisi"] } } }