1.前言

es文档看后感到十分空,本篇文章练习如何使用RESTful风格的api请求查询Es中的数据。下面以提一个需求,写出对应的查询方式来验证自己是否掌握

索引名: goods
数据格式如下:

image.png

2.实例

1.查询spuId为44的商品信息

①使用URI的方式
格式: /索引/_search?q=字段名:字段值

  1. GET /goods/_search?q=spuId:44

②使用请求体的方式
term是指某个字段的值必须是 44, 但是不能用来匹配字段值类型为text类型的。

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "term": {
  5. "spuId": {
  6. "value": "44"
  7. }
  8. }
  9. }
  10. }

image.png

2.精准匹配term不可用于text类型的字段查询

image.png
①搜索mainTitle字段为:Apple iPhone 11 手机 黑色 64GB 的商品

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "term": {
  5. "mainTitle": {
  6. "value": "Apple iPhone 11 手机 黑色 64GB",
  7. "boost": 1.0
  8. }
  9. }
  10. }
  11. }

image.png
②这种需要使用match的方式进行搜索(最短的写法)

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "match": {
  5. "mainTitle": "Apple iPhone 11 手机 黑色 256GB"
  6. }
  7. }
  8. }

match查询完全写法

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "match": {
  5. "字段名": {
  6. "query":"用户的搜索输入内容",
  7. "analyzer":"",
  8. "auto_generate_synonyms_phrase_query":"",
  9. .................
  10. }
  11. }
  12. }
  13. }

3.查询spuId为44和shopId为92并且sales字段为11的

image.png
①解决思路:and and 在es中即使 bool查询

  1. POST /goods/_search
  2. {
  3. "query": {
  4. "bool" : {
  5. "must": [
  6. {"term" : { "spuId" : "44" }},
  7. {"term" : { "shopId" : "92" }},
  8. {"term" : { "sales": "11" }}
  9. ]
  10. }
  11. }
  12. }

三者取交集 就是查询结果。。
也可以用filter

  1. POST /goods/_search
  2. {
  3. "query": {
  4. "bool" : {
  5. "filter": [
  6. {"term" : { "spuId" : "44" }},
  7. {"term" : { "shopId" : "92" }},
  8. {"term" : { "sales": "11" }}
  9. ]
  10. }
  11. }
  12. }

image.pngimage.png
差别在分数上filter没有分数

4.组合查询中的should如何用

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "bool" : {
  5. "must": [
  6. {"term" : { "spuId" : "44" }},
  7. {"term" : { "shopId" : "92" }},
  8. {"term" : { "sales": "11" }}
  9. ],
  10. "should":[
  11. {"term":{"sales":"7"}}
  12. ],
  13. "minimum_should_match": 1
  14. }
  15. }
  16. }

image.png

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "bool" : {
  5. "must": [
  6. {"term" : { "spuId" : "44" }},
  7. {"term" : { "shopId" : "92" }},
  8. {"term" : { "sales": "11" }}
  9. ],
  10. "should":[
  11. {"term":{"sales":"7"}}
  12. ]
  13. }
  14. }
  15. }

image.png

should:指所匹配的文档或者说数据记录应该存在于查询结果中
当又must或filter存在时,优先选择must和filter中的。
当时当配置了minimum_should_match 相当于should 变成 了must 。

5.如何知道查出来的数据时哪个匹配上的

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "bool" : {
  5. "should" : [
  6. {"match" : { "mainTitle": {"query" : "手机", "_name" : "first"} }},
  7. {"match" : { "mainTitle" : {"query" : "化妆品", "_name" : "last"} }}
  8. ]
  9. }
  10. }
  11. }

image.png

6.查询spuId为44并且mysqlId为179的数据赋值低一些的分数

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "boosting" : {
  5. "positive" : {
  6. "term" : {
  7. "spuId" : "44"
  8. }
  9. },
  10. "negative" : {
  11. "term" : {
  12. "mysqlId" : "179"
  13. }
  14. },
  15. "negative_boost" : 0.1
  16. }
  17. }
  18. }

image.png

7.使用filter进行查询并返回指定分数

filter查询返回的分数为0 ,如何赋值一个分数

  1. GET /goods/_search
  2. {
  3. "query": {
  4. "constant_score" : {
  5. "filter" : {
  6. "term" : { "spuId" : "44"}
  7. },
  8. "boost" : 1.2
  9. }
  10. }
  11. }

image.png

8.DisjunctionMax 计算得分的方式

多个查询,A:10,B: 8,C :7
那么 最后的得分是 10 + (7+8)*tie_breaker = 最终得分
image.png
image.png
默认tie_breaker为0

9.如果查询结果分数想做处理

function score ,具体就是在你查询结果的分数到底怎么计算的问题