Elasticserach操作

 索引的管理

   1)创建索引库
      方法:
         put
      url:
         http://192.168.68.129:9200/{索引名称}

      分片:
         早期版本默认是5片,所有片加到一起才是一个完整的索引库。
         ES7中默认是1片。
      副本:
         默认是1
         每个分片默认都有一个副本。
   2)删除索引
      方法:
         delete
      url:
         http://192.168.68.129:9200/{索引名称}
3)设置mapping
   就是索引中文档格式的定义。
   文档中包含的字段的名称、数据类型、是否索引、是否存储、是否分词。
   最好是先定义好mapping然后再添加数据。不定义mapping也可以添加,es会根据Document格式推断出mapping的定义。

   1.创建索引库时定义mapping
      方法:
         put
      url:
         http://192.168.68.129:9200/{索引名称}
      例如:
         http://192.168.68.129:9200/blog
      请求体:
         --如果要进行分词处理必须使用text类型,keyword类型不分词。
         --如果document中的内容在后续业务中有需要就要存储,否则就可以不存储。不存储也可以分词创建索引,不影响搜索。
         --不分词也可以创建索引,如果有查询需要就可以创建索引。例如:身份证号、手机号。
         
{
  "mappings": {
    "properties": {
      "id": {
        "type": "long"
      },
      "title": {
        "type": "text",
        "analyzer": "standard",
        "store": "true",
        "index": true
      },
      "mobile": {
        "type": "keyword",
        "store": "true",
        "index": true
      },
      "comment": {
        "type": "text",
        "analyzer": "standard",
        "store": "true",
        "index": true
      }
    }
  }
}

2.先创建索引库然后设置mapping
   方法:
      put、post
   url:
      http://192.168.68.129:9200/{索引名称}/_mapping
   请求体:
{
  "properties": {
    "id": {
      "type": "long"
    },
    "title": {
      "type": "text",
      "analyzer": "standard",
      "store": "true",
      "index": true
    },
    "mobile": {
      "type": "keyword",
      "store": "true",
      "index": true
    },
    "comment": {
      "type": "text",
      "analyzer": "standard",
      "store": "true",
      "index": true
    }
  }
}

4)Settings
   1.创建索引库时设置settings
      方法:
         put
      url:
         http://192.168.68.129:9200/{索引名称}
      例如:
         http://192.168.68.129:9200/blog
      请求体:
  
{
  "settings": {
    "number_of_shards": "5",
    "number_of_replicas": "1"
  }
}
   2.创建索引之后修改settings
      注意:分片数量在创建索引库之后就不能再修改了。
      可以修改副本的数量。
      方法:
         PUT
      url:
         http://192.168.68.129:9200/{索引名称}/_settings
      例如:
         http://192.168.68.129:9200/blog/_settings
      请求体:
       
  {
       "number_of_replicas": "1"
  }

 文档管理

1、添加文档
   向索引中添加一行数据。
   使用json来表示。
   使用restful形式的api来实现。
      put:添加
      post:修改
      delete:删除
   
   方法:
      put
   url:
      http://192.168.68.129:9200/{索引}/_doc/{_id}
      文档的id(_id)推荐和真正数据的id保持一致。
   请求体:
      尽量和mapping设置的文档格式保持一致。
     
{
  "id": 1,
  "title": "这是一篇文章",
  "content": "xxxxx",
  "comment": "备注信息",
  "mobile": "xxxxx"
}
2、修改文档
   方法:
      POST
   url:
      http://192.168.68.129:9200/{索引}/_doc/{_id}
   请求体:
      
{
  "id": 1,
  "title": "这是一篇文章",
  "content": "xxxxx",
  "comment": "备注信息",
  "mobile": "xxx"
}
   修改的原理是,先删除后添加
3、删除文档
   方法:
      DELETE
   ulr:
      http://192.168.68.129:9200/{索引}/_doc/{_id}
4、根据_id取文档
   方法:
      GET
   url:
      http://192.168.68.129:9200/{索引}/_doc/{_id}
5、使用批处理_bulk
   方法:
      PUT、POST
   url:
      http://192.168.68.129:9200/{索引}/_bulk
   请求体:
      {action:{metadata}}
      {请求体数据信息json格式}
      {action:{metadata}}
      {请求体数据信息json格式}
      {action:{metadata}}
      {请求体数据信息json格式}
      {action:{metadata}}
      {请求体数据信息json格式}
      最后需要有一个换行
   例如:
      请求方法:
         POST
      url:
         http://192.168.68.129:9200/blog/_bulk
      请求体:
         action对应的取值:
            create:创建一个文档,如果文档不存在就创建。
            index:创建一个新的文档,如果文档存在就更新。
            update:批量更新文档
            delete:批量删除,不需要有请求体。
         元数据:
            _index:要写入的索引信息
            _type:要写入的type
            _id:要写入文档的id
   		 {"index":{"_id":1}}
         {"id":1, "title":"这是一篇文章", "content":"xxxxx", "comment":"备注信息", "mobile":"13344556677"}
         {"index":{"_id":2}}
         {"id":2, "title":"这是一篇文章", "content":"xxxxx", "comment":"备注信息", "mobile":"13344556677"}
         {"index":{"_id":3}}
         {"id":3, "title":"这是一篇文章", "content":"xxxxx", "comment":"备注信息", "mobile":"13344556677"}

 查询数据

      

1、查询的语法
   方法:
      POST
   url:
      http://192.168.68.129:9200[/{blog}][/{type}]/_search
   请求体:
      json形式的查询语句

