ElasticSearch目录
文章目录
五、ES命令操作(Rest风格说明)
5.1、基本Rest命令说明5.2、关于索引的基本操作
5.2.1、创建一个索引,添加5.2.2、字段数据类型5.2.3、指定字段的类型(使用PUT)5.2.4、获取建立的规则信息5.2.5、获取默认信息5.2.6、修改
①旧的(使用put覆盖原来的值)②新的(使用post的update) 5.2.7、删除 5.3、关于文档(行记录)的基本操作
5.3.1、查询(简单条件)5.3.2、复杂查询
①匹配查询②布尔值查询、多条件匹配查询(bool)③匹配数组,匹配一个字段的多个条件④精确查询⑤text和keyword 类型对比⑥高亮查询
五、ES命令操作(Rest风格说明)一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
5.1、基本Rest命令说明| method | url地址 | 描述 |
|---|---|---|
| PUT(创建,修改) | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
| POST(创建) | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
| POST(修改) | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
| DELETE(删除) | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
| GET(查询) | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档ID |
| POST(查询) | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
PUT /索引名称/类型名称/文档id
{请求体}
PUT /test1/type1/1
{
"name" : "流柚",
"age" : 18
}
5.2.2、字段数据类型
字符串类型
text、keyword
text:支持分词 ,全文检索,支持模糊、精确查询,不支持聚合,排序操作:text类型的最大支持的字符长度无限制,适合大字段存储;keyword:不支持分词 ,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
数值型
long、Integer、short、byte、double、float、half float、scaled float
日期类型
date
布尔类型
boolean
二进制类型
binary
等等…
5.2.3、指定字段的类型(使用PUT)类似于建库(建立索引和字段对应类型),也可看做规则的建立
PUT /test2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age":{
"type": "long"
},
"birthday":{
"type": "date"
}
}
}
}
5.2.4、获取建立的规则信息
可以通过GET请求获取具体的信息
GET test25.2.5、获取默认信息
_doc 默认类型(default type),type 在未来的版本中会逐渐弃用,因此产生一个默认类型进行代替
PUT /test3/_doc/1
{
"name": "流柚",
"age": 18,
"birth": "1999-10-10"
}
GET test3
如果自己的文档字段没有被指定,那么ElasticSearch就会给我们默认配置字段类型。
如上图:通过命令 GET test3,查看索引test3中的字段默认类型,其中name字段的类型是text,但是该字段的关键字切分却是keyword类型,即不能分割。所以建议:在创建索引时,指明字段的类型与拆分规则,如下命令:
PUT /test3
{
"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "ik_max_word" // ik分词器-最细粒度拆分
//这样在搜索的时候,才会匹配到我们需要的结果
}
}
}
}
扩展:通过get _cat/ 可以获取ElasticSearch的当前的很多信息!
GET _cat/indices GET _cat/aliases GET _cat/allocation GET _cat/count GET _cat/fielddata GET _cat/health GET _cat/indices GET _cat/master GET _cat/nodeattrs GET _cat/nodes GET _cat/pending_tasks GET _cat/plugins GET _cat/recovery GET _cat/repositories GET _cat/segments GET _cat/shards GET _cat/snapshots GET _cat/tasks GET _cat/templates GET _cat/thread_pool5.2.6、修改
①旧的(使用put覆盖原来的值)两种方案
版本+1(_version)但是如果漏掉某个字段没有写,那么更新时没有写的字段 ,会消失
PUT /test3/_doc/1
{
"name" : "流柚是我的大哥",
"age" : 18,
"birth" : "1999-10-10"
}
GET /test3/_doc/1
// 修改会有字段丢失
PUT /test3/_doc/1
{
"name" : "流柚"
}
GET /test3/_doc/1
②新的(使用post的update)
version会改变需要注意doc不会丢失字段
POST /test3/_doc/1/_update
{
"doc":{
"name" : "post修改,version不会加一",
"age" : 2
}
}
GET /test3/_doc/1
5.2.7、删除
GET /test1 DELETE /test15.3、关于文档(行记录)的基本操作 5.3.1、查询(简单条件)
# 最简单的查询,类似与数据库通过id来查询。GET /test3/_doc/1GET /test3/_doc/_search?q=name:流柚
注意结果中的 “_score” 为匹配度,匹配度越高则分值越高,位置越靠前,就是权重的意思
还有 hits字段,在java中有对应的对象,它包含了:
索引和文档的信息查询的结果总数然后就是查询出来的具体的文档(行记录),数据中的东西都可以遍历出来了
5.3.2、复杂查询①匹配查询blog索引中的内容
_search :指明查询操作
query :构造查询条件
match:匹配(会使用分词器解析(先分析文档,然后进行查询))
_source:过滤字段,指定要查询出来哪几个字段信息
sort:排序,根据哪个字段排序,注意有此条件时,查询结果中"_score" 为null
分页查询: form (从第几个开始)、size (每页大小)
// 查询匹配 GET /blog/user/_search { "query":{ "match":{ "name":"流" } }, "_source": ["name","desc"] , "sort": [ { "age": { "order": "asc" } } ] , "from": 0 , "size": 1 }
②布尔值查询、多条件匹配查询(bool)
must 相当于 andshould 相当于 ormust_not 相当于 notfilter 过滤(范围查询)
/// bool 多条件查询 must <==> and should <==> or must_not <==> not 不等于 filter数据过滤 (gte >= lte <=) boost minimum_should_matchGET /blog/user/_search{ "query":{ "bool": { "must": [ { "match":{ "age":3 } }, { "match": { "name": "流" } } ], "filter": { "range": { "age": { "gte": 1, "lte": 3 } } } } }}
③匹配数组,匹配一个字段的多个条件
貌似不能与其它字段一起使用可以多关键字查(空格隔开),只要满足其中一个结果就可以被查出来match 会使用分词器解析(先分析文档,然后进行查询)搜词
// 匹配数组 貌似不能与其它字段一起使用// 可以多关键字查(空格隔开)// match 会使用分词器解析(先分析文档,然后进行查询)GET /blog/user/_search{ "query":{ "match":{ "desc":"年龄 牛 大" } }}
④精确查询
term 直接通过 倒排索引 指定 词条 查询 (可以和 match 对比一下)
term ,直接查询精确的match,会使用分词器解析! (先分析文档,然后在通过分析的文档进行查询! ) 关于分词:适合查询 类型 为 number、date、keyword ,不适合字段类型为 text
// 精确查询(必须全部都有,而且不可分,即按一个完整的词查询)// term 直接通过 倒排索引 指定的词条 进行精确查找的GET /blog/user/_search{ "query":{ "term":{ "desc":"年" //查询“desc”字段中 带有“年”这个字的记录 } }}//利用term 进行多条件查询//查询desc字段中含有 “年” 或者 “我”的记录GET /blog/user/_search{ "query":{ "bool":{ "should":{ "term":{ "desc":"年" }, "term":{ "desc":"我" } } } }}
⑤text和keyword 类型对比
text:
支持分词,全文检索、支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储; keyword:
不进行分词,不会被分词器解析,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
// 测试keyword和text是否支持分词// 设置索引类型PUT /test{ "mappings": { "properties": { "text":{ "type":"text" }, "keyword":{ "type":"keyword" } } }}// 设置字段数据PUT /test/_doc/1{ "text":"测试keyword和text是否支持分词", "keyword":"测试keyword和text是否支持分词"}// text 支持分词// keyword 不支持分词GET /test/_doc/_search{ "query":{ "match":{ "text":"测试" } }}// 查的到GET /test/_doc/_search{ "query":{ "match":{ "keyword":"测试" } }}// 查不到,必须是 "测试keyword和text是否支持分词" 才能查到GET _analyze{ "analyzer": "keyword", "text": ["测试liu"]}// 不会分词,即 测试liuGET _analyze{ "analyzer": "standard", "text": ["测试liu"]}// 分为: 测 试 liuGET _analyze{ "analyzer":"ik_max_word", "text": ["测试liu"]}// 分为: 测试 liu
⑥高亮查询
/// 高亮查询GET blog/user/_search{ "query": { "match": { "name":"流" } }, "highlight": { "fields": { "name": {} // 查询出来的结果,name字段高亮显示 } }}// 自定义前缀和后缀 的高亮查询 (自定义的前缀和后缀 会替换默认的)GET blog/user/_search{ "query": { "match": { "name":"流" } } , "highlight": { "pre_tags": "", "post_tags": "
", "fields": { "name": {} } }}



