elasticsearch

您所在的位置:网站首页 es的dsl语言 elasticsearch

elasticsearch

2023-10-04 01:30| 来源: 网络整理| 查看: 265

DSL语句查询

查询字符串搜索便于通过命令行完成特定(ad hoc)的搜索,但是它也有局限性(参阅简单搜索章节)。Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现

文本查询语法模糊匹配

如搜索奥迪,会查出包含奥迪A8L 和 奥迪 和 A8L 都查询出来,按照词进行查询

GET /sunny/user/_search { "query": { "match": { "car": "奥迪A8L" } } }短语匹配

match_phrase-短语匹配:如 搜索"奥迪A8L" 不会查出包含 "奥迪" OR "A8L" 只会查出包含 "奥迪A8L"的记录

GET /sunny/user/_search { "query": { "match_phrase": { "car": "奥迪A8L" } } }多字段匹配

multi_match-多字段匹配:如 搜索"小云" 只要name或者car字段中包含 "小云" OR "小" OR "云" 等分词都会被查找出来

GET /sunny/user/_search { "query": { "multi_match": { "query": "小云", "fields":["name","car"] } } }分页模糊查询

from:第几页 size:每页N条数据

GET /sunny/user/_search { "from":0, "size":1, "query": { "match": { "car": "奥迪" } } }高亮搜索

会将要查询到值,高亮显示成 拆分成几个词进行查询

GET /sunny/user/_search { "query" : { "match_phrase" : { "car" : "奥迪A8L" } }, "highlight": { "fields" : { "car" : {} } } }结构查询语法精确匹配

term-将按照存储在倒排索引中的确切字词进行操作,这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,它们允许您制作低级查询,并在分析过程之前进行

GET /sunny/user/_search { "query":{ "term": { "age": 48 } } }range范围查询(1)

如查询age大于等于20小于等于30的记录

GET /sunny/user/_search { "query": { "range": { "age":{ "gte":20, "lte":30 } } } }range范围查询(2)如查询age大于20小于30的记录GET /sunny/user/_search { "query": { "range": { "age":{ "gt":20, "lt":30 } } } }range范围查询(3)

时间范围查询 now:当前时间

GET /sunny/user/_search { "query": { "range": { "createDate":{ "gte":"2019-05-05", "lte":"now" } } } }布尔查询

》比如,query的时候,会先比较查询条件,然后计算分值,最后返回文档结果; 而filter则是先判断是否满足查询条件,如果不满足,会缓存查询过程(记录该文档不满足结果);满足的话,就直接缓存结果。 综上所述,filter快在两个方面: 1 对结果进行缓存 2 避免计算分值

为下面查询socre了解做简单的铺垫elasticsearch的搜索评分逻辑。 查询的权重基于三个因素:词频、逆向文档频率和字段长度归一值。 词频:查询词在该文档中出现的频率。频率越高,权重越高。 逆向文档频率:查询词在所有文档中出现的频率。频率越高,权重越低。可以降低日常使用的高频率词的权重。 字段长度归一值:查询字段的长度。字段长度越长,查询词权重越高,反之越低。 进一步细节说:我们查询的所有文档,会在内部做一次相关性的评分score;然后会根据这个score从大到小的排序,依次展示给客户端 如何计算评分? Elasticsearch使用的计算评分公式TF-IDF算法的实用计算公式如下: score(q,d) coord(q,d)queryNorm(q)(tf (tind)idf (t)2 boost(t)norm(t,d)) filter过滤查询

判断是否满足精确查找条件,满足或不满足,做数据过滤,es会对结果进行缓存

查询的结果必须匹配查询条件,和must不同不会计算score

GET /sunny/user/_search { "query": { "bool": { "filter": [ { "term": { "age": "48" } } ] } } }must查询必须同时满足我所有条件

例如:文档字段中,age为48 和 name为小名,视图返回给用户 查询的结果必须匹配查询条件,并计算score

GET /sunny/user/_search { "query":{ "bool": { "must": [ { "match": { "age": "48" } }, { "match": { "name": "小名" } } ] } } }must_not查询不满足条件

例如:查不年龄不等于48的记录 查询结果必须不符合查询条件

GET /sunny/user/_search { "query":{ "bool": { "must_not": [ { "match": { "age": "48" } } ] } } }组合查询

例如:文档字段中,age为48 和 name为小名,视图返回给用户,且过滤条件精准查询sex必须为0,视图返回给用户

GET /sunny/user/_search { "query":{ "bool": { "must": [ { "match": { "age": "48" } }, { "match": { "name": "小名" } } ], "filter": [ { "term": { "sex": "0" } } ] } } }constant_score复合查询

将查询内部的结果文档得分都设定为1或者boost的值,多用于结合bool查询实现自定义得分(将查询的评估固定下来,不支持match,只支持filter)、布尔查询

GET /sunny/user/_search { "query": { "constant_score": { "filter":{ "match":{ "age":48 } } } } }自定义分数查询

常量分值查询,目的就是返回指定的score,一般都结合filter使用,因为filter context忽略score 查询结果 1 > 3 分数值一样

GET /sunny/user/_search { "query": { "constant_score": { "filter": { "match": { "car":"奥迪" } }, "boost": 3 } } }should查询

至少满足一个条件 查询age包含48 或者 car包含奥迪的数据

GET /sunny/user/_search { "query": { "bool": { "should": [ { "match": { "age": "48" } }, { "match": { "car": "奥迪" } } ] } } }聚合查询->group by#根据年龄字段分组查询 GET /sunny/user/_search { "aggs": { "group_by_age": { "terms": { "field": "age" } } } } #根据条件分组 GET /sunny/user/_search { "query": { "match": { "car": "奥迪" } }, "aggs": { "group_by_age": { "terms": { "field": "age" } } } } #分组并求平均值 GET /sunny/user/_search { "aggs": { "group_by_age": { "terms": { "field": "age" }, "aggs" : { "avg_age" : { "avg" : { "field" : "age" } } } } } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3