Skip to content

Commit c0391aa

Browse files
committed
update docs
1 parent c29ebbb commit c0391aa

File tree

1 file changed

+172
-127
lines changed

1 file changed

+172
-127
lines changed

docs/nosql/elasticsearch/Elasticsearch查询.md

Lines changed: 172 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ Elasticsearch 查询语句采用基于 RESTful 风格的接口封装成 JSON 格
66

77
ES 全文查询主要用于在全文字段上,主要考虑查询词与文档的相关性(Relevance)。
88

9+
### intervals query
10+
11+
[**`intervals query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-intervals-query.html) 根据匹配词的顺序和近似度返回文档。
12+
13+
intervals query 使用**匹配规则**,这些规则应用于指定字段中的 term。
14+
915
### match query
1016

1117
match query **用于搜索单个字段**,首先会针对查询语句进行解析(经过 analyzer),主要是对查询语句进行分词,分词后查询语句的任何一个词项被匹配,文档就会被搜到,默认情况下相当于对分词后词项进行 or 匹配操作。
@@ -241,13 +247,24 @@ GET books/_search
241247
242248
## 词项查询
243249
244-
全文查询在执行查询之前会分析查询字符串,词项查询时对倒排索引中存储的词项进行**精确匹配操作**。词项级别的查询通常用于结构化数据,如数字、日期和枚举类型。
245-
246250
**`Term`(词项)是表达语意的最小单位**。搜索和利用统计语言模型进行自然语言处理都需要处理 Term。
247251
248-
在 ES 中,term 查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项。并且使用相关度计算公式为每个包含该词项的文档进行相关度计算
252+
全文查询在执行查询之前会分析查询字符串
249253
250-
可以通过 Constant Score 将查询转换成一个 Filtering,避免算法,并利用缓存,提高性能。
254+
与全文查询不同,词项查询不会分词,而是将输入作为一个整体,在倒排索引中查找准确的词项。并且使用相关度计算公式为每个包含该词项的文档进行相关度计算。一言以概之:**词项查询是对词项进行精确匹配**。词项查询通常用于结构化数据,如数字、日期和枚举类型。
255+
256+
词项查询有以下类型:
257+
258+
- **[`exists` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html)**
259+
- **[`fuzzy` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html)**
260+
- **[`ids` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html)**
261+
- **[`prefix` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html)**
262+
- **[`range` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html)**
263+
- **[`regexp` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html)**
264+
- **[`term` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html)**
265+
- **[`terms` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html)**
266+
- **[`type` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-type-query.html)**
267+
- **[`wildcard` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html)**
251268
252269
### exists query
253270
@@ -301,22 +318,147 @@ GET kibana_sample_data_ecommerce/_search
301318
302319
为了找到相似的词条,fuzzy query 会在指定的编辑距离内创建搜索词条的所有可能变体或扩展集。然后返回完全匹配任意扩展的文档。
303320
304-
```
321+
```bash
305322
GET books/_search
306323
{
307-
"query": {
308-
"fuzzy": {
309-
"title": "javascritp"
310-
}
311-
}
324+
"query": {
325+
"fuzzy": {
326+
"user.id": {
327+
"value": "ki",
328+
"fuzziness": "AUTO",
329+
"max_expansions": 50,
330+
"prefix_length": 0,
331+
"transpositions": true,
332+
"rewrite": "constant_score"
333+
}
334+
}
335+
}
312336
}
313337
```
314338
315339
注意:如果配置了 [`search.allow_expensive_queries`](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html#query-dsl-allow-expensive-queries) ,则 fuzzy query 不能执行。
316340
341+
### ids query
342+
343+
[**`ids query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html) 根据 ID 返回文档。 此查询使用存储在 `_id` 字段中的文档 ID。
344+
345+
```bash
346+
GET /_search
347+
{
348+
"query": {
349+
"ids" : {
350+
"values" : ["1", "4", "100"]
351+
}
352+
}
353+
}
354+
```
355+
356+
### prefix query
357+
358+
[**`prefix query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html#prefix-query-ex-request) 用于查询某个字段中包含指定前缀的文档。
359+
360+
比如查询 `user.id` 中含有以 `ki` 为前缀的关键词的文档,那么含有 `kind``kid` 等所有以 `ki` 开头关键词的文档都会被匹配。
361+
362+
```bash
363+
GET /_search
364+
{
365+
"query": {
366+
"prefix": {
367+
"user.id": {
368+
"value": "ki"
369+
}
370+
}
371+
}
372+
}
373+
```
374+
375+
### range query
376+
377+
[**`range query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html) 即范围查询,用于匹配在某一范围内的数值型、日期类型或者字符串型字段的文档。比如搜索哪些书籍的价格在 50 到 100 之间、哪些书籍的出版时间在 2015 年到 2019 年之间。**使用 range 查询只能查询一个字段,不能作用在多个字段上**
378+
379+
range 查询支持的参数有以下几种:
380+
381+
- **`gt`**:大于
382+
383+
- **`gte`**:大于等于
384+
385+
- **`lt`**:小于
386+
387+
- **`lte`**:小于等于
388+
389+
- **`format`**:如果字段是 Date 类型,可以设置日期格式化
390+
391+
- **`time_zone`**:时区
392+
393+
- **`relation`**:指示范围查询如何匹配范围字段的值。
394+
395+
- **`INTERSECTS` (Default)**:匹配与查询字段值范围相交的文档。
396+
- **`CONTAINS`**:匹配完全包含查询字段值的文档。
397+
- **`WITHIN`**:匹配具有完全在查询范围内的范围字段值的文档。
398+
399+
示例:数值范围查询
400+
401+
```bash
402+
GET kibana_sample_data_ecommerce/_search
403+
{
404+
"query": {
405+
"range": {
406+
"taxful_total_price": {
407+
"gt": 10,
408+
"lte": 50
409+
}
410+
}
411+
}
412+
}
413+
```
414+
415+
示例:日期范围查询
416+
417+
```bash
418+
GET kibana_sample_data_ecommerce/_search
419+
{
420+
"query": {
421+
"range": {
422+
"order_date": {
423+
"time_zone": "+00:00",
424+
"gte": "2018-01-01T00:00:00",
425+
"lte": "now"
426+
}
427+
}
428+
}
429+
}
430+
```
431+
432+
### regexp query
433+
434+
[**`regexp query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html) 返回与正则表达式相匹配的 term 所属的文档。
435+
436+
[正则表达式](https://zh.wikipedia.org/zh-hans/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F)是一种使用占位符字符匹配数据模式的方法,称为运算符。
437+
438+
示例:以下搜索返回 `user.id` 字段包含任何以 `k` 开头并以 `y` 结尾的文档。 `.*` 运算符匹配任何长度的任何字符,包括无字符。匹配项可以包括 `ky``kay``kimchy`
439+
440+
```bash
441+
GET /_search
442+
{
443+
"query": {
444+
"regexp": {
445+
"user.id": {
446+
"value": "k.*y",
447+
"flags": "ALL",
448+
"case_insensitive": true,
449+
"max_determinized_states": 10000,
450+
"rewrite": "constant_score"
451+
}
452+
}
453+
}
454+
}
455+
```
456+
457+
> 注意:如果配置了[`search.allow_expensive_queries`](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html#query-dsl-allow-expensive-queries) ,则 [**`regexp query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html) 会被禁用。
458+
317459
### term query
318460
319-
[term query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html) 用来查找指定字段中包含给定单词的文档,term 查询不被解析,只有查询词和文档中的词精确匹配才会被搜索到,应用场景为查询人名、地名等需要精准匹配的需求。
461+
[**`term query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html) 用来查找指定字段中包含给定单词的文档,term 查询不被解析,只有查询词和文档中的词精确匹配才会被搜索到,应用场景为查询人名、地名等需要精准匹配的需求。
320462
321463
示例:
322464
@@ -370,7 +512,7 @@ DELETE my-index-000001
370512
371513
### terms query
372514
373-
**`terms query`****`term query`** 相同,但可以搜索多个值。
515+
[**`terms query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html)[**`term query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html) 相同,但可以搜索多个值。
374516
375517
terms query 查询参数:
376518
@@ -425,146 +567,49 @@ GET my-index-000001/_search?pretty
425567
DELETE my-index-000001
426568
```
427569
428-
### range query
429-
430-
**`range query`** 即范围查询,用于匹配在某一范围内的数值型、日期类型或者字符串型字段的文档。比如搜索哪些书籍的价格在 50 到 100 之间、哪些书籍的出版时间在 2015 年到 2019 年之间。**使用 range 查询只能查询一个字段,不能作用在多个字段上**
431-
432-
range 查询支持的参数有以下几种:
433-
434-
- **`gt`**:大于
435-
436-
- **`gte`**:大于等于
437-
438-
- **`lt`**:小于
439-
440-
- **`lte`**:小于等于
441-
442-
- **`format`**:如果字段是 Date 类型,可以设置日期格式化
443-
444-
- **`time_zone`**:时区
445-
446-
- **`relation`**:指示范围查询如何匹配范围字段的值。
447-
448-
- **`INTERSECTS` (Default)**:匹配与查询字段值范围相交的文档。
449-
- **`CONTAINS`**:匹配完全包含查询字段值的文档。
450-
- **`WITHIN`**:匹配具有完全在查询范围内的范围字段值的文档。
570+
### type query
451571
452-
示例:数值范围查询
572+
> 7.0.0 后废弃
453573
454-
```bash
455-
GET kibana_sample_data_ecommerce/_search
456-
{
457-
"query": {
458-
"range": {
459-
"taxful_total_price": {
460-
"gt": 10,
461-
"lte": 50
462-
}
463-
}
464-
}
465-
}
466-
```
574+
[**`type query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-type-query.html) 用于查询具有指定类型的文档。
467575
468-
示例:日期范围查询
576+
示例:
469577
470578
```bash
471-
GET kibana_sample_data_ecommerce/_search
579+
GET /_search
472580
{
473581
"query": {
474-
"range": {
475-
"order_date": {
476-
"time_zone": "+00:00",
477-
"gte": "2018-01-01T00:00:00",
478-
"lte": "now"
479-
}
582+
"type": {
583+
"value": "_doc"
480584
}
481585
}
482586
}
483587
```
484588
485-
### prefix query
486-
487-
**`prefix`** 查询用于查询某个字段中以给定前缀开始的文档,比如查询 title 中含有以 java 为前缀的关键词的文档,那么含有 java、javascript、javaee 等所有以 java 开头关键词的文档都会被匹配。查询 description 字段中包含有以 win 为前缀的关键词的文档,查询语句如下:
488-
489-
```
490-
GET books/_search
491-
{
492-
"query": {
493-
"prefix": {
494-
"description": "win"
495-
}
496-
}
497-
}
498-
```
499-
500589
### wildcard query
501590
502-
wildcard query 中文译为通配符查询,支持单字符通配符和多字符通配符,`?` 用来匹配一个任意字符,`*` 用来匹配零个或者多个字符
591+
[**`wildcard query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html) 即通配符查询,返回与通配符模式匹配的文档
503592
504-
以 H?tland 为例,Hatland、Hbtland 等都可以匹配,但是不能匹配 Htland,`?` 只能代表一位。H*tland 可以匹配 Htland、Habctland 等`*` 可以代表 0 至多个字符。**和 prefix 查询一样,wildcard 查询的查询性能也不是很高,需要消耗较多的 CPU 资源。**
593+
`?` 用来匹配一个任意字符`*` 用来匹配零个或者多个字符。
505594
506-
下面举一个 wildcard 查询的例子,假设需要找某一作者写的书,但是忘记了作者名字的全称,只记住了前两个字,那么就可以使用通配符查询,查询语句如下:
595+
示例:以下搜索返回 `user.id` 字段包含以 `ki` 开头并以 `y` 结尾的术语的文档。这些匹配项可以包括 `kiy``kity``kimchy`
507596
508-
```
509-
GET books/_search
597+
```bash
598+
GET /_search
510599
{
511600
"query": {
512601
"wildcard": {
513-
"author": "李永*"
514-
}
515-
}
516-
}
517-
```
518-
519-
### regexp query
520-
521-
Elasticsearch 也支持正则表达式查询,通过 regexp query 可以查询指定字段包含与指定正则表达式匹配的文档。可以代表任意字符, “a.c.e” 和 “ab...” 都可以匹配 “abcde”,a{3}b{3}、a{2,3}b{2,4}、a{2,}{2,} 都可以匹配字符串 “aaabbb”。
522-
523-
例如需要匹配以 W 开头紧跟着数字的邮政编码,使用正则表达式查询构造查询语句如下:
524-
525-
```
526-
GET books/_search
527-
{
528-
"query": {
529-
"regexp": {
530-
"postcode": "W[0-9].+"
531-
}
532-
}
533-
}
534-
```
535-
536-
### type query
537-
538-
type query 用于查询具有指定类型的文档。例如查询 Elasticsearch 中 type 为 computer 的文档,查询语句如下:
539-
540-
```
541-
GET books/_search
542-
{
543-
"query": {
544-
"type": {
545-
"value": "computer"
546-
}
547-
}
548-
}
549-
```
550-
551-
### ids query
552-
553-
ids query 用于查询具有指定 id 的文档。类型是可选的,也可以省略,也可以接受一个数组。如果未指定任何类型,则会查询索引中的所有类型。例如,查询类型为 computer,id 为 1、3、5 的文档,**本质上是对文档 `_id` 的查询,所以对应的 value 是字符串类型**,查询语句如下:
554-
555-
```
556-
GET books/_search
557-
{
558-
"query": {
559-
"ids": {
560-
"type": "computer",
561-
"values": ["1", "3", "5"]
602+
"user.id": {
603+
"value": "ki*y",
604+
"boost": 1.0,
605+
"rewrite": "constant_score"
606+
}
562607
}
563608
}
564609
}
565610
```
566611
567-
ES 查询中如果要排除一些指定的 id 列表可以结合 ids query 和 bool 查询的 must_not,具体参照 [Elasticsearch(ES)不匹配或排除指定的 id 列表](https://www.knowledgedict.com/tutorial/elasticsearch-query-exclude-ids.html)。
612+
> 注意:如果配置了[`search.allow_expensive_queries`](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html#query-dsl-allow-expensive-queries) ,则[**`wildcard query`**](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html) 会被禁用
568613
569614
## 复合查询
570615

0 commit comments

Comments
 (0)