{
    "query":{
        "xxxx"
    }
}
2、查询全部数据
   match_all查询

  
{
  "query": {
    "match_all": {
      
    }
  }
}
3、termQuery 关键词查询
   是所有查询中最级基本的一个查询。
   根据关键词进行查询,如果关键词在索引中存在那么就有结果,
   如果关键词不存在就查询不到结果。ES不会再次对查询的内容进行分词处理。
   需要指定两部分内容:
      1)要查询的关键词
      2)要查询的字段
  
{
  "query": {
    "term": {
      "title": "java"
    }
  }
}
   默认使用的是standard分词器。处理英文根据空格进行分词处理。如果处理中文,是一个汉字一个关键词。
      原文:传苹果正开发新Apple TV 或集成音响和摄像头
      分词结果:
         传
         苹
         果
         正
         开
         发
         新
         Apple
         TV
         或
         集
         成
         音
         响
         和
         摄
         像
         头
4、QueryString查询,根据查询字符串查询
   查询条件可以指定一个字符串,在查询之前,可以对查询条件进行分词处理,然后基于分词之后的结果再次查询。
  
{
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "传苹果正开发新Apple TV 或集成音响和摄像头"
    }
  }
}
5、match查询
   功能和query_string相同。
   
{
  "query": {
    "match": {
      "title": "传苹果正开发新Apple TV 或集成音响和摄像头"
    }
  }
}
6、multi_match查询
   可以指定在多个字段中查询
   
{
  "query": {
    "multi_match": {
      "query": "苹果",
      "fields": [
        "title",
        "content"
      ]
    }
  }
}
7、bool查询
   1)组合条件查询
   
   逻辑关系:
      must:必须满足,相当于是AND
      should:应该满足,相当于OR
      must_not:必须不能满足,相当于NOT
   语法:
     
{
  "query": {
    "bool": {
      "must": [
        
      ],
      "should": [
        
      ],
      "must_not": [
        
      ],
      "filter": [
        
      ]
    }
  }
}
      案例:
      
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "apple"
          }
        },
        {
          "match": {
            "content": "apple"
          }
        }
      ]
    }
  }
}
      
      2)filter过滤查询
         在bool查询的filter节点中可以包含多个查询条件,条件之间层层过滤。
         也可以直接使用filter进行数据的查询。filter查询是不进行打分处理。查询性能好于query。

         相关度排序:
            SEO:搜索引擎优化。

            两个指标:
               TF:关键词在文章中出现的频率。TF越大相关度越高。
               DF:所有文档中关键词出现的频率。DF越大相关度越低。例如 and
            根据TF和DF计算出一个相关度的得分,得分越高相关度越高,文档根据相关度得分进行降序排列。

     
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "title": "apple"
          }
        }
      ]
    }
  }
}
8、高亮处理
   在查询结果中将查询的关键词左右两边分别加上成对的html标签。
   高亮的处理在查询条件中指定。
  
 {
      "query":{
         "bool":{
            "must":[
               {
                  "term":{
                     "title":"apple"
                  }
               }
            ]
         }
      },
      "heightligth":{
         --设置高亮显示的字段
         "fields":{
            "title":{},
            "content":{}
         }
         --设置关键词的前缀
         "pre_tag":"<em>",
         --设置关键词的后缀
         "post_tag":"</em>"
      }  
   }
9、查询结果分页
   在query查询条件中增加两个属性
      from:起始的行号,从0开始
      size:每页显示的记录数量
   POST /blog/_search
  
{
  "query": {
    "multi_match": {
      "query": "苹果正开发",
      "fields": [
        "title",
        "content"
      ]
    }
  },
  "highlight": {
    "fields": {
      "title": {
        
      },
      "content": {
        
      }
    },
    "pre_tags": "<em>",
    "post_tags": "</em>"
  },
  "from": 10,
  "size": 5
}

中文分词器 

中文分词器都是国产的。
Ik-analyzer

1、Ik的使用方法
   1)下载ES对应版本的ik分词器
   2)把分词器解压缩
   3)把解压之后的目录放到{ES}/plugin目录下
   4)重启ES
2、分词器的测试方法
   方法:
      POST
   url:
      http://192.168.68.129:9200/_analyze
   方法体:
     
{
  "analyzer": "standard",
  "text": "and productivity has made it the world's most popular Java framework."
}
   IK一旦安装之后有两个分词算法:
      ik_smart:快速分词,速度快,粒度比较粗。
      ik_max_word:最大数量分词,速度慢,粒度细。
3、索引一旦创建完毕不能修改分词器的
   如果使用中文分词,应该在创建索引时,设置mapping的过程中指定使用中文分词器。
   
四、field的数据类型
   数值类型:
      int
      long
      float
      double
   字符串:
      text:需要分词的字段必须使用text,只有text类型才能支持分词器。
      keyword:不需要对字段的内容进行分词处理时,可以使用keyword数据类型。
         例如:身份证号、手机号、订单号等。
   日期:
      data

   字段的三个属性:
      是否分词:
         是否是text类型。例如文章的title、content都需要分词。
      是否索引:
         是否对field的内容进行索引。如果text数据类型一定需要创建索引,分词之后一定要创建索引。
         不分词也可以把field的内容添加到索引中,使用keyword数据类型。
         也可以索引field中的内容。
            例如文件的path,不需要分词,不需要索引,只需要存储即可。
            
"path":{
  "type": "keyword",
  "index": false,
  "store": true
}
      是否存储
         定义field时,store属性是否是true。
         如果是true那么就存储,false不存储。
         无论是否存储,不影响分词、创建索引、搜索。

         影响的范围就是是否能在查询结果中看到原始内容。
         




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值