一 数据类型
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. 地理坐标点数据类型
- 地理坐标点 地理坐标点是指地球表面可以用经纬度描述的一个点。 地理坐标点可以用来计算两个坐标间的距离,还可以判断一个坐标是否在一个区域中。地理坐标点需要显式声明对应字段类型为 geo_point :
eg: json PUT /company-locations { "mappings": { "properties": { } } } "name": { "type": "text" }, "location": { "type": "geo_point" }
- 经纬度坐标格式 如上例, location 字段被声明为 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 。 |
- geo_bounding_box查询 这是目前为止最有效的地理坐标过滤器了,因为它计算起来非常简单。 你指定一个矩形的顶部 , 底部 , 左边界和右边界,然后过滤器只需判断坐标的经度是否在左右边界之间,纬度是否在上下边 界之间 然后可以使用 geo_bounding_box 过滤器执行以下查询
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 来表示
- geo_distance 过滤仅包含与地理位置相距特定距离内的匹配的文档。假设以下映射和索引文档 然后可以使用geo_distance 过滤器执行以下查询
GET /company-locations/_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "200km",
"location" : {
"lat" : 40,
"lon" : 70
}
}
}
}
}
}
Query DSL
- 查询所有(match_all query)
POST /lagou-company-index/_search
{
"query":{
"match_all": {}
} }
- query :代表查询对象
- match_all :代表查询所有 结果
- took:查询花费时间,单位是毫秒
- time_out:是否超时
- _shards:分片信息
- hits:搜索结果总览对象
- total:搜索到的总条数
- max_score:所有结果中文档得分的最高分
-hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
- _index:索引库
- _type:文档类型
- _id:文档id
- _score:文档得分
- _source:文档的源数据
- 全文搜索(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的基础上支持对多个字段进行文本查询。
- 词条级搜索(term-level queries) 可以使用term-level queries根据结构化数据中的精确值查找文档。结构化数据的值包括日期范围、IP地址、价格或产品ID。与全文查询不同,term-level queries不分析搜索词。相反,词条与存储在字段级别中的术语完全匹 配。
-
词条搜索(term query) term 查询用于查询指定字段包含某个词项的文档
-
词条集合搜索(terms query) terms 查询用于查询指定字段包含某些词项的文档
-
范围搜索(range query) gte:大于等于 gt:大于 lte:小于等于 lt:小于 boost:查询权重
-
不为空搜索(exists query) 查询指定字段值不为空的文档。相当 SQL 中的 column is not null
-
词项前缀搜索(prefix query)
-
通配符搜索(wildcard query
-
正则搜索(regexp query) regexp允许使用正则表达式进行term查询.注意regexp如果使用不正确,会给服务器带来很严重的性能 压力。比如.*开头的查询,将会匹配所有的倒排索引中的关键字,这几乎相当于全表扫描,会很慢。因 此如果可以的话,最好在使用正则前,加上匹配的前缀。
-
模糊搜索(fuzzy query)
-
ids搜索(id集合查询)
- 复合搜索(compound query)
- constant_score query 用来包装另一个查询,将查询匹配的文档的评分设为一个常值
- 布尔搜索(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
本文由 chaoohuua 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2025/12/18 13:53