Es 基础

/ 默认分类搜索引擎 / 没有评论 / 9浏览

一 数据类型

1. String类型 1. text:可分词,不可参与聚合

2. keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合 Numerical:数值类型,分两类

2. 基本数据类型:long、interger、short、byte、double、float、half_float 浮点数的高精度类型:scaled_float需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存 储,取出时再原。

3. Date:日期类型 elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省 空间。

4. Array:数组类型 进行匹配时,任意一个元素满足,都认为满足 排序时,如果升序则用数组中的最小值来排序,如果降序则用数组中的最大值来排序 Object:对象

5. Object:对象

{ name:"Jack", age:21, girl:{ name: "Rose", age:21 } }

如果存储到索引库的是对象类型,例如上面的girl,会把girl变成两个字段:girl.name和girl.age 6. 地理坐标点数据类型

eg: json PUT /company-locations { "mappings": { "properties": { } } } "name": { "type": "text" }, "location": { "type": "geo_point" }

js # 字符串形式 PUT /company-locations/_doc/1 { "name":"NetEase", "location":"40.715,74.011" } # 对象形式 PUT /company-locations/_doc/2 { "name":"Sina", "location":{ "lat":40.722, "lon":73.989 } } # 数组形式 PUT /company-locations/_doc/3 { "name":"Baidu", "location":[73.983,40.719] }

注意 字符串形式以半角逗号分割,如 "lat,lon" 对象形式显式命名为 lat 和 lon 数组形式表示为 [lon,lat] 通过地理坐标点过滤 有四种地理坐标点相关的过滤器 可以用来选中或者排除文档

