ES之DSL查询文档基础查询

分类

query查询分类

总体规律就是逻辑性的,从外层的你干嘛,到下一层的查询类型,再到下一层的查询字段(如果需要的话)和然后是查询内容

查询所有

语法

get /索引库名/_serarch
{
	"query":{
		"查询条件":{//如果是查询所有match_all,不需要条件,否则以下不能为空
		}
	}
}

查询所有案例

// 查询所有
GET /indexName/_search
{
  "query": {
    "match_all": {
    }
  }
}
全文检索查询

match查询

GET /indexName/_search
{
  "query": {
    "match": {
      "FIELD(字段)": "TEXT(查询内容)"
    }
  }
}

查询多个字段的multi_match

GET /indexName/_search
{
  "query": {
    "multi_match": {//查询多个
      "query": "TEXT",
      "fields": ["FIELD1", " FIELD12"]
    }
  }
}
精确查询

查询keyword,数值,日期等类型字段(精确值),不会对搜索条件进行分词

term:词条

// term查询
GET /indexName/_search
{
  "query": {
    "term": {
      "FIELD": {
        "value(这是固定的)": "VALUE(这是你要搜的词条)"
      }
    }
  }
}

range:范围

gt是大于(不等于),gte是大于等于(lte同理)

// range查询
GET /indexName/_search
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
地理查询

根据经纬度查询(地理上进行查询附近的酒店/出租车)

geo_bounding_box经纬度范围查询

// geo_bounding_box查询
GET /indexName/_search
{
  "query": {
    "geo_bounding_box": {
      "FIELD": {
        "top_left": {
          "lat": 31.1,
          "lon": 121.5
        },
        "bottom_right": {
          "lat": 30.9,
          "lon": 121.7
        }
      }
    }
  }
}

geo_distance查询到指定中心点的举例小于某个距离值的所有位置

// geo_distance 查询
GET /indexName/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km",
      "FIELD": "31.21,121.5"
    }
  }
}
复合查询

将简单的查询组合起来,实现复杂的搜索逻辑

fuction score:算分函数查询,打分机制

tf算法

TF(词条频率) = 词条出现次数/文档中词条总数

TF-IDF算法

IDF(逆文档频率) = Log(文档总数/包含词条的文档总数)
score = ∑_i^n▒TF(词条频率) ∗ IDF(逆文档频率)

BM25算法

Score(Q,d) = ∑_i^n▒log(1+ N −n+0.5/n+0.5)∙  f_i /f_i+ k_1  ∙ (1 −b+  b ∙ dl/avgdl)

image-20230305102346922

复合查询案例

GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": { "match": {"all": "外滩"} },//原始查询条件,搜索文档并根据相关性打分(query score
      "functions": [
        {
          "filter": {"term": {"id": "1"}},//过滤条件,符合条件的文档才会被重新算分
          "weight": 10
            /*
           算分函数,算分函数的结果称为function score ,将来会与query score运算,得到新算分,常见的算分函数有:
            weight:给一个常量值,作为函数结果(function score)
            field_value_factor:用文档中的某个字段值作为函数结果
            random_score:随机生成一个值,作为函数结果
            script_score:自定义计算公式,公式结果作为函数结果
            */
        }
      ],
      "boost_mode": "multiply"
        /*
            加权模式,定义function score与query score的运算方式,包括:
            multiply:两者相乘。默认就是这个
            replace:用function score 替换 query score
            其它:sum、avg、max、min
        */
    }
  }
}
案例:给如家增加权重
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {// 某查询条件 },
      "functions": [ // 算分函数
        {
          "filter": { // 满足的条件,品牌必须是如家
            "term": {
              "brand": "如家"
            }
          },
          "weight": 2 // 算分权重为2
        }
      ],
      "boost_mode": "sum"
    }
  }
}

function score query定义的三要素是什么?

  • 过滤条件:哪些文档要加分

  • 算分函数:如何计算function score

  • 加权方式:function score 与 query score如何运算

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值