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" : "索引名称"
    }
    
  • 查看当前所有索引

    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 匹配时会对查询内容先分词
    1. match 返回所有只要包含查询词中任意单词的文档
    {"query":
        {
            "match":{字段名:{"query":查询匹配内容}}
        }
    }
    
    1. match_phrase 完全匹配,可通过slop参数调节少匹配单词个数,自定义匹配
    {
    "query":
        {
            "match_phrase":
    	{
                "字段名":
                        {
    		"query":查询匹配内容,
    		"slop":2 # 可以少匹配个数
                        }
                }
        }
    }
    
    1. multi_match 多个字段进行匹配,只要其中一个字段满足即可
    {
        "query":
        {
         "multi_match":
            {
            "query":查询匹配内容,
            "fields":["字段一","字段二"]
    	}
        }
    }
    
posted @ 2020-04-26 14:31  今日店休  阅读(185)  评论(0编辑  收藏  举报