ElasticSearch常用命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch常用命令相关的知识,希望对你有一定的参考价值。

参考技术A

1.Get Index 查看索引的定义信息
GET /twitter,可以一次获取多个索引(以逗号间隔) 获取所有索引 _all 或 用通配符*
GET /twitter/_settings
GET /twitter/_mapping
http://127.0.0.1:9200/indexName/
http://127.0.0.1:9200/indexName/_mapping

2、创建别名后,直接使用就可以,作为indexName, 不需要做特殊操作

3、查看集群索引详情
http://127.0.0.1:9200/_cat/indices?v
查看健康状况
http://127.0.0.1:9200/_cat/health?v
查看线程池
http://127.0.0.1:9200/_cat/thread_pool/search?pretty
查看线程池具体情况(默认线程池个数:(cpu核数 3)/2+1)
http://127.0.0.1:9200/_cat/thread_pool/search?h=nn,i,n,s,r
删除索引
curl -XDELETE http://127.0.0.1:9200/indexName (如果想批量删除,就使用indexName )

4、查询索引中的数据
http://127.0.0.1:9200/indexName/_search?q=* 默认返回前10条数据

5、按条件查询索引数据
GET http://127.0.0.1:9200/indexName/_search
json body:
"query":"bool":"must":"term":"id.keyword":"001" 查询符合条件的数据,默认10条
"query":"bool":"must":"term":"id.keyword":"001","size":20 指定查询条数

6、根据id删除数据
curl -XDELETE http://127.0.0.1:9200/indexName/indexType/id

7、查询
查询条件:
全文检索:
match
match query,即匹配查询,接受text/numerics/dates查询参数,分析它们并构造查询。包含查询关键词分词中的任何一个或多个的文档都会被查询出来。

match_phrase
match phrase query,即匹配短语查询,它其实是在match的基础上将operator改为and的效果,只有文档的字段完全匹配 查询文本的所有分词短语 才会该文档返回。它的语法为:(语法和match很相似)
match_phrase_prefix
match phrase prefix query,即匹配短语前缀查询

术语查询:
term
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
term query查找指定字段的倒排索引中指定的确切术语的文档。它对大小写敏感且不会对查询参数分析,所以常用在对关键字、数字、日期字段查找值。其实,当字段的数据类型是"text",最好不要使用term查询, 因为原文档会被分词,分词后,完整的字段可能无法匹配。

range
range query查找指定字段包含指定范围内的值(日期,数字或字符串)的文档。range接受以下参数:gte 、gt、lte、lt和boost(表示匹配分值),

bool联合查询: must,should,must_not
如果我们想要请求"content中带宝马,但是tag中不带宝马"这样类似的需求,就需要用到bool联合查询。
联合查询就会使用到must,should,must_not,filter三种关键词。

must: 返回的文档必须满足must子句的条件,并且参与计算分值
should: 返回的文档可能满足should子句的条件。在一个Bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。如果有must或者filter,should子句会失效,即使should子句都不满足,也可以正常返回,可以通过设置minimum_should_match参数定义了至少满足几个子句,来解决该问题。
must_not: 返回的文档必须不满足must_not定义的条件。
filter:返回的文档必须满足filter子句的条件。但是不会像must一样,参与计算分值
比如上面那个需求:

数组查询
这个问题其实涉及好几个相关的知识点。

ES对于数组类型的写入和查询是怎样的
如何查询数组为空的记录
在ES中,没有专门的数组数据类型,但是默认情况下,任意一个字段都可以包含0或多个值,这意味着每个字段默认都是数组类型。不过ES要求数组类型的各个元素值的数据类型必须相同。比如,下面这种数组就就无法存入ES。
[ 10, "apple" ]
但是下面这几种就可以,
[ "apple", "orange" ]
[ 1, 2 ]
下面回到问题。看要求应该是需要关键字匹配,所以字段的mapping类型可以设置为keyword,然后查询使用term查询。
mapping如下:

然后写入两条文档,第二条是空的。

PUT my_index/_doc/1

"job_type": ["a", "b", "c"]

PUT my_index/_doc/2

"job_type": []

查询包含b的记录,

高亮查询:

查询问题:
1、should失效问题
当使用should查询时,如果包含了must或者filter查询,那么should的查询语句就不是或者的意思了,而是有或者没有都行的含义。
解决方案:
1.在bool条件中使用minimum_should_match,至少匹配一项should子句

2、index定义问题
尽量不要使用默认standard分词器。分词器对中文不太友好,会将中文分成一个一个的中文汉字,对查询结果也不友好。

命名问题:

es性能问题:
1、出现线程池拒绝
调整elasticsearch.yml配置processors参数,调整值得大小,可以设置为cpu核数的一半。

参考文档
https://www.cnblogs.com/yjf512/p/4897294.html
https://blog.csdn.net/sym542569199/article/details/85018527
https://blog.csdn.net/pony_maggie/article/details/108523816
https://blog.csdn.net/qq_37644899/article/details/99721586
https://www.pianshen.com/article/8846278050/
https://blog.csdn.net/JineD/article/details/111997205
https://blog.csdn.net/paditang/article/details/78802799

以上是关于ElasticSearch常用命令的主要内容,如果未能解决你的问题,请参考以下文章

elastic常用工具

Elasticsearch常用操作:集群管理篇

Elastic:在腾讯云上部署 Elasticsearch 集群

Elastic:在腾讯云上部署 Elasticsearch 集群

Elasticsearch:使用 Docker compose 来一键部署 Elastic Stack 8.x

PHP 中运用 elasticsearch