ES的基本语法

搜索的本质及原理

ES是什么

  1. 独立的网络上的一个或一组节点
  2. 对外提供搜索服务
  3. 对内就是一个关系型数据库

名字定义

关系型数据库ES
DATABASEINDEX
TableType
Row(行)Document
Filed(列)Colum
indexUpdate TABLE SET
SELECT * from TABLE***SELECT * from TABLE***
Update TABLE SETUpdate TABLE SET

分词定义

  1. 搜索是以词为单位做最基本的搜索单元
  2. 依靠分词器构建分词
  3. 用分词构建倒排索引
  4. 最后用搜索时候去搜索对应分词器分出的token和索引中存储分词找到我们想要的文档

倒排索引定义

正向索引:从文档到词
倒排索引:先从词到文档

TF-IDF 打分

含义:判断匹配度高低

  1. TF:词频 这个document 包含了多少个这个词,包含越多表示越相关
  2. DF:文档频率 包含该词的文档总数目
  3. IDF:DF取反

分布式搜索引擎的原理

分片/主从/路由

主节点含义:管理所有负载的核心写操作
索引是yellow还是green,主要看从分片数量,如果从分片数量是3,而节点也是2,必须有一个从分片放在主分片节点,就是yellow

ES基础语法

match:会对词做分词
term:不会做分词
filter:里可以用match分词但是不会做score打分,score是0
带排序则里面score没用了是null

//使用结构化的方式创建索引
PUT /employee
{
  "settings":{
    "number_of_shards":1,
    "number_of_replicas":1
  },
  "mappings": {
    "properties":{
      "name":{"type":"text"},
      "age":{"type":"integer"}
    }
  }
}
//带排序则里面score没用了
GET /employee/_search
{
  "query":{
    "match": {"name":"兄长"}
  },
  "sort":[
    {"age":{"order":"desc"}}
  ]
}
//带filter(等于where) match会分词,term不会分词 ,但是分数都为0
GET /employee/_search
{
  "query":{
    "bool": {
      "filter":[
           {"match":{"name":"兄11"}}
        ]
    }
  }
}

GET /employee/_search
{
  "query":{
    "bool": {
      "filter":[
           {"term":{"name":"兄11"}}
        ]
    }
  }
}

带聚合:


//带聚合,判断31岁有几个,30岁有几个
GET /employee/_search
{
  "query":{
    "match": {"name":"兄"}
  },
  "sort":[
    {"age":{"order":"desc"}}
  ],
  "aggs":{
    "group_by_age":{
      "terms": {
        "field": "age"
      }
    }
  }
}

分词

充分理解倒排索引及分词过程

在这里插入图片描述

analyze分词过程

  1. 标准分词

分词过程:字符过滤,字符处理(分词),分词过滤
例如: Eating an apple a day & keeps the doctor away
字符过滤 &过滤掉
字符处理,默认用标准分词器,以空格和标点符号分割
分词过滤,变小写
最后建立索引 eating an apple a day keeps the doctor away

2.英文分词
分词过程:字符过滤,字符处理(分词),分词过滤
例如: Eating an apple a day & keeps the doctor away
字符过滤 过滤掉特殊符号外加量词,an,the,with等等量词当作停用词无意义
字符处理,默认用标准分词器,以空格和标点符号分割
分词过滤,变小写并词干转化(就是把同意词和复数比如s去掉)
最后建立索引 eat an appl dai keep doctor awai

3.IK分词
分词过程:字符过滤,字符处理(分词),分词过滤
例如: 中华人民共和国
字符过滤 过滤掉特殊符号外加量词,的等等量词当作停用词无意义
字符处理,基于词库词典进行分词(中华 人民 共 和 国)
分词过滤,对英文要做词化转化
最后建立索引 中华 人民 共 和 国

//搜索match 按照字段上定义的分词分析后,去索引内查询
GET movie/_search
{
  "query":{
    "match":{"title":"steve"}
  }
}

GET movie/_analyze
{
  "field": "title",
  "text": "steve zissou"
}

//搜索term 不会分词的分析,直接去索引内查询
GET movie/_search
{
  "query":{
    "term":{"title":"steve zissou"}
  }
}

存储并索引

filed类型

  • text: 被分析索引的字符串类型
  • keyword:不能被分析只能被精确匹配的字符串类型
  • date:日期类型,可以配合formate一起运行
  • 数字类型:long,integer,short,double
  • boolean类型
  • array类型:{”one“,“two”}
  • object类型:json嵌套{”property1“:“value1”,“property2”:“value2”}
  • ip类型
  • geo_point:地理位置:

TF/IDF打分

TF:词频 这个文档中包含了多少个这个词,包含越多表示越相关
DF:文档频率 包含该次的文档总数目
IDF: 文档取反
tfnorm:查询一个词在文档中次数,如果文档很长就比较小 即词频归一化
打分主要做排序,那如果用filter没有分数则自己加sort排序

best_fields:默认,取得分最高的作为对应的分数,最匹配模式,等同于dismax模式,这是以
most_fields:取命中的分值相加作为分数,同should match模式,加权共同影响模式,这是以字段为单位分别计算分词的分数,然后加在一起,适用于都有影响的匹配

GET /movie/_validate/query?explain
{
  //"explain": true, 
  "query":{
    "multi_match":{
      "query":"steve job",
      "fields":["title","overview"],
      "operator": "or",
      "type":"most_fields"
    }
  }
}

cross_fields:以分词为单位计算栏位总分

GET /movie/_validate/query?explain
{
  //"explain": true, 
  "query":{
    "multi_match":{
      "query":"steve job",
      "fields":["title","overview"],
      "operator": "or",
      "type":"cross_fields"
    }
  }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值