我的ElasticSearch使用笔记

最新的整理在这里 https://github.com/vector4wang/elasticsearch-quick

以下基于Elastic 5.4版本

部署

这里使用Docker部署

  • 获取镜像docker pull elasticsearch:5.4
  • 启动 docker run -d -p 9200:9200 -p 9100:9100 elasticsearch:5.4

注意: 通过docker ps可以看到es的启动情况,如果没有成功可以通过docker logs elasticsearch:5.4 查看日志,一般会报这个错误Cannot allocate memory,此时加上-e ES_JAVA_OPTS="-Xms512m -Xmx512m",全命令即

docker run -d -p 9200:9200 -p 9100:9100 -e ES_JAVA_OPTS="-Xms512m -Xmx512m" elasticsearch:5.4

ES 的相关使用

查看状态

GET _cat/health?v

查看节点列表

GET _cat/nodes?v

创建索引

PUT index?pretty

查看索引列表

GET _cat/indices?v

删除索引

DELETE index?pretty

创建Mapping

POST index/type/_mapping

{
  "student": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "jieba_index",
        "search_analyzer": "jieba_search"
      },
      "class": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      },
      "sex": {
        "type": "integer"
      },
      "ranking": {
        "type": "integer"
      }
    }
  }
}


因为没有安装结巴分词插件,所以创建失败

查看Mapping

GET index/_mapping?pretty

索引文档

POST index/type/{id}

{"age":23,"class":"一年级2班","name":"小黑","ranking":13,"sex":1}

删除所有文档数据

POST index/type/_delete_by_query?conflicts=proceed

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

重点

ES支持的类型

这里用的是5.4

类型 包括
String text, keyword
Number long, integer, short, byte, double, float, half_float, scaled_float
Date date
Boolean boolean
Binary binary
Rande integer_range, float_range, long_range, double_range, date_range

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.4/mapping-types.html

关于String类型的text和keyword,我的理解是

如果该字段需要被分词,就使用text,如果不需要分词就使用keyword

分词

分词在ES中是比较重要的,因为分词的好坏直接影响到搜索结果准确度的高低!
分词器 接受一个字符串作为输入,将 这个字符串拆分成独立的词或 语汇单元(token) (可能会丢弃一些标点符号等字符),然后输出一个 语汇单元流(token stream) 。
https://www.elastic.co/guide/cn/elasticsearch/guide/current/standard-tokenizer.html

分词分为两种:索引分词搜索分词
在创建mapping的时候声明,如上

"name": {
    "type": "text",
    "analyzer": "jieba_index",
    "search_analyzer": "jieba_search"
  }

(下面是个人观点,如有问题,欢迎指出)
举个例子:
“我爱吃肠粉” 经过分词后可能有以下几个结果

  • 我,爱,吃,肠,粉
  • 我爱,吃,肠粉
  • 我爱吃,肠粉
  • 。。。

那么分词在ES中是怎样应用的?
当“我爱吃肠粉”索引到ES中之后,ES中对此句的描述变为“我”,“爱”,“吃”,“肠”,“粉”,此为索引分词

当用户查询“我”的时候,ES会将分词结果中包含“我”的结果输出,所以“我爱吃肠粉”会被搜索出来;如果输入“我爱”,而且搜索分词的结果也为“我爱”的时候,“我爱吃肠粉”则不会被搜索出来

ES默认的分词为“英文分词”,即“我爱吃肠粉”的第一种分词结果,这很显然不符合我们一般的应用场景,所以这个时候就需要引入第三方插件了,如“结巴分词”和IK分词
IK: https://github.com/medcl/elasticsearch-analysis-ik
Jieba: https://github.com/sing1ee/elasticsearch-jieba-plugin

按照自己的具体搜索场景来选择合适的分词插件

term 和 match 的使用

可学习这篇博客:http://www.cnblogs.com/yjf512/p/4897294.html 写的详细全面

2018年3月5日 更新

更新

PUT /index/type/id

{
  "title": "My first blog entry",
  "text":  "I am starting to get the hang of this...",
  "date":  "2014/01/02"
}

这个id是es自己的id(可在索引的时候设置id)
java实现

UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index(index);
updateRequest.type(document_type);
updateRequest.id(resumeId);
updateRequest.doc(jsonBuilder().startObject().field(fileName, fileValue).endObject());
UpdateResponse updateResponse = elasticSearchClient.getClient().update(updateRequest).get();

https://www.elastic.co/guide/cn/elasticsearch/guide/current/update-doc.html

updateByquery

POST index/_update_by_query

{
  "script": {
    "inline": "ctx._source.likes++",
    "lang": "painless"
  },
  "query": {
    "term": {
      "user": "kimchy"
    }
  }
}

ctx._source 为 一条记录对象
上面是“将查出来的文档中likes的值加1”

java实现

TransportClient client = elasticSearchClient.getClient();
UpdateByQueryRequestBuilder updateByQueryRequestBuilder = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);
String script = "";
if (1 == switchValue) {
    script = "ctx._source.is_buy = 1";
} else {
    script = "ctx._source.is_buy = 0";
}
Script scriptObj = new Script(script);
BulkByScrollResponse bulkByScrollResponse = updateByQueryRequestBuilder.source(index)
        .script(scriptObj)
        .filter(QueryBuilders.termQuery("owner_id", ownId)).abortOnVersionConflict(false).get();
List<BulkItemResponse.Failure> bulkFailures = bulkByScrollResponse.getBulkFailures();
for (BulkItemResponse.Failure bulkFailure : bulkFailures) {
    logger.error(bulkFailure.getMessage());
        }

https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docs-update-by-query.html

以上就是我在工作中使用ES 总结的内容,入门到会使用应该是没问题。之后会继续学习并更新~

CSDN:http://blog.csdn.net/qqhjqs?viewmode=list
博客:http://vector4wang.tk/
简书:https://www.jianshu.com/u/223a1314e818
Github:https://github.com/vector4wang
Gitee:https://gitee.com/backwxc

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

推荐阅读更多精彩内容