@@ -6,6 +6,12 @@ Elasticsearch 查询语句采用基于 RESTful 风格的接口封装成 JSON 格
6
6
7
7
ES 全文查询主要用于在全文字段上,主要考虑查询词与文档的相关性(Relevance)。
8
8
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
+
9
15
### match query
10
16
11
17
match query ** 用于搜索单个字段** ,首先会针对查询语句进行解析(经过 analyzer),主要是对查询语句进行分词,分词后查询语句的任何一个词项被匹配,文档就会被搜到,默认情况下相当于对分词后词项进行 or 匹配操作。
@@ -241,13 +247,24 @@ GET books/_search
241
247
242
248
# # 词项查询
243
249
244
- 全文查询在执行查询之前会分析查询字符串,词项查询时对倒排索引中存储的词项进行** 精确匹配操作** 。词项级别的查询通常用于结构化数据,如数字、日期和枚举类型。
245
-
246
250
** ` Term` (词项)是表达语意的最小单位** 。搜索和利用统计语言模型进行自然语言处理都需要处理 Term。
247
251
248
- 在 ES 中,term 查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项。并且使用相关度计算公式为每个包含该词项的文档进行相关度计算 。
252
+ 全文查询在执行查询之前会分析查询字符串 。
249
253
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)**
251
268
252
269
# ## exists query
253
270
@@ -301,22 +318,147 @@ GET kibana_sample_data_ecommerce/_search
301
318
302
319
为了找到相似的词条,fuzzy query 会在指定的编辑距离内创建搜索词条的所有可能变体或扩展集。然后返回完全匹配任意扩展的文档。
303
320
304
- ` ` `
321
+ ` ` ` bash
305
322
GET books/_search
306
323
{
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
+ }
312
336
}
313
337
` ` `
314
338
315
339
注意:如果配置了 [` search.allow_expensive_queries` ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html#query-dsl-allow-expensive-queries) ,则 fuzzy query 不能执行。
316
340
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
+
317
459
# ## term query
318
460
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 查询不被解析,只有查询词和文档中的词精确匹配才会被搜索到,应用场景为查询人名、地名等需要精准匹配的需求。
320
462
321
463
示例:
322
464
@@ -370,7 +512,7 @@ DELETE my-index-000001
370
512
371
513
# ## terms query
372
514
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) 相同,但可以搜索多个值。
374
516
375
517
terms query 查询参数:
376
518
@@ -425,146 +567,49 @@ GET my-index-000001/_search?pretty
425
567
DELETE my-index-000001
426
568
` ` `
427
569
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
451
571
452
- 示例:数值范围查询
572
+ > 7.0.0 后废弃
453
573
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) 用于查询具有指定类型的文档。
467
575
468
- 示例:日期范围查询
576
+ 示例:
469
577
470
578
` ` ` bash
471
- GET kibana_sample_data_ecommerce /_search
579
+ GET /_search
472
580
{
473
581
" 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"
480
584
}
481
585
}
482
586
}
483
587
` ` `
484
588
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
-
500
589
# ## wildcard query
501
590
502
- wildcard query 中文译为通配符查询,支持单字符通配符和多字符通配符, ` ? ` 用来匹配一个任意字符, ` * ` 用来匹配零个或者多个字符 。
591
+ [ ** ` wildcard query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html) 即通配符查询,返回与通配符模式匹配的文档 。
503
592
504
- 以 H ? tland 为例,Hatland、Hbtland 等都可以匹配,但是不能匹配 Htland, ` ? ` 只能代表一位。H * tland 可以匹配 Htland、Habctland 等 ,` * ` 可以代表 0 至多个字符。 ** 和 prefix 查询一样,wildcard 查询的查询性能也不是很高,需要消耗较多的 CPU 资源。 **
593
+ ` ? ` 用来匹配一个任意字符 ,` * ` 用来匹配零个或者多个字符。
505
594
506
- 下面举一个 wildcard 查询的例子,假设需要找某一作者写的书,但是忘记了作者名字的全称,只记住了前两个字,那么就可以使用通配符查询,查询语句如下:
595
+ 示例:以下搜索返回 ` user.id ` 字段包含以 ` ki ` 开头并以 ` y ` 结尾的术语的文档。这些匹配项可以包括 ` kiy ` 、 ` kity ` 或 ` kimchy ` 。
507
596
508
- ` ` `
509
- GET books /_search
597
+ ` ` ` bash
598
+ GET /_search
510
599
{
511
600
" query" : {
512
601
" 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
+ }
562
607
}
563
608
}
564
609
}
565
610
` ` `
566
611
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) 会被禁用 。
568
613
569
614
# # 复合查询
570
615
0 commit comments