11.DSL查询分类

发布于:2025-06-23 ⋅ 阅读:(19) ⋅ 点赞:(0)

1.查询所有

比如match_all,一般测试使用。

2.全文检索

利用分词器对用户输入的内容分词,然后去倒排索引库中去匹配。匹配上了就获得了文档id,根据文档id就拿到文档内容。所以查询的是能分词的字段如text类型。
match 

multi_match:等价于copy_to多个字段的值到一个字段all,如上查询。使用copy_to效率更高。

查询的字段越多,查询性能越差。

{
  "query": {
    "multi_match": {
      "query": "万安镇正熙",
      "fields": [
        "brand",
        "name",
        "business",
        "city",
        "starName"
      ]
    }
  }
}

3.精确查询

根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等不分词的类型字段。

这些数据类型是不需要做分词的,它们也会去建立倒排索引,就是把它们的内容整体作为一个词条存入到倒排索引。所以用户输入的内容也不需要做分词,直接去跟倒排索引库中匹配。

ids, 根据id精确匹配

range, 根据值的范围查询

term,根据词条精确值查询(用户输入的内容与文档中字段存储的内容完全一致才可以)

应用场景:

搜索酒店,城市、星级、品牌 应该使用term;价格过滤应该使用range范围查询;

4.地理查询

根据经纬度进行查询

geo_distance: 查询到指定中心点小于某个距离值的所有文档。

geo_bouding_box:geo_point点值落在某个矩形范围内的所有文档。

应用场景:

1.地图上搜索附近的酒店。

2.打车搜索附近的车辆。

3.微信搜索附近的人。

5.复合查询

可以将上述各种查询条件组合起来,合并查询条件。

bool 布尔查询

是一个或多个查询子句的组合。

组合方式有:

must: 必须匹配每个子查询。== and

should: 选择性匹配子查询。== or

must_not: 必须不匹配,不参与算分(效率更高),== 非,取反

filter: 必须匹配,不参与算分(效率更高)

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city": "成都"
          }
        }
      ],
      "should": [
        {
          "term": {
            "brand": "yy"
          }
        },
        {
          "term": {
            "brand": "xx"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "price": {
              "gte": 300
            }
          }
        }
      ],
      "filter": [
        {
          "range": {
            "score": {
              "gt": 4
            }
          }
        }
      ]
    }
  }
}

 

 这里说明一下:should条件中没有一个满足都没关系也会返回数据,而其它必须满足的条件就必须匹配才会返回数据。

当前查询结果 完全正确,系统返回了唯一满足所有强制条件的文档(id=2),低分是因为未命中可选条件(should)。如果命中可选条件,评分才会高。

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city": "成都"
          }
        }
      ],
      "should": [
        {
          "term": {
            "brand": "正熙"
          }
        },
        {
          "term": {
            "brand": "xx"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "price": {
              "gte": 300
            }
          }
        }
      ],
      "filter": [
        {
          "range": {
            "score": {
              "gt": 4
            }
          }
        }
      ]
    }
  }
}

查询在成都、价格不超过500、15公里以内的所有酒店的复合查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city": "成都"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "price": {
              "gte": 500
            }
          }
        }
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "15km",
            "location": {
              "lat": "31.21",
              "lon": "121.472"
            }
          }
        }
      ]
    }
  }
}

function_score

在搜索文档的时候,会控制相关度算分,控制文档排名,例如:百度竞价

应用场景:比如给了钱的,就让它的算分高些,排名靠前。

 


网站公告

今日签到

点亮在社区的每一天
去签到