12.7 DSL查询语法

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(三十一)- 微服务(11)插图

查询的基本语法

  
  GET /indexName/_search
  {
      "query": {
          "查询类型": {
              "查询条件": "条件值"
          }
      }
  }

查询所有

  
  GET /hotel/_search
  {
    "query": {
      "match_all": {}
    }
  }
12.7.1 全文检索查询

全文检索查询,会对用户搜索内容进行分词,常用于搜索框搜索

match查询,全文检索查询的一种,会对用户输入内容进行分词,然后去倒排索引库检索

  
  # match查询
  GET /hotel/_search
  {
    "query": {
      "match": {
        "all": "外滩如家"
      }
    }
  }

multi_match: 允许同时查询多个字段,查询字段越多,性能越差

  
  # multi_match查询
  GET /hotel/_search
  {
    "query": {
      "multi_match": {
        "query": "外滩如家",
        "fields": ["brand","name","business"]
      }
    }
  }
12.7.2 精确查询

一般是查找keyword 数值,日期,boolean类型,你不会对搜索条件分词

term: 根据词条精确查询

  
  # 精确查询
  GET /hotel/_search
  {
    "query": {
      "term": {
        "city": {
          "value": "上海"
        }
      }
    }
  }

range: 根据值的范围查询:

  
  # 范围查询
  GET /hotel/_search
  {
    "query": {
      "range": {
        "price": {
          "gte": 100,
          "lte": 300
        }
      }
    }
  }

12.7.3 地理查询

geo_bounding_box查询 查询的是给定的两点形成的矩形区域内满足要求的文档

geo_distance 查询的是到指定中心点小于某个距离的文档值

  
  # 地理查询geo_distance
  GET /hotel/_search
  {
    "query": {
      "geo_distance": {
        "distance": "15km",
        "location": "31.21 , 121.5"
      }
    }
  }
12.7.4 复合查询
12.7.4.1 Function Score 查询

function score : 相关性算分查询,控制文档排名

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(三十一)- 微服务(11)插图(1)

例 : 给如家品牌的酒店排名考前一点

  
  GET /hotel/_search
  {
    "query": {
      "function_score": {
        "query": {
          "match": {
            "all": "外滩"
          }
        },
        "functions": [
          {
            "filter": {
              "term": {
                "brand": "如家"
              }
            },
            "weight": 10
          }
        ],
        "boost_mode": "sum" 
      }
    }
  }

12.7.4.2 Boolean查询

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

must : 必须匹配每个子选项 类似”与“

should : 选择性匹配 类似”或“

must_not: 必须不匹配 ,不参与算分 类似”非“

filter: 必须匹配, 不参与算分

例1:查询上海的皇冠假日或华美达酒店并且价格在500以上,并且得分不低于45分

  
  GET /hotel/_search
  {
    "query": {
      "bool": {
        
        "must": [
          {"term": {"city": "上海"}}
        ],
        
        "should": [
          {"term": {"brand": "皇冠假日"}},
          {"term": {"brand": "华美达"}}
        ],
        
         "must_not": [
          {"range": {"price": {"lte": 500} }}
        ],
        
        "filter": [
          {"range": {"score": {"gte": 45}}}
        ]
        
      }
    }
  }

例2: 查询名字包含如家 价格不高于400 坐标在31.21,121.5周围10km的酒店

  
  GET /hotel/_search
  {
    "query": {
      "bool": {
        
        "must": [
          {
            "match": {
              "brand": "如家"
            }
          }
        ],
        
        "must_not": [
          {
            "range": {"price": {"gt": 400}}
          }
        ],
        
        "filter": [
          {
            "geo_distance": {
              "distance": "10km",
              "location": {"lat": 31.21,"lon": 121.5}
            }
          }
        ]
        
      }
    }
  }
12.7.5 搜索结果处理
12.7.5.1 排序

默认根据先关度算分来排序,可以自定义: keyword类型,数值类型,地理坐标类型,日期类型

普通字段:

  
  ​
  GET /hotel/_search
  {
    "query": {
      "match_all": {}
    },
    
    "sort": [
      {
        "FIELD": "desc"  
      }
    ]
  }

地理位置距离排序:

  
  GET /hotel/_search
  {
      "query":{
          "match_all": {}
      },
    
      "sort": [
          {
              "geo_distance": {
              "FIELD": "经度,纬度",
              "order": "asc",
              "unit": "km"
              }
          }
      ]
  }

例1: 按用户评价排序酒店,评价相同的按价格排序

  
  GET /hotel/_search
  {
    "query": {
      "match_all": {}
    },
    
    "sort": [
      {
        "score": "desc"
      },
      
      {
        "price": "asc"
      }
      
    ]
  }

例2: 实现对酒店数据按自己的位置距离进行升序排序

  
  ​
  GET /hotel/_search
  {
    "query": {
      "match_all": {}
    },
    
    "sort": [
      {
        "_geo_distance": {
          "location": {
            "lat": 31.034661,
            "lon": 121.612282
          },
          "order": "asc",
          "unit": "km"
        }
      }
    ]
  }
12.7.5.2 分页
  
  # 分页查询
  GET /hotel/_search
  {
    "query": {
      "match_all": {}
    },
    
    "sort": [
      {
        "price": "asc"
      }
    ],
    
    "from": 10,      // 从第几条开始
    "size": 10        // 每页多少条     from+size不能超过10000
  }

12.7.5.3 高亮
  
  # 高亮查询  默认情况下  ES搜索字段必须与高亮字段一致
  GET /hotel/_search
  {
    "query": {
      "match": {
        "all": "如家"
      }
    },
    
    "highlight": {
      "fields": {
        "name": {
          "require_field_match": "false",     // 取消默认  改为不用与搜索字段一致
           "pre_tags": "",
            "post_tags": ""
        }
      }
    }
  }
本站无任何商业行为
个人在线分享 » 山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(三十一)- 微服务(11)
E-->