1、测试数据

1-1 建索引

  1. PUT test_search
  2. {
  3. "mappings": {
  4. "properties": {
  5. "dname" : {
  6. "type" : "text",
  7. "analyzer": "standard"
  8. },
  9. "ename" : {
  10. "type" : "text",
  11. "analyzer": "standard"
  12. },
  13. "eage" : {
  14. "type": "long"
  15. },
  16. "hiredate" : {
  17. "type": "date"
  18. },
  19. "gender" : {
  20. "type" : "keyword"
  21. }
  22. }
  23. }
  24. }

1-2 插入数据

  1. POST test_search/_bulk
  2. { "index": {}}
  3. { "dname" : "Sales Department", "ename" : "张三", "eage":20, "hiredate" : "2019-01-01", "gender" : "男性" }
  4. { "index": {}}
  5. { "dname" : "Sales Department", "ename" : "李四", "eage":21, "hiredate" : "2019-02-01", "gender" : "男性" }
  6. { "index": {}}
  7. { "dname" : "Development Department", "ename" : "王五", "eage":23, "hiredate" : "2019-01-03", "gender" : "男性" }
  8. { "index": {}}
  9. { "dname" : "Development Department", "ename" : "赵六", "eage":26, "hiredate" : "2018-01-01", "gender" : "男性" }
  10. { "index": {}}
  11. { "dname" : "Development Department", "ename" : "韩梅梅", "eage":24, "hiredate" : "2019-03-01", "gender" : "女性" }
  12. { "index": {}}
  13. { "dname" : "Development Department", "ename" : "钱虹", "eage":29, "hiredate" : "2018-03-01", "gender" : "女性" }

2、 query DSL

DSL——Domain Specified Language ,特殊领域的语言
请求参数是请求体传递的。在Elasticsearch中,请求体的字符集默认为UTF-8。
语法格式:

  1. GET 索引名/_search
  2. {
  3. "command":{ "parameter_name" : "parameter_value"}
  4. }

2-1 查询所有数据

  1. GET 索引名/_search
  2. {
  3. "query" : { "match_all" : {} }
  4. }

image.png

2-2 match search(项目搜索功能使用此命令)

全文检索。要求查询条件拆分后的任意词条与具体数据匹配就算搜索结果。类似于SQL 语句中的 LIKE %字段值%

  1. GET 索引名/_search
  2. {
  3. "query": {
  4. "match": {
  5. "字段名": "搜索条件"
  6. }
  7. }
  8. }
  1. <br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/872322/1651904507690-d0f3b355-fe31-4b7b-b684-cf08bd62a0ee.png#clientId=ua934eb91-7d1c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=441&id=u17c585ce&margin=%5Bobject%20Object%5D&name=image.png&originHeight=485&originWidth=1107&originalType=binary&ratio=1&rotation=0&showTitle=false&size=73834&status=done&style=none&taskId=uf0b197fb-632b-47dd-9b0a-fa25e71de3c&title=&width=1006.3636145512925)

2-3 phrase search

短语检索。要求查询条件必须和具体数据完全匹配才算搜索结果。其特征是:
a.对搜索条件进行拆词
b.把拆词当做一个整体,整体去索引(索引是存储内容被拆词后的结果)中匹配,必须严格匹配(存储内容拆词后是:北京,大兴,朝阳。条件拆词是:北京,朝阳。这种情况是不能被查询的,因为北京和朝阳之间还有大兴)才能查询到。

  1. GET 索引名/_search
  2. {
  3. "query": {
  4. "match_phrase": {
  5. "字段名": "搜索条件"
  6. }
  7. }
  8. }

2-4 range

范围搜索

  1. GET 索引名/类型名/_search
  2. {
  3. "query" : {
  4. "range" : {
  5. "字段名" : {
  6. "gt" : 搜索条件1,
  7. "lte" : 搜索条件2
  8. }
  9. }
  10. }
  11. }

image.png

2-5 多条件复合搜索

在一个请求体中,有多个搜索条件。如:条件为部门名称是 Sales Department,员工年龄在20-26之间,员工姓名叫张三;上述条件中,部门名称为可选条件,员工年龄必须满足要求,部门员工姓名为可选要求。这就是复合搜索。

  1. GET 索引名/类型名/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [ #数组中的多个条件必须同时满足
  6. {
  7. "range": {
  8. "字段名": {
  9. "lt": 条件
  10. }
  11. }
  12. }
  13. ],
  14. "must_not":[ #数组中的多个条件必须都不满足
  15. {
  16. "match": {
  17. "字段名": "条件"
  18. }
  19. },
  20. {
  21. "range": {
  22. "字段名": {
  23. "gte": "搜索条件"
  24. }
  25. }
  26. }
  27. ]
  28. "should": [# 数组中的多个条件有任意一个满足即可。
  29. {
  30. "match": {
  31. "字段名": "条件"
  32. }
  33. },
  34. {
  35. "range": {
  36. "字段名": {
  37. "gte": "搜索条件"
  38. }
  39. }
  40. }
  41. ]
  42. }
  43. }
  44. }

