基于Elasticsearch5.5版本,不完全准确,从常用的开始写起,逐渐修改中……
详见官方文档

查询与过滤

用于查询(query)时:

需要判断这个文档是否匹配,同时需要判断匹配程度(评分查询 scoring queries)。
找出匹配文档并计算相关性,查询结果并不缓存。【倒排索引 inverted index】

用于过滤(filter)时:

只需判断这个文档是否匹配。
只用简单检查包含或者排除,计算迅速且缓存查询结果。

查询语法

match_all 查询:

匹配所有文档。
此时返回_score为1.0,若要修改此字段,用”boost”。

  1. // "match_all"
  2. GET index/type/_search
  3. {
  4. "query" : {
  5. "match_all" : {}
  6. }
  7. }
  8. // "boost"
  9. GET index/type/_search
  10. {
  11. "query" : {
  12. "match_all" : {
  13. "boost" : 1.2
  14. }
  15. }
  16. }

Full Text Queries (全文查询)

match 查询:

对全文text/数字numerics/日期dates等类型的字段使用,将使用分析器分析该字段再进行查询
对精确值(如keyword类型)字段使用,精确匹配

  1. // 查询id001的文档
  2. GET index/type/_search
  3. {
  4. "query": {
  5. "match": {
  6. "id": "001"
  7. }
  8. }
  9. }

multi_match 查询:

多字段单值

  1. GET index/type/_search
  2. {
  3. "query": {
  4. "multi_match": {
  5. "query": "0",
  6. "fields": ["index","state"] // index=0state=0
  7. }
  8. }
  9. }

QueryString查询: 【待完善】

查询单个字段时,在我看来,使用”and”,”or”没有啥区别
查询多个字段时,额情况有点复杂,先抄下官方文档的解释,以后确定再来修改

  1. // 单字段多值
  2. GET index_parkingorder_v1/parkingorder_info/_search
  3. {
  4. "query": {
  5. "query_string": {
  6. "default_field": "id",
  7. "query": "001 and 002 or 003" // 试了一下,貌似id=001 id=002 id=003的文档都会返回,
  8. // 若没有003的文档的话,也不会影响别的结果
  9. }
  10. }
  11. }
  12. // 多字段多值
  13. GET index/type/_search
  14. {
  15. "query": {
  16. "query_string": {
  17. "fields": ["index","state"],
  18. "query": "1 and 0" // 相当于: (index=1 or state=1) and (index=0 or state=0)
  19. }
  20. }
  21. }

SimpleQueryString查询:

经常使用,支持单字段单值与多值,多字段单值与多值等
还有一些运算符号可以用:”+”,”-“,”*”,”|” 等

  1. // 通配符*
  2. GET index/type/_search
  3. {
  4. "query": {
  5. "simple_query_string": {
  6. "query": "王*",
  7. "fields": ["name"]
  8. }
  9. }
  10. }
  11. //
  12. GET index/type/_search
  13. {
  14. "query": {
  15. "simple_query_string": {
  16. "query": "001 -002", //返回id=001 or id!=002的文档,其中空格即"|",表示或者
  17. "fields": ["id"] // "+"表示与,"-"表示否,可以连用
  18. }
  19. }
  20. }

Term Level Queries(词级查询)

term 查询:

精确值(数字、时间布尔、not_analyzed的字段)查询

terms 查询:

匹配多值,只要此字段匹配上一个值,此文档即匹配成功

exists 查询和missing 查询:

查找指定字段中有值或无值的文档

range 查询:

匹配指定区间内

exists 查询:

判断某个字段是否存在。ES中值为null的字段都不存在

wildcard 查询:

模糊查询,通配符 ? *。
目前我用这个查类型为keyword的字段,好用。
text类型貌似不太准确,或许被分词的缘故,待确定。

fuzzy 查询:

也是模糊查询,与wildcard查询区别待确定

Compound Queries(复合查询)

bool 查询:

将多个查询组合一起,must(必须匹配)、must_not(必须不匹配)、should(若满足将增加_score)、filter(必须匹配,但不评分)

constant_score 查询:

可以用来取代只有filter语句的bool

Sort 排序:

string字段进行排序时,需要not_analyzed,映射中有个fields参数,可以设置对一个字段用两种方式索引

关于text类型如何做到精确查询的方法(https://elasticsearch.cn/question/5628)