ElasticSearch-Query DSL和bool组合查询和 filter结果过滤

复制代码
按条件查询  account_number根据order降序  和 balance 根据order 升序  排序  然后从第0条开始取  共5条数据

GET blank/_search { "query":{ "match_all":{} }, "sort":[ { "account_number":{ "order":"desc" }, "balance":{ "order":"asc" } } ], "from":0, "size":5 }
复制代码
复制代码
_source  查询出需要的属性名称
GET blank/_search { "query":{ "match_all":{} }, "sort":[ { "account_number":{ "order":"desc" }, "balance":{ "order":"asc" } } ], "from":0, "size":5, "_source": ["account_number","balance","firstname","lastname"] }
复制代码

提供了一个可以执行的JSON风格的DSL(domain-specific language 领域特定语言),这个被称为Query DSL,该查询语言非常全面

完整的语法结构

 

json
{
   QUERY_NAME:{
      ARGUMENT:VALUE,
      ARGUMENT:VALUE,...
   }
}
如果是针对某个字段,那么它的结构为
复制代码
json
{
    QUERY_NAME:{
        FIELD_NAME:{
            ARGUMENT:VALUE,
            ARGUMENT:VALUE,...
        }
    }
}
复制代码

 

 

match精准查询                   上面我们用到来的match_all是匹配所有的数据,而我们现在要讲的match是条件匹配

如果对应的字段是基本类型(非字符串类型),则是精确匹配。  匹配度越高  "_score" : 9.013574, 越大
GET blank/_search
{
  "query": {
    "match": {
      "account_number": 666
    }
  }
}
如果对应的字段是字符串类型,则是全文检索  匹配度越高 "_score" : 9.013574, 越大
match返回的就是address中包含mill字符串的记录  若是多个词 会进行分词  只要你有mill  或者 road  都会检索到 例如 "address":"mill road"
复制代码
json
GET blank/_search
{
  "query": {
    "match": {
      "address": "mill road"
    }
  }
}
复制代码

---------------------------------

复制代码
match_phrase
可以精确查找 字段长的话 也可以模糊查找   查询出address中包含 mill road的所有记录,并给出相关性得分
将需要匹配的值当成一个整体单词(不分词)进行检索,短语匹配  
json
GET blank/_search
{
   "query":{
       "match_phrase":{
          "address":"990 Mill Road"
      }
   }
}
 
复制代码

------------------------------------

复制代码
multi_match[多字段匹配]
query  根据那些字段检索
fields 根据那些属性检索 检索address和city 中包含mill和road 对应查询的值会分词操作

GET blank/_search
{
   "query":{
       "multi_match":{
          "query":"mill Movico",
          "fields":["address","city"]
      }
   }
}
查询出city或者address中包含 mill road的记录
复制代码

---------------------------------------------------

复制代码
bool[复合查询]
布尔查询又叫**组合查询**,bool用来实现复合查询
`bool`把各种其它查询通过 `must`(与)、`must_not`(非)、`should`(或)的方式进行组合
复合语句可以合并任何其他查询语句,包括复合语句也可以合并,了解这一点很重要,这意味着,复合语句之间可以相互嵌套,可以表达非常复杂的逻辑
must 必须匹配查询条件
must_not 没有包含的字段
GET /blank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}
复制代码

查询   must 必须有的条件 是age:40 gendeer:'M'   must_not不包含字段为account_number:948  should 可以有 如果有 分值更高

复制代码
GET /blank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" }},
         {"match": {"gender": "M"}}
      ],
      "must_not": [
        { "match": { "account_number": "948" } }
      ],
      "should": [
        {"match": {
          "state": "ak"
        }}
      ]
    }
  }
}
复制代码

 ----------------------------------------

filter[结果过滤]
并不是所有的查询都需要产生分数,特别是那些仅用于"filtering"的文档,为了不计算分数,ElasticSearch会自动检查场景并且优化查询的执行。
复制代码
GET /blank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

必须包含age 在10 到30 之间 过滤条件 是balance 在20000 到 30000之间
GET /blank/_search
{
  "query": {
    "bool": {
      "must": [
        {"range": {
          "age": {
            "gte": 10,
            "lte": 30
          }
        }}
        ],
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}
复制代码
复制代码
-----------------------------------------------

term 和match一样,匹配某个属性的值,全文检索字段用match,其他非text字段匹配用term

GET blank/_search
{
   "query":{
       "term":{
          "account_number":20
      }
   }
}

这里match 是分词查询 查询的属性是text 文本   只要有990 和Mill Road字段都会被查找出来
GET blank/_search
{
  "query": {"match": {
    "address": "990 Mill Road"
  }}
}



文本属性用match
如果不想分词 那么使用keyword 这里的效果和下面类似 是精确查找 以990 Mill Road 为关键字 这里的990 Mill Road 必须完全匹配
GET blank/_search
{
  "query": {"match": {
    "address.keyword": "990 Mill Road"
  }}
}

这里虽然可以模糊查询 也可以精确查询  但是 查询的关键字可以变化  对应的结果也会变化
GET blank/_search   
{
   "query":{
       "match_phrase":{
          "address":"990 Mill Road"
      }
   }
}


但是term 是单字段查询 以990为关键字 非text文本属性 查询 价格 id username 用term

GET blank/_search
{
  "query": {"term": {
    "address": "990"
  }}
}



| 检索关键字    | 描述                                       |
| ------------- | ------------------------------------------ |
| term          | 非text使用 不会进行分词                    |   查询 价格 id  username  用term
| match         | 在text中我们实现全文检索-分词              |  text field
| match keyword | 在属性字段后加.keyword 实现精确查询-不分词 |
| match_phrase  | 短语查询,不分词,模糊查询                 |


复制代码

 

posted @   花心大萝卜li  阅读(490)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示