Elastic Search常用命令

1. 查看es的集群状态:

curl 'localhost:9200/_cat/health?v'

注释:?v表示格式化输出

2. 查看节点列表

curl 'localhost:9200/_cat/nodes?v'

3.查询所有索引及数据大小

curl 'localhost:9200/_cat/indices?v'

store.size为保存的所有数据大小,包含副本的数据;
pri.store.size为primary store size,即主分片的数据大小;
pri为分片个数,rep为副本个数。
store.size = pri.store.size * (rep + 1)

4.创建索引(名称为studentindex)并指定分片数和备份数

curl -XPUT 'http://localhost:9200/studentindex' -d'
{
    "settings" : {
        "index" : {
            "number_of_shards" : 3, 
            "number_of_replicas" : 2 
        }
    }
}'

5.创建索引studentindex,并添加类型student,并指定分词是studentname,分词器采用ik中文分词

curl -XPUT 'http://localhost:9200/studentindex' -d '
{
  "settings":{
        "analysis" : {
                "analyzer" : {
                    "ik" : {
                        "tokenizer" : "ik_smart"
                    }
                }
            },
        "number_of_shards":7,
        "number_of_replicas":2
    },
  "mappings": {
    "student": {
      "properties": {
        "studentId": {
            "type": "keyword"
               },
        "studentname": {
           "type": "text",
           "analyzer": "ik_max_word",
           "search_analyzer": "ik_smart"
        }
      }
    }
  }
}'
说明:

在插入文档时,ES查看该字段有没有定义analyzer,如果定义了就用定义的,否则使用ES默认的;
在搜索文档时,ES会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义就使用否则使用ES默认的。
针对中文分词,一般创建index时指定analyzer = ik_max_word,search_analyzer = ik_smark。

历史经验:

如果关键词为:河南省二七纪念塔
使用ik_smart分词为:[河南省二七纪念塔,河南省,二七,纪念塔]
使用ik_max_word分词为:[河南省二七纪念塔,河南省,河南,河,南,省,二七,纪念塔,纪念,纪,念,塔]
如果指定analyzer = ik_smark,search_analyzer = ik_smark,那么搜索“河南”将搜索不到“河南省二七纪念塔”这条记录,因为分词里不包含“河南”这个词,只有搜索“河南省”搜索到。
keyword和text的区别:
text类型字段是基于文本的相关搜索,可以指定分词(如ik分词器),当指定分词后,可以在全文本字段上搜索单词(假如field="中华人民共和国",可以通过搜索"中华","共和国"等搜索到记录)。但是text类型不能,"analyzer" ="ik_max_word"够用于排序和聚合,否则提示illegal_argument_exception错误。
keyword类型字段在ES中不进行分词,也不支持指定分词器(如ik分词器),数据是完整保存的(field="中华人民共和国",可以通过搜索"中华","共和国"等搜索不到记录)。通常用于过滤,排序和聚合,适合保存枚举值,如男/女,公司类型等。
可以通过同一个字段拥有text和keyword两个版本,一个用于全文搜索,另一个用于聚合和排序,这样就同时满足二者的功能,但增加了存储空间。

另外修改type,analyzer需要重新导入数据,可以通过创建index别名来实现。

查询index的mappings和settings

curl -XGET 'http://localhost:9200/studentindex/_mappings'
curl -XGET 'http://localhost:9200/studentindex/_settings'

Elastic Search和mysql的对应关系

MySql Elastic Search
database index
table type
row document
cloumn field
schema mapping
index Everything is indexed
SQL query DSL
slect * from... get http://...
update talbe set... put http://...

6.查询索引是studentindex,type是student,studentname字段的值是“李”的信息,默认返回第一页,10条数据

curl -XGET \
'http://localhost:9200/studentindex/student/_search?q=studentname:李

返回结果:

{
    "took": 32,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 645161,
        "max_score": 13.882782,
        "hits": [{
                "_index": "studentindex",
                "_type": "student",
                "_id": "AWNIsqEX4aqkPyNgQr06",
                "_score": 13.882782,
                "_source": {
                    "studentname": "李李四"
                }
            },
            {
                "_index": "studentindex",
                "_type": "student",
                "_id": "AWNIsqEX4aqkPyNgQr06",
                "_score": 13.23425,
                "_source": {
                    "studentname": "李五"
                }
            }
        ]
    }
}

7.使用post查询elastic search

curl -X POST \
'http://localhost:9200/studentindex/student/_search'  -d '{
    "query": {
        "match": {
            "studentname": "李"
        }
    },
    "from": 100,  // 第几页开始
    "size": 10   // 每页的大小
}'

返回结果同上:

注释:
在url中的q=* 相等于body中的

{
    "query": { "match_all": {} }
}

精确查找的body为:

{
  "size":10,
  "query" : { "term" : { "studentname" : "李四" }}
}

跨字段搜索

{
    "query": {
        "multi_match": {
            "query": "李四",
            "type": "most_fields",
            "fields": ["studentname", "studentId"]
        }
    }
}

多字段查询

{
    "query": {
        "bool": {

            "should": [{
                    "match": {
                        "studentname": "李四"
                    }
                },
                {
                    "match": {
                        "studentId": "11232341"
                    }
                }
            ]
        }
    }
}

权值搜索