image.png

2-6 排序

在Elasticsearch的搜索中,默认是使用相关度分数实现排序的(所以上个图片中结果肯定是张三排最前面)。可以通过搜索语法实现定制化排序。

  1. GET 索引名/_search
  2. {
  3. "query": {
  4. [搜索条件]
  5. },
  6. "sort": [
  7. {
  8. "字段名1": {
  9. "order": "asc"
  10. }
  11. },
  12. {
  13. "字段名2": {
  14. "order": "desc"
  15. }
  16. }
  17. ]
  18. }
  1. 下面我们用年龄来倒序排序<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/872322/1651906163847-968561cb-3e8b-445a-8c8d-d38c8fad83de.png#clientId=u7f8afe6d-ae9f-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=733&id=u12a1292b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=806&originWidth=1284&originalType=binary&ratio=1&rotation=0&showTitle=false&size=82226&status=done&style=none&taskId=u12f5362a-5254-4e9e-8848-144556ce00a&title=&width=1167.272701972773)<br />再来查询 部门名称是 Sales Department,员工年龄在20-26之间的员工,然后年龄升序排序<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/872322/1651906655823-21eb708f-ef22-4413-9d4d-3f2f80619585.png#clientId=u7f8afe6d-ae9f-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=724&id=u49a22a72&margin=%5Bobject%20Object%5D&name=image.png&originHeight=796&originWidth=1258&originalType=binary&ratio=1&rotation=0&showTitle=false&size=82714&status=done&style=none&taskId=uab382d6d-104e-41fc-86a6-e5f5199ec50&title=&width=1143.6363388487136)<br />**注意:在Elasticsearch中,如果使用text类型的字段作为排序依据,会有问题。Elasticsearch需要对text类型字段数据做分词处理。如果使用text类型字段做排序,Elasticsearch给出的排序结果未必友好,毕竟分词后,先使用哪一个单词做排序都是不合理的。所以Elasticsearch中默认情况下不允许使用text类型的字段做排序,如果需要使用字符串做结果排序,则可使用keyword类型字段作为排序依据,因为keyword字段不做分词处理**。

2-7 分页
DSL分页也是用from和size实现的

  1. GET 索引名称/_search
  2. {
  3. "query":{
  4. "match_all":{}
  5. },
  6. "from": 起始下标,
  7. "size": 查询记录数
  8. }

image.png

2-7 highlight display 高亮显示

在搜索中,经常需要对搜索关键字做高亮显示,这个时候就可以使用highlight语法

  1. GET 索引名/_search
  2. {
  3. "query": {
  4. "match": {
  5. "字段名": "条件"
  6. }
  7. },
  8. "highlight": {
  9. "fields": {
  10. "要高亮显示的字段名": {
  11. "fragment_size": 5, #每个分段长度,默认20
  12. "number_of_fragments": 1 #返回多少个分段,默认3
  13. }
  14. },
  15. "pre_tags": ["前缀"],
  16. "post_tags": ["后缀"]
  17. }
  18. }
  1. <br />fragment_size:代表字段数据**如果过长**,则分段,每个片段数据长度为多少。长度不是字符数量,是Elasticsearch内部的数据长度计算方式。默认不对字段做分段。<br />number_of_fragments:代表搜索返回的高亮片段数量,默认情况下会将拆分后的所有片段都返回。<br />pre_tags:高亮前缀<br />post_tags:高亮后缀<br />很多搜索结果显示页面中都不会显示完整的数据,这样在数据过长的时候会导致页面效果不佳,都会按照某一个固定长度来显示搜索结果,所以fragment_size和number_of_fragments参数还是很常用的。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/872322/1651907895549-d2d4caf0-d84b-4dac-afe7-6beb259cd8e0.png#clientId=u7f8afe6d-ae9f-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=728&id=u928b6598&margin=%5Bobject%20Object%5D&name=image.png&originHeight=801&originWidth=1246&originalType=binary&ratio=1&rotation=0&showTitle=false&size=99191&status=done&style=none&taskId=u24ab3dcd-190d-4a2d-87f0-78868e79aa2&title=&width=1132.7272481760708)