Elasticsearch 使用
1. Elasticsearch docker 单节点部署
- docker search elasticsearch
- docker pull elasticsearch:7.3.2
- docker run
docker run -d -e discovery.type="single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" --name=es_test --net=host elasticsearch:7.3.2
- docker exec -it es_test bash 进入容器ps -ef 获取ps -aux 查看elasticsearch是否启动
- curl 127.0.0.1:9200 不报错出现详细信息即启动成功
{
"name" : "22d60c25bf5c",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "orRZSvTlSTypHnp2evvJkQ",
"version" : {
"number" : "7.2.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "508c38a",
"build_date" : "2019-06-20T15:54:18.811730Z",
"build_snapshot" : false,
"lucene_version" : "8.0.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
2. restful api 使用
-
创建索引
curl -XPUT "127.0.0.1:9200/索引名称?pretty"
- pretty,参数告诉elasticsearch,返回形式打印JSON结果
return:
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "索引名称" }
- pretty,参数告诉elasticsearch,返回形式打印JSON结果
-
查看当前所有索引
curl 127.0.0.1:9200/_cat/indices?v
-
新建文档
curl -XPUT 127.0.0.1:9200/索引名称/type/id?pretty -d '{"name":"lucy"}'
-
查看单个文档,根据文档id和类型
curl -XPUT 127.0.0.1:9200/索引名称/type/id?pretty
-
搜索
- get
# 查看所有下所有文档 curl "127.0.0.1:9200/索引名称/_search?pretty" # 查询整个库 curl "127.0.0.1:9200/_search?q=字段名:需要查找的内容" curl "127.0.0.1:9200/_search?q=lucy&df=name" # 指定索引下查询 curl "127.0.0.1:9222/索引名称/_search?q=name:lucy" curl "127.0.0.1:9222/索引名称/_search?q=lucy&df=name" # 指定索引以及type下查询 curl "127.0.0.1:9222/索引名称/type/_search?q=name:lucy" curl "127.0.0.1:9222/索引名称/type/_search?q=lucy&df=name"
- post
# 查看所有下所有文档 curl -XPOST "127.0.0.1:9200/索引名称/_search?pretty" -d '{"query":{"match_all":{}}}' # 查询整个库 curl "127.0.0.1:9200/_search?pretty" -d '{"query":{"term":{字段名:内容}}}' exp: curl "127.0.0.1:9200/_search?pretty" -d '{"query":{"term":{"name":"lucy"}}}' # 检索name字段为lucy的文档 # 指定索引下查询 curl "127.0.0.1:9200/索引名称/_search?pretty" -d '{"query":{"term":{字段名:内容}}}' exp: curl "127.0.0.1:9200/索引名称/_search?pretty" -d '{"query":{"term":{"name":"lucy"}}}' # 检索name字段为lucy的文档 # 指定索引以及type下查询 curl "127.0.0.1:9200/索引名称//type/_search?pretty" -d '{"query":{"term":{字段名:内容}}}' exp: curl "127.0.0.1:9200/索引名称//type/_search?pretty" -d '{"query":{"term":{"name":"lucy"}}}' # 检索name字段为lucy的文档 body: # 全查询 { "query": { "match_all":{} } } # 指定条件查询 { "query": { "term": { "字段名":"检索内容" } } "sort":{"字段名称":{"order":"desc"}}, # 排序,按照指定字段排序,该字段必须为可排序字段类型 "_source":["字段名称","字段名称"], # 只返回指定字段内容 "from":int, # 指定文档索引从哪开始,默认为0 "size":int # 返回文档个数,默认为10 }
3. 详解检索时term和match的区别
- term
代码完全匹配,文档必须包含整个搜索的词汇,不会进行分词
使用term要看查询字段是否analyzed,默认是被分析的
exp: 一句话存储时被分析过的结果存储的为词,如果not_analyzed存储整句话内容,当使用整句话完全匹配时,被分析过的结果无法匹配出来 - match 匹配时会对查询内容先分词
- match 返回所有只要包含查询词中任意单词的文档
{"query": { "match":{字段名:{"query":查询匹配内容}} } }
- match_phrase 完全匹配,可通过slop参数调节少匹配单词个数,自定义匹配
{ "query": { "match_phrase": { "字段名": { "query":查询匹配内容, "slop":2 # 可以少匹配个数 } } } }
- multi_match 多个字段进行匹配,只要其中一个字段满足即可
{ "query": { "multi_match": { "query":查询匹配内容, "fields":["字段一","字段二"] } } }