{
    "query": {
        "bool": {
            "should": [{
                    "match": {
                        "studentname": {
                            "query": "太平洋",
                            "boost": 2 // 权值默认是1
                        }
                    }
                },
                {
                    "match": {
                        "studentId": {
                            "query": "公司",
                            "boost": 1   // 权值默认是1
                        }
                    }
                }
            ]
        }
    }
}

组合查询

{
    "query": { 
                "bool": {
                    "should": { //至少有一个语句要匹配,与 OR 等价。
                        "match": {
                            "studentname": "太平洋"
                        }
                    },

                    "must_not": { //所有的语句都 不能(must not) 匹配,与 NOT 等价。
                        "match": {
                            "studentId": "A"
                        }
                    },
                    "must": { //所有的语句都 必须(must) 匹配,与 AND 等价。
                        "match": {
                            "studentname": "会议"
                        }
                    }
                }
            }
     
}

跨字段权值搜索,使用^操作符

{
    "query": {
        "multi_match": {
            "query": "李四",
            "type": "most_fields",
            "fields": ["studentname^3", "studentId"]
        }
    }
}

排序,asc或者desc

{
    "query": {
        "multi_match": {
            "query": "李四",
            "type": "most_fields",
            "fields": ["studentname", "studentId"]
        }
    },
    "sort":{
        "studentId":{ // studentId不能够是text类型的,否则报错
          "order": "asc"  
        }
    }
  
}

8.查询数据总数:

curl -XPOST 'http://localhost:9200/studentindex/student/_count'

9.插入数据

a. curl -XPOST 'localhost:9200/studentindex/student?pretty' -d' 
{"studentname": "Jane Doe" }'

b.指定数据的Id是id1

curl -XPOST 'localhost:9200/studentindex/student/id1?pretty' -d' 
{"studentname": "John Doe" }'

10 删除数据

a.删除studentindex中ID为2的数据

curl -XDELETE 'localhost:9200/studentindex/student/2?pretty'

b.根据条件删除数据

curl -XPOST 'localhost:9200/studentindex/student/_delete_by_query?pretty' 
-d
 '{
    "query": {
        "match": {
            "studentname": "John"
        }
    }
}'

c.删除索引

curl -XDELETE 'localhost:9200/studentindex/student

11.修改数据的属性

修改id=1的studentname属性值部分更新
update 部分更新请求表单接受一个局部文档参数 doc ,它会合并到现有文档中的对象合并在一起,存在的标量字段被覆盖,新字段被添加。Elastic Search采用CAS乐观锁的方式实现更新数据。

curl -XPOST 'localhost:9200/studentindex/student/1/_update?pretty' -d ' {
  "doc":    {
        "studentname": "xyd" 
    }
}'

修改id=1的studentname属性值-全量更新
1.从旧文档中检索文档;
2.修改它;
3.删除旧的文档;
4.索引新文档。

curl -XPOST 'localhost:9200/studentindex/student/1' -d ' {
    "doc":  {
        "studentname": "xyd" 
    }
}'

12. 查看分词结果

curl -X POST http://localhost:9200/student/_analyze 
  -d '{  
    "analyzer":"ik_smart", // 分词器
    "text" : "北京地铁有限公司" 
}
'

13.查看elastic search版本信息

curl 'localhost:9200'

14.function_score查询

curl -X GET 'localhost:9200/student_search' -d '
{
    "query": {
        "function_score": {
            "query": {.....}, //主查询,会得到一个old_score评分。
            "field_value_factor": {...}, //在old_score的基础上,制定其他字段的评分,会产生一个加强score。
            "boost_mode": "multiply", //指定用哪种方式结合old_score和加强score成为new_score
            "max_boost": 5 //限制加强score的最高分
        }
    }
}
 
'

15.同义词查询

同义词配置:
定义同义词文件synonym.dic

土豆,洋芋,马铃薯
玉米,苞米,包谷,棒子
u s a,united states,united states of america => usa
g b,gb,great britain => britain,england,scotland,wales

定义索引格式

{
  "settings": {
    "analysis": {
      "filter": {
        "lance_synonym_filter": {
          "type": "synonym",
          "synonyms_path" : "synonym.dic"
        }
      },
      "analyzer": {
        "lance_synonyms": {
          "tokenizer": "ik_smart",
          "filter": [ 
            "lance_synonym_filter"
          ]
        }
      }
    }
  }
}
 

使用举例:GET ***/_analyze?analyzer=lance_synonyms

16.filter和query的异同

filter仅仅过滤条件,不进行相关度的评分,所以score结果为0,而且ES内部实现了cache功能,自动cache;
query要进行相关度的评分,并按照相关度进行排序,query不支持cache。

参考资料:
《Elasticsearch: 权威指南》https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,805评论 0 11
  • -▼- 默默跟我说她分手的时候,我吃了一惊,脑子里全是俩人成天虐狗的情景。 我忿忿不平地说:你们俩那么好,怎么就分...
    木右君_阅读 382评论 0 0
  • 转载自http://www.cnblogs.com/exmyth/p/3616672.html 在mysql中存在...
    煮茶听雨阅读 1,238评论 0 0
  • 第一次见她 浓妆艳抹满脸皱纹 但是头发整齐 和她一起的 还有一位先生 二人年纪相仿 我猜他们是爱人吧 她的爱人总是...
    斐管家阅读 102评论 0 0