ElasticSearch常用命令

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, 不需要做特殊操作

PUT /_aliases
{
  "actions": [
    {
      "add": {
        "index": "index_one",
        "alias": "index_one_alias"
      }
    }
  ]
}

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查询参数,分析它们并构造查询。包含查询关键词分词中的任何一个或多个的文档都会被查询出来。

{
  "query": {
    "match": {
        "content" : "测试查询"
    }
  }
}

{
  "query": {
    "match": {
        "content" : {
            "query" : "测试查询",// 有额外参数时,查询文本放在query中
            "operator": "or"
        }
    }
  }
}

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

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

{
  "query": {
    "term": {
      "content": "汽车保养"
    }
  }
}

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一样,参与计算分值
比如上面那个需求:

{
  "query": {
    "bool": {
      "must": {
        "term": {
          "content": "宝马"
        }
      },
      "must_not": {
        "term": {
          "tags": "宝马"
        }
      }
    }
  }
}

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

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

PUT my_index
{
  "mappings": {
    "properties": {
      "job_type": {
        "type": "keyword"
      }
    }
  }
}

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

PUT my_index/_doc/1
{
"job_type": ["a", "b", "c"]
}

PUT my_index/_doc/2
{
"job_type": []
}
查询包含b的记录,

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "job_type": {
            "value": "b"
          }
        }}
      ]
    }
  }
}

高亮查询:

//配置标题高亮显示
HighlightBuilder highlightBuilder = new HighlightBuilder(); //生成高亮查询器
highlightBuilder.field(title);      //高亮查询字段
highlightBuilder.field(content);    //高亮查询字段
highlightBuilder.requireFieldMatch(false);     //如果要多个字段高亮,这项要为false
highlightBuilder.preTags("<span style=\"color:red\">");   //高亮设置
highlightBuilder.postTags("</span>");
//下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等
highlightBuilder.fragmentSize(800000); //最大高亮分片数
highlightBuilder.numOfFragments(0); //从第一个分片获取高亮片段             
highlightBuilder.order(HighlightBuilder.Order.SCORE);//order是关键,这个就是加完高亮标签之后,然后按照标签多少来排序的。待验证

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

{
    "query":{
        "bool":{
            "must":[
                {
                    "term":{
                        "sex":"男"
                    }
                }
            ],
            "should":[
                {
                    "term":{
                        "name":"ceshi"
                    }
                }
            ],
            "minimum_should_match":1
        }
    }
}

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

定义:
{
    "fieldName":{
        "type":"keyword",
        "field":{
            "ik":{
                "type":"text",
                "analyzer":"ik_max_word"
            }
        }
    }
}
按如上定义,就可以标明fieldName的分词使用ik,  查询时,使用fieldName.ik 就可以按照ik分词查询。使用filedName精确查找。
若按如下定义,fieldName查询时就按默认分词器分词了。使用fieldName.keyword精确查找。所以定义index时要考虑清楚。
{
    "fieldName":{
        "type":"text",
        "field":{
            "keyword":{
                "type":"keyword"
            }
        }
    }
}

命名问题:

{
    "field_name":{
        "type":"keyword",
        "field":{
            "ik":{
                "type":"text",
                "analyzer":"ik_max_word"
            }
        }
    }
}
如果定义的属性名是用下划线分割的,则在java DTO定义中,需要使用 @JSONField定义index中对应的属性字段名称,否则插入后,会新增一个属性为fileName的字段。
    @JSONField(name="filed_name")
    private String fileName;

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 1:查询当前配置信息---settingcurl --location --request GET 'http:/...
    浩楠Chen阅读 239评论 0 0
  • 查询文档索引表数据 例如查询 test_index下test_type下的文档内容 根据条件查询数据 根据条件查询...
    taj3991阅读 93评论 0 0
  • 一、索引 1、创建索引 请求方式:PUT 请求路径:索引库名 请求参数:json格式 2、查看索引 3、查询所有索...
    紫荆秋雪_文阅读 583评论 0 0
  • 做了近半年的公司ES集群维护及开发,开始转入别的项目组,所有对曾经的这段技术使用 做个总结,主要是一些运维经验,还...
    逗逼程序员阅读 508评论 0 0
  • ElasticSearch用作全文检索,一直没有好好研究它的命令,每次使用的时候都要谷歌搜索,效率太低。 本文把一...
    十毛tenmao阅读 13,810评论 0 9