需求

根据关键字查询、根据品牌查询、商品类别、商品属性信息、价格区间、是否有库存、排序(销量、价格、 上架时间等)
image.png

根据关键字查询

bool多条件查询,
mast相当于and关系,各个条件都满足才行,mast会计算评分
用match是因match分词搜索

  1. POST /product_db/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "match": {
  8. "name": {
  9. "query": "手机"
  10. }
  11. }
  12. }
  13. ]
  14. }
  15. }
  16. }

根据品牌聚合

image.png

  1. POST /product_db/_search
  2. {
  3. "aggs": {
  4. "brand_agg": {
  5. "terms": {
  6. "field": "brandId",
  7. "size": 10
  8. }
  9. }
  10. }
  11. }

buckets就是聚合后的结果,

key就是brandId, doc_count是这个brandId的数量
image.png

显示品牌名字和品牌图片

上面的聚合结果没有品牌名字和品牌图片,我需要品牌名字和品牌图片,目前有一种解决方案是用brandId再去数据库查询一遍,还有一种解决方案是子聚合

  1. POST /product_db/_search
  2. {
  3. "aggs": {
  4. "brand_agg": {
  5. "terms": {
  6. "field": "brandId",
  7. "size": 10
  8. },
  9. "aggs": {
  10. "brand_name_agg": {
  11. "terms": {
  12. "field": "brandName"
  13. }
  14. },
  15. "brand_img_agg": {
  16. "terms": {
  17. "field": "brandImg"
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }

这个就是品牌名字和品牌图片
image.png

商品类别

image.png

先根据品牌id聚合,再根据类目id子聚合

  1. POST /product_db/_search
  2. {
  3. "aggs": {
  4. "brand_agg": {
  5. "terms": {
  6. "field": "brandId",
  7. "size": 100
  8. }
  9. },
  10. "category_agg": {
  11. "terms": {
  12. "field": "categoryId",
  13. "size": "100"
  14. },
  15. "aggs": {
  16. "category_name_agg": {
  17. "terms": {
  18. "field": "categoryName"
  19. }
  20. }
  21. }
  22. }
  23. },
  24. "size": 0
  25. }

image.png

商品属性信息

image.png

商品属性是最麻烦的,因为商品属性是动态变化的,
cpu是属性名, 2核 4核 这个是属性值
颜色是属性名, 白色 蓝色 是属性值

  1. POST /product_db/_search
  2. {
  3. "aggs": {
  4. "attr_agg": {
  5. "terms": {
  6. "field": "attrs.attrId"
  7. }
  8. }
  9. }
  10. }

用这种方式聚合查询是聚合查询不出来数据的
image.png

用nested的方式去查询

  1. POST /product_db/_search
  2. {
  3. "aggs": {
  4. "attr_agg": {
  5. "nested": {
  6. "path": "attrs"
  7. },
  8. "aggs": {
  9. "attr_id_agg": {
  10. "terms": {
  11. "field": "attrs.attrId"
  12. },
  13. "aggs": {
  14. "attr_name_agg": {
  15. "terms": {
  16. "field": "attrs.attrName"
  17. }
  18. },
  19. "attr_value_agg": {
  20. "terms": {
  21. "field": "attrs.attrValue"
  22. }
  23. }
  24. }
  25. }
  26. }
  27. }
  28. },"size":0
  29. }

image.png

image.png

价格区间

价格区间

  1. POST /product_db/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "filter": [
  6. {
  7. "range":{
  8. "price":{
  9. "from": 2500,
  10. "to": 5000
  11. }
  12. }
  13. }
  14. ]
  15. }
  16. }
  17. }

是否有库存

不需要评分,就用filter,filter效率高

  1. POST /product_db/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "filter": [
  6. {
  7. "term": {
  8. "hasStock": true
  9. }
  10. }
  11. ]
  12. }
  13. }
  14. }

排序(销量、价格、 上架时间等)

销量升序用asc, 降序用desc , 价格和上架时间和销量是一样的

  1. POST /product_db/_search
  2. {
  3. "sort": {
  4. "salecount": {
  5. "order": "asc"
  6. }
  7. }
  8. }

分页

  1. POST /product_db/_search
  2. {
  3. "from": 0,
  4. "size": 10
  5. }

高亮

  1. POST /product_db/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "match": {
  8. "name": {
  9. "query": "手机"
  10. }
  11. }
  12. }
  13. ]
  14. }
  15. },
  16. "highlight": {
  17. "pre_tags": [
  18. "<b style='color:red'>"
  19. ],
  20. "post_tags": [
  21. "</b>"
  22. ],
  23. "fields": {
  24. "name": {}
  25. }
  26. }
  27. }

结果:

image.png