elasticsearch精准查询-queryDSL

238 阅读1分钟

这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

之前有又一篇文章介绍过elasticsearch,当时之所以使用elasticsearch是因为想做一个词云分析相关的操作。正正好elasticsearch支持词云分析的功能,所以做了相关的一些操作。空闲时期又来学习了一下elasticsearch的查询功能文档传送门

查询

elasticsearch 查询分为querydsl,aggregation,urlquery。接下来一个一个细细的说明一下 本文主要介绍 queryDSL查询

queryDSL

首先包含的搜索的参数有:

_source: 可选字段返回想要的字段
script_fileds: 对一些字段进行加工处理
from:从第几个开始
size:数据量
sort:排序
query:查询条件

这里面说说query分为term, match,bool组合查询。 terms, range, exists等等。这里只说比较常用的。

{
    "_source": ["message"],
    "script_fields": {
    "qt": {
      "script": {
        // 一种脚本语言
        "lang": "painless",
        "source": "doc['querytime'].value + 1"}
    },
    // 范围
  "from": 0,
  "size": 10,
  // 排序
  "sort": [{ "querytime": "desc" }]
   
}

Trem查询,不做分词处理,可用keyword精确匹配

{
  // 条件
  "query": {
    "term": {
      // 对输入内容不会进行任何分词处理,而数据本身的默认分词为[slow][query]
      "message": {
        "value": "slow"
      }
    }
  },
}

可以通过 keyword 进行严格匹配查询


{
  "query": {
    "term": {
      "message.keyword": { "value": "Slow query" }
    }
  }
}

Match- 全文查询,会对查询条件进行分词

{
  "query": {
    "match": {
      "message": {
        "query": "Slow query",
        "query": "query Slow",
        "operator": "AND"
      }
    }
  }
}

range, exists, terms查询

{
  "query": {
    "range": {
      "day": {
        "gt": "2022-01-25",
        "le": "2022-01-25",
      }
    }
  }
}

{
  "exists": { "field": "time" }
}

{
  "terms": ['11111', '2222']
}

bool查询

# should 选择匹配
# must 必须匹配
# filter 必须匹配,不贡献算分
# must_not 必须不匹配,不贡献算分
{
  "query": {
    "bool": {
      "must": [],
      "filter": {},
      "must_not": {},
      "should": []
    }
  }
}