DSL(查询文档):

DSL是基于JSON风格的查询语句
查询所有:
查询出所有的数据,不加条件限制,但是会加分页的限制
列入:
match_all
全文检索查询:
查询利用分词器对用户输入内容分词,然后倒排索引库中匹配
例如:
match_query
multi_match_query
精确查询:
根据精确词条值查询数据,一般查找keyword 数值 日期
boolean等类型字段例如:
共同: 不用进行分词
但是回去建立倒排索引,内容整体存入词条
例如:
ids :根据ID匹配
range :根据数值范围查询
trem :按照数据的值进行查询

地理(geo)查询根据经纬度查询例如:
geo_distance
geo_bounding_box
复合查询:
它本身没有查询条件的,将上诉的各种查询组合起来,合并查询条件
列入:
bool
function_score:算分的
image.png

  1. #查询所有
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "match_all": {}
  6. }
  7. }

基本语法:

全文检索查询:

image.png
全文检索查询,会对用户输入内容分词,常用于搜索框搜索。
match查询:

  1. #match
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "match": {
  6. "all": "如家"
  7. }
  8. }
  9. }
  1. #multi_match
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "multi_match": {
  6. "query": "外滩如家",
  7. "fields": ["brand","name","business"]
  8. }
  9. }
  10. }

总结:
mutch 和multi_match的区别是什么?
mutch是查询单个字段
multi_match可以数组形式查询多个字段
参与查询字段越多查询性能越差

精确查询:

精确查询一般查找keyword,数值 日期 booolean 等类型字段
所以不会多搜索条件分词 常见的有:
精确查询:
term:根据词条精确值查询
range:根据值的范围查询
image.png

image.png

  1. #term查询
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "term": {
  6. "FIELD": {
  7. "value": "上海"
  8. }
  9. }
  10. }
  11. }
  1. #range查询
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "range": {
  6. "price": {
  7. "gte": 100,
  8. "lte": 300
  9. }
  10. }
  11. }
  12. }

地理查询:

根据经纬度查询。常见的场景:
image.png
image.png

geo_bounding_box:查询geo_point值落在其中矩形范围的
所有文档
image.png

geo_distance :(相当于范围查询)查询到指定中心点小其中距离值的所有文档
image.png
image.png

  1. #distance
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "geo_distance":{
  6. "distance":"2km",
  7. "location":"32.21,121.5"
  8. }
  9. }
  10. }

相关性算法:

复合型查询:可以将其他的简单查询组合起来实现更为复杂的查询

词条频率:image.png
image.png

image.png
image.png

image.png

FunctionScoreQuery:控制打分

人为控制排名:
image.png

案列:
给如家这个品牌的酒店排名靠前一些:
把这个问题翻译一下 function score 需要三要素
那些文档需要算法加权?
品牌为如家酒店
算分函数是什么?
weight
加权模式是什么?
求和
image.png

  1. #function _score
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "function_score": {
  6. "query": {},
  7. "functions": [
  8. {
  9. "filter": {
  10. "term": {
  11. "brand": "万怡"
  12. }
  13. },
  14. "weight": 10
  15. }
  16. ],
  17. "boost_mode": "sum"
  18. }
  19. }
  20. }

过滤条件 :那些文档要加分

算分函数:如何计算 function score

加权方式;
fuction score 与 query score 如何运算

BOOLQuery(第二种符合查询)

布尔查询是一个或多个查询子句组合 子查询组合方式有:

  • must:必须匹配每个子查询 类似“与”
  • should:选择性匹配子查询类似“或”
  • must_not: 必须不匹配 不参与算分 类似“非”
  • filter:不参与算分

image.png
需求:
搜索名字包含“如家”价格不高于400
坐标在31.21,121.5周围10km范围内的酒店

  1. #bool查询
  2. GET /hotel/_search
  3. {
  4. "query": {
  5. "bool": {
  6. "must": [
  7. {
  8. "match": {
  9. "FIELD": "TEXT"
  10. }
  11. }
  12. ],
  13. "must_not": [
  14. {
  15. "range": {
  16. "price": {
  17. "gte": 400
  18. }
  19. }
  20. }
  21. ],
  22. "filter": [
  23. {
  24. "geo_distance": {
  25. "distance": "10km",
  26. "location": {
  27. "lat": 31.21,
  28. "lon": 121.5
  29. }
  30. }
  31. }
  32. ]
  33. }
  34. }
  35. }
  36. 参与算分的越多那么性能就越差

image.png