mapping常见属性有哪些?
- type:数据类型
- index:是否索引
- analyzer:分词器
- properties:子字段
type常见的有哪些? - 字符串:text、keyword
- 数字:long、integer、short、byte、double、float
- 布尔:boolean
- 日期:date
- 对象:object
索引库
# 创建索引库
PUT /user
{
"mappings": {
"properties": {
"name": {
"type": "object",
"properties": {
"firstName": {
"type": "keyword"
},
"lastName": {
"type": "keyword"
}
}
},
"info": {
"type": "text",
"analyzer": "ik_smart"
},
"email": {
"type": "keyword",
"index": false
}
}
}
}
# 查看索引库
GET /user
#删除索引库
DELETE /user
#修改/添加新字段
PUT /user/_mapping
{
"properties":{
"age":{
"type":"integer"
}
}
}
文档
#插入文档
POST /user/_doc/1
{
"age":15,
"email":"775225123@qq.com",
"info":"大家好才是真的好,广州好滴",
"name":{
"firstName":"张",
"lastName":"三"
}
}
#查询文档
GET /user/_doc/1
#删除文档
DELETE /user/_doc/1
#全量修改,先删除后新增,id存在即修改不存在即新增
PUT /user/_doc/1
{
"age":18,
"email":"775225123@qq.com",
"info":"大家好才是真的好,广州好滴",
"name":{
"firstName":"三",
"lastName":"张"
}
}
#增量修改,修改指定字段
POST /user/_update/1
{
"doc": {
"age":16
}
}
DSL查询语句
全文检索查询
- 查询所有
GET /hotel/_search
{
"query": {
"match_all": {}
}
}
- match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:
GET /hotel/_search
{
"query": {
"match": {
"all": "外滩"
}
}
}
- multi_match:与match查询类似,只不过允许同时查询多个字段,语法:
# multi_match查询
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "外滩如家",
"fields": ["brand","name","business"]
}
}
}
match和multi_match的区别是什么?
- match:根据一个字段查询
- multi_match:根据多个字段查询,参与查询字段越多,查询性能越差,建议使用copy_to加到一个字段里去查
PUT my_index
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
精确查询
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:
- term:根据词条精确值查询
#term查询
GET /hotel/_search
{
"query": {
"term": {
"brand": {
"value": "如家"
}
}
}
}
- range:根据值的范围查询
#range查询
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 200
}
}
}
}
地理查询
- geo_distance:查询到指定中心点小于某个距离值的所有文档
#geo_distance查询
GET /hotel/_search
{
"query": {
"geo_distance":{
"distance":"15km",
"location":"31.047135, 121.46224"
}
}
}
- geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档
#geo_bounding_box查询
GET /hotel/_search
{
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lat": "31.1",
"lon": "121.5"
},
"bottom_right": {
"lat": "30.9",
"lon": "121.7"
}
}
}
}
}
复合查询
复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑,例如:
- function_score:算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价
#fuction score查询
GET /hotel/_search
{
"query": {
"function_score": {
"query": {
"match": {
"all": "外滩"
}
},
"functions": [
{
"filter": {
"term": {
"brand": "如家"
}
},
"weight": 10
}
]
, "boost_mode": "sum"
}
}
}
- query:原始查询条件,搜索文档并根据相关性打分(q
- filter:过滤条件,符合条件的文档才会被重新算分
- weight:算分函数,算分函数的结果称为function score ,将来会与query score运算,得到新算分,常见的算分函数有:
- weight:给一个常量值,作为函数结果(function score)
- field_value_factor:用文档中的某个字段值作为函数结果
- random_score:随机生成一个值,作为函数结果
- script_score:自定义计算公式,公式结果作为函数结果
- boost_mode:加权模式,定义function score与query score的运算方式,包括
- multiply:两者相乘。默认就是这个
- replace:用function score 替换 query score
- 其它:sum、avg、max、min
- 复合查询 Boolean Query
布尔查询是一个或多个查询子句的组合。子查询的组合方式有:
- must:必须匹配每个子查询,类似“与”
- should:选择性匹配子查询,类似“或”
- must_not:必须不匹配,不参与算分,类似“非”
- filter:必须匹配,不参与算分
#Boolean Query查询
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "上海"
}
}
],
"should": [
{
"term": {
"brand": {
"value": "华美达"
}
}
},
{
"term": {
"brand": {
"value": "如家"
}
}
}
],
"must_not": [
{
"range": {
"price": {
"lte": 100
}
}
}
],
"filter": [
{
"geo_distance": {
"distance": "15km",
"location": {
"lat": 31.2,
"lon": 121.4
}
}
}
]
}
}
}
查询名称包括上海,品牌为如家或者华美达,价格大于100,经纬度31.2,121.4附件14km的酒店
搜索结果处理
排序
elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。
#简单字段排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{"score": "desc"},
{"price": "desc"}
]
}
#地理位置排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
"location": "28.68925,115.874233",
"order": "asc",
"unit": "km"
}
}
]
}
分页
#分页
GET /hotel/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 2
}
- from + size:
- 优点:支持随机翻页
- 缺点:深度分页问题,默认查询上限(from + size)是10000
- 场景:百度、京东、谷歌、淘宝这样的随机翻页搜索
-after search: - 优点:没有查询上限(单次查询的size不超过10000)
- 缺点:只能向后逐页查询,不支持随机翻页
- 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
高亮
#高亮
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight": {
"fields": {
"name": {
"require_field_match": "false"
}
}
}
}
默认情况下,搜索的关键字必须和高亮的字段保持一致,如果非要高亮不一样的字段,就加上"require_field_match": "false"
聚合
聚合的分类
聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类:
- 桶(Bucket)聚合:用来对文档做分组
- TermAggregation:按照文档字段值分组
- Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
- 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
- Avg:求平均值
- Max:求最大值
- Min:求最小值
- Stats:同时求max、min、avg、sum等
- 管道(pipeline)聚合:其它聚合的结果为基础做聚合
Bucket聚合
#聚合功能
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
}
}
}
}
限定聚合范围
#聚合功能,限定范围
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 200
}
}
},
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
}
}
}
}
Metrics 聚合
获取每个品牌的用户评分的min、max、avg
#Metrics 聚合求酒店评分,并排序
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20,
"order": {
"scoreAgg.avg": "desc"
}
},"aggs": {
"scoreAgg": {
"stats": {
"field": "score"
}
}
}
}
}
}
拼音分词器
GET /_analyze
{
"text": ["如家酒店还不错"],
"analyzer": "pinyin"
}
- 自定义分词器
elasticsearch中分词器(analyzer)的组成包含三部分:
- character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
- tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart
- tokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等
我们可以在创建索引库时,通过settings来配置自定义的analyzer(分词器)
# 自定义拼音分词器
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "ik_max_word",
"filter": "py"
}
},
"filter": {
"py": {
"type": "pinyin",
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "my_analyzer",
"search_analyzer": "ik_smart"
}
}
}
}
自动补全
#自动补全的索引库
PUT test2
{
"mappings": {
"properties": {
"title":{
"type": "completion"
}
}
}
}
#示例数据
POST test2/_doc
{
"title": ["Sony", "WH-1000XM3"]
}
POST test/_doc
{
"title": ["SK-II", "PITERA"]
}
POST test/_doc
{
"title": ["Nintendo", "switch"]
}
// 自动补全查询
POST /test/_search
{
"suggest": {
"title_suggest": {
"text": "s", // 关键字
"completion": {
"field": "title", // 补全字段
"skip_duplicates": true, // 跳过重复的
"size": 10 // 获取前10条结果
}
}
}
}
网友评论