1. 一个完整的查询语句应该如何写

官方文档

2. 全文查询 - 分词

1. match查询(匹配查询)

文档

match:模糊匹配,需要指定字段名,但是输入会进行分词,比如”hello world”会进行拆分为hello和world,然后匹配,如果字段中包含hello或者world,或者都包含的结果都会被查询出来,也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松。

  1. GET user/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address": "street"
  6. }
  7. }
  8. }

2. match_phrase查询 短语查询

官方文档
match_phase:会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样。以”hello world”为例,要求结果中必须包含hello和world,而且还要求他们是连着的,顺序也是固定的,hello that word不满足,world hello也不满足条件。

  1. GET user/_search
  2. {
  3. "query": {
  4. "match_phrase": {
  5. "address": "Madison street"
  6. }
  7. }
  8. }

3. multi_match查询

官方文档
multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询,即对指定的多个字段进行match查询

  1. POST resume/_doc/12
  2. {
  3. "title": "后端工程师",
  4. "desc": "多年go语言开发经验, 熟悉go的基本语法, 熟悉常用的go语言库",
  5. "want_learn":"python语言"
  6. }
  7. POST resume/_doc/13
  8. {
  9. "title": "go工程师",
  10. "desc": "多年开发经验",
  11. "want_learn":"java语言"
  12. }
  13. POST resume/_doc/14
  14. {
  15. "title": "后端工程师",
  16. "desc": "多年开发经验",
  17. "want_learn":"rust语言"
  18. }
  19. GET account/_search
  20. {
  21. "query": {
  22. "multi_match": {
  23. "query": "go",
  24. "fields": ["title", "desc"]
  25. }
  26. }
  27. }

### 4. query_string查询 [官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html)
`query_string`:和match类似,但是match需要指定字段名,query_string是在所有字段中搜索,范围更广泛。

  1. GET user/_search
  2. {
  3. "query":{
  4. "query_string": {
  5. "default_field": "address",
  6. "query": "Madison AND street"
  7. }}}

3. match all查询

  1. GET user/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. }
  6. }

4. term 级别查询

官方文档

1. term查询

term: 这种查询和match在有些时候是等价的,比如我们查询单个的词hello,那么会和match查询结果一样,但是如果查询”hello world”,结果就相差很大,因为这个输入不会进行分词,就是说查询的时候,是查询字段分词结果中是否有”hello world”的字样,而不是查询字段中包含”hello world”的字样,elasticsearch会对字段内容进行分词,“hello world”会被分成hello和world,不存在”hello world”,因此这里的查询结果会为空。这也是term查询和match的区别。

  1. GET user/_search
  2. {
  3. "query": {
  4. "term": {
  5. "address": "madison street"
  6. }
  7. }
  8. }

2. range查询 - 范围查询

  1. GET user/_search
  2. {
  3. "query":{
  4. "range": {
  5. "age": {
  6. "gte": 20,
  7. "lte": 30
  8. }
  9. }
  10. }
  11. }

3. exists查询

  1. GET user/_search
  2. {
  3. "query": {
  4. "exists": {
  5. "field": "school"
  6. }
  7. }
  8. }

4. fuzzy模糊查询

编辑距离

  1. GET user/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address": {
  6. "query": "Midison streat",
  7. "fuzziness": 1
  8. }
  9. }
  10. }
  11. }
  12. GET /_search
  13. {
  14. "query": {
  15. "fuzzy": {
  16. "user.id": {
  17. "value": "ki"
  18. }
  19. }
  20. }
  21. }

5. 复合查询

官方文档
Elasticsearch bool查询对应Lucene BooleanQuery, 格式如下

  1. {
  2. "query":{
  3. "bool":{
  4. "must":[
  5. ],
  6. "should":[
  7. ],
  8. "must_not":[
  9. ],
  10. "filter":[
  11. ],
  12. }
  13. }
  14. }

/

  1. must: 必须匹配,查询上下文,加分
  2. should: 应该匹配,查询上下文,加分
  3. must_not: 必须不匹配,过滤上下文,过滤
  4. filter: 必须匹配,过滤上下文,过滤

bool查询采用了一种匹配越多越好的方法,因此每个匹配的must或should子句的分数将被加在一起,以提供每个文档的最终得分

  1. GET user/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "term": {
  8. "state": "tn"
  9. }
  10. },
  11. {
  12. "range": {
  13. "age": {
  14. "gte": 20,
  15. "lte": 30
  16. }
  17. }
  18. }
  19. ],
  20. "must_not": [
  21. {
  22. "term": {
  23. "gender": "m"
  24. }
  25. }
  26. ],
  27. "should": [
  28. {
  29. "match": {
  30. "firstname": "Decker"
  31. }
  32. }
  33. ],
  34. "filter": [
  35. {
  36. "range": {
  37. "age": {
  38. "gte": 25,
  39. "lte": 30
  40. }
  41. }
  42. }
  43. ]
  44. }
  45. }
  46. }