过滤器作用
geo_bounding_box找出落在指定矩形框中的点
geo_distance找出与指定位置在给定距离内的点
geo_distance_range找出与指定点距离在给定最小距离和最大距离之间的点
geo_polygon找出落在多边形中的点。 。当你觉得自己 需要使用它,最好先看看 geo-shapes 。
GET /company-locations/_search
{
    "query": {
      "bool" : {
          "must" : {
              "match_all" : {}
          },
            "filter" : {
            "geo_bounding_box" : {
              "location" : {
                "top_left" : {
                  "lat" : 40.73,
                  "lon" : 71.12
                 },
                "bottom_right" : {
                  "lat" : 40.01,
                  "lon" : 74.1 
                }
            } 
          }
      } 
    }
  }

location这些坐标也可以用 bottom_left 和 top_right 来表示

GET /company-locations/_search
{
    "query": {
        "bool" : {
          "must" : {
                "match_all" : {}
          },
            "filter" : {
                "geo_distance" : {
                    "distance" : "200km",
                    "location" : {
                      "lat" : 40,
                      "lon" : 70 
                     }
                 } 
            }
          } 
      }
}

Query DSL

  1. 查询所有(match_all query)
POST /lagou-company-index/_search
{
    "query":{
        "match_all": {}
} }
  1. 全文搜索(full-text query) 全文搜索能够搜索已分析的文本字段,如电子邮件正文,商品描述等。使用索引期间应用于字段的同一 分析器处理查询字符串。全文搜索的分类很多 几个典型的如下: 2.2.1 匹配搜索(match query) 全文查询的标准查询,它可以对一个字段进行模糊、短语查询。 match queries 接收 text/numerics/dates, 对它们进行分词分析, 再组织成一个boolean查询。可通过operator 指定bool组 合操作(or、and 默认是 or )。 现在,索引库中有2部手机,1台电视; 2.2.2 短语搜索(match phrase query) match_phrase 查询用来对一个字段进行短语查询,可以指定 analyzer、slop移动因子 2.2.3 query_string 查询 Query String Query提供了无需指定某字段而对文档全文进行匹配查询的一个高级查询,同时可以指定在 哪些字段上进行匹配。 2.2.4 多字段匹配搜索(multi match query) 如果你需要在多个字段上进行文本搜索,可用multi_match 。multi_match在 match的基础上支持对多个字段进行文本查询。
  2. 词条级搜索(term-level queries) 可以使用term-level queries根据结构化数据中的精确值查找文档。结构化数据的值包括日期范围、IP地址、价格或产品ID。与全文查询不同,term-level queries不分析搜索词。相反,词条与存储在字段级别中的术语完全匹 配。
  1. 词条搜索(term query) term 查询用于查询指定字段包含某个词项的文档

  2. 词条集合搜索(terms query) terms 查询用于查询指定字段包含某些词项的文档

  3. 范围搜索(range query) gte:大于等于 gt:大于 lte:小于等于 lt:小于 boost:查询权重

  4. 不为空搜索(exists query) 查询指定字段值不为空的文档。相当 SQL 中的 column is not null

  5. 词项前缀搜索(prefix query)

  6. 通配符搜索(wildcard query

  7. 正则搜索(regexp query) regexp允许使用正则表达式进行term查询.注意regexp如果使用不正确,会给服务器带来很严重的性能 压力。比如.*开头的查询,将会匹配所有的倒排索引中的关键字,这几乎相当于全表扫描,会很慢。因 此如果可以的话,最好在使用正则前,加上匹配的前缀。

  8. 模糊搜索(fuzzy query)

  9. ids搜索(id集合查询)

  1. 复合搜索(compound query)
  1. constant_score query 用来包装另一个查询,将查询匹配的文档的评分设为一个常值
  2. 布尔搜索(bool query) bool 查询用bool操作来组合多个查询字句为一个查询。 可用的关键字: must:必须满足 filter:必须满足,但执行的是filter上下文,不参与、不影响评分 should:或 must_not:必须不满足,在filter上下文中执行,不参与、不影响评分
POST /book/_search
{
  "query": {
    "bool" : {
      "must" : {
        "match" : { "description" : "java" }
      },
      "filter": {
        "term" : { "name" : "solr" }
      },
      "must_not" : {
        "range" : {
          "price" : { "gte" : 200, "lte" : 300 }
        }
      },
      "minimum_should_match" : 1,
      "boost" : 1.0
} }
}

minimum_should_match代表了最小匹配精度,如果设置minimum_should_match=1,那么should 语句中至少需要有一个条件满足。

5.排序 相关性评分排序 默认情况下,返回的结果是按照 相关性 进行排序的——最相关的文档排在最前。 在本章的后面部 分,我们会解释 相关性 意味着什么以及它是如何计算的, 不过让我们首先看看 sort 参数以及如 何使用它。 为了按照相关性来排序,需要将相关性表示为一个数值。在 Elasticsearch 中, 相关性得分 由一 个浮点数进行表示,并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序,按照相 关性评分升序排序如下

POST /book/_search
{
  "query": {
    "match": {"description":"solr"}
} }
POST /book/_search
{
  "query": {
    "match": {"description":"solr"}
}, "sort": [
    {"_score": {"order": "asc"}}
  ]
}

字段值排序

POST /book/_search
{
  "query": {
    "match_all": {}
}, "sort": [
    {"price": {"order": "desc"}}
  ]
}

多级排序 假定我们想要结合使用 price和 _score(得分) 进行查询,并且匹配的结果首先按照价格排序, 然后按照相关性得分排序:

POST /book/_search
{
    "query":{
        "match_all":{}
}, "sort": [
      { "price": { "order": "desc" }},
      { "timestamp": { "order": "desc" }}
    ]
}

6.分页 Elasticsearch中实现分页的语法非常简单:

POST /book/_search
{
  "query": {
    "match_all": {}
  },
  "size": 2,
  "from": 0
}
POST /book/_search
{
  "query": {
    "match_all": {}
}, "sort": [
    {"price": {"order": "desc"}}
  ],
"size": 2,
"from": 2 }

size:每页显示多少条 from:当前页起始索引, int start = (pageNum - 1) * size

7.高亮 Elasticsearch中实现高亮的语法比较简单: 在使用match查询的同时,加上一个highlight属性: pre_tags:前置标签 post_tags:后置标签 fields:需要高亮的字段 name:这里声明title字段需要高亮,后面可以为这个字段设置特有配置,也可以空

8.文档批量操作(bulk 和 mget)

第4节 定位非法搜索及原因 在开发的时候,我们可能会写到上百行的查询语句,如果出错的话,找起来很麻烦,Elasticsearch提供 了帮助开发人员定位不合法的查询的api _validate