ElasticSearch进阶篇之-Query DSL

网友投稿 885 2022-05-30

elasticsearch官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.html

1.ES中的检索方式

在ElasticSearch中支持两种检索方式

通过使用REST request URL 发送检索参数(uri+检索参数)

通过使用 REST request body 来发送检索参数 (uri+请求体)

第一种方式

GET bank/_search # 检索bank下的所有信息,包括 type 和 docs

GET bank/_search?q=*&sort=account_number:asc

响应结果信息

第二种方式

通过使用 REST request body 来反射检索参数 (uri+请求体)

GET bank/_search

{ "query":{ "match_all":{} }, "sort":[ { "account_number":"desc" } ] }

1

2

3

4

5

6

7

8

9

10

2.Query DSL

2.1 基本语法

ElasticSearch提供了一个可以执行的JSON风格的DSL(domain-specific language 领域特定语言),这个被称为Query DSL,该查询语言非常全面,并且刚开始的时候感觉有点复杂,真正学好它的方法就是从一些基础案例开始的。

完整的语法结构

{ QUERY_NAME:{ ARGUMENT:VALUE, ARGUMENT:VALUE,... } }

1

2

3

4

5

6

如果是针对某个字段,那么它的结构为

{ QUERY_NAME:{ FIELD_NAME:{ ARGUMENT:VALUE, ARGUMENT:VALUE,... } } }

1

2

3

4

5

6

7

8

2.2 match

上面我们用到来的match_all是匹配所有的数据,而我们现在要讲的match是条件匹配

如果对应的字段是基本类型(非字符串类型),则是精确匹配。

GET bank/_search { "query":{ "match":{ "account_number":20 } } }

1

2

3

4

5

6

7

8

match返回的是 account_number:20的记录

如果对应的字段是字符串类型,则是全文检索

GET bank/_search { "query":{ "match":{ "address":"mill" } } }

1

2

3

4

5

6

7

8

match返回的就是address中包含mill字符串的记录

2.3 match_phrase

将需要匹配的值当成一个整体单词(不分词)进行检索,短语匹配

GET bank/_search { "query":{ "match_phrase":{ "address":"mill road" } } }

1

2

3

4

5

6

7

8

查询出address中包含 mill road的所有记录,并给出相关性得分

2.4 multi_match[多字段匹配]

ElasticSearch进阶篇之-Query DSL

GET bank/_search { "query":{ "multi_match":{ "query":"mill road", "fields":["address","state"] } } }

1

2

3

4

5

6

7

8

9

查询出state或者address中包含 mill road的记录

2.5 bool[复合查询]

布尔查询又叫组合查询,bool用来实现复合查询,

bool把各种其它查询通过 must(与)、must_not(非)、should(或)的方式进行组合

复合语句可以合并任何其他查询语句,包括复合语句也可以合并,了解这一点很重要,这意味着,复合语句之间可以相互嵌套,可以表达非常复杂的逻辑。

GET /bank/_search { "query": { "bool": { "must": [ { "match": { "age": "40" } } ], "must_not": [ { "match": { "state": "ID" } } ] } } }

1

2

3

4

5

6

7

8

9

10

11

12

13

2.6 filter[结果过滤]

并不是所有的查询都需要产生分数,特别是那些仅用于"filtering"的文档,为了不计算分数,ElasticSearch会自动检查场景并且优化查询的执行。

GET /bank/_search { "query": { "bool": { "must": { "match_all": {} }, "filter": { "range": { "balance": { "gte": 20000, "lte": 30000 } } } } } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

2.7 term

和match一样,匹配某个属性的值,全文检索字段用match,其他非text字段匹配用term

GET bank/_search { "query":{ "term":{ "account_number":20 } } }

1

2

3

4

5

6

7

8

好了索引查询这块就介绍到这儿了

Elasticsearch 实时流计算服务 CS

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例
下一篇:6.4 Linux查看文件内容(less命令)
相关文章