elasticsearch 7.x 中的DSL查詢

query_string , default_field指定搜索字段,在不指定字段的狀況下默認搜索 _all 字段,_all綜合了全部的內容,同時query 不僅是搜索一個關鍵詞他包含了Lucene中的語法,容許使用and or 或(-)號排除某文檔api

GET fanya_statistics/_search
{
  "query": {
    "query_string": {
      "query": "國際經濟與貿易",
      "default_field": "zy"
    }
  }
}

term查詢與term過濾,term查詢實際上是對應Lucene中TermQuery,是沒有通過詞條分析的精確匹配查詢jvm

GET fanya_statistics/_search
{
  "query": {
    "term": {"mz.keyword": "藏族"}
  }
}

terms查詢與term相似,terms指的是能夠匹配某文檔字段中的多個詞條,minimum_should_match 限制文檔必須匹配的詞條數量oop

GET fanya_statistics/_search
{
    "query":{
      "terms":{
        "tags":["jvm", "hadoop"],
        "minimum_should_match":2
      }
    }
}

match查詢, 默認狀況下使用布爾行爲和OR操做符,如咱們要搜索文本「ElasticSearch Denver」時,實際上是搜索包含ElasticSearch或包含Denver的文檔,若是想變成搜索「ElasticSearch Denver」須要設置operator:and性能

GET fanya_statistics_fanyajw_zs/_search
{
  "query":{
    "match":{
      "nj":{
        "query":"ElasticSearch Denver",
        "operator":"and"
      }
    }
  }
}

match查詢指定詞條間隔,假如咱們只記得名稱中的兩個詞還不是挨着的,此時可使用match查詢的詞組查詢行爲,指定type:phrase 和 slop詞條之間的間距(容許詞條之間有間隔數值類型)測試

GET fanya_statistics_fanyajw_zs/_search
{
  "query":{
    "match":{
      "nj":{
        "type": "phrase", 
        "slop":1,
        "query":"ElasticSearch Denver"
      }
    }
  }
}

在6.x已經不支持在math裏面使用type,改成match_phraseui

GET fanya_statistics_fanyajw_zs/_search
{
  "query":{
    "match_phrase":{
      "nj":{
        "slop":1,
        "query":"ElasticSearch Denver"
      }
    }
  }
}

match查詢,前綴匹配phrase_prefix類型code

GET fanya_statistics_fanyajw_zs/_search
{
  "query":{
    "match":{
      "nj":{
        "type": "phrase_prefix", 
        "Max_expansions":1,
        "query":"ElasticSearch Denver"
      }
    }
  }
}

在6.x後的寫法hadoop

GET fanya_statistics_fanyajw_zs/_search
{
  "query":{
    "match_phrase_prefix":{
      "uuid":{
        "query":"ElasticSearch",
        "max_expansions": 10
      }
    }
  }
}

multi_match查詢,與terms比較相似terms是在一個字段中匹配多個詞,multi_match是指定搜索詞條在多個字段中匹配文檔

GET fanya_statistics_fanyajw_zs/_search
{
  "query":{
    "multi_match":{
      "query":"2019",
      "fields": ["nj","cc"]
    }
  }
}

bool查詢是指組合查詢或複合查詢,如咱們查詢指定學校必須包含2019級數據,同時應該包含2018級數據(沒有也無所謂),層次不能包含專升本的string

must 返回結果必須有的數據,只有匹配上才能返回數據,相似於AND,query1 AND query2

should 返回結果應該有的數據,若是沒有找到就不返回,相似於OR,query1 OR query2

must_not 返回結果中不該該存在的數據,相似於NOT,query1 AND NOT  query2

假如must域should同時存在,若是must條件不知足的話,即便知足should條件,也不會返回數據由於不知足must條件

GET /fanya_statistics_fanyajw_zs/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": { "type": 1 }},
        {"term": { "sflq": 1 }},
        {"term": { "schoolId": 23398 }},
        {"term": { "nj": "2019級" }}
      ],
      "should": [
        {"term": { "type": 1 }},
        {"term": { "sflq": 1 }},
        {"term": { "schoolId": 23398 }},
        {"term": { "nj": "2018級" }}
      ],
      "must_not": [
        {"term": { "cc": "專升本"}}
      ]
    }
  }
}

range查詢,範圍查詢,如查詢添加時間9-18~10-18之間的數據

gt大於,gte大於等於

lt小於,lte小於等於

GET /fanya_statistics_fanyajw_zs/_search
{
  "query": {
    "range": {
      "tjsj": {
        "gte": 1537200000000, // 2018/9/18 0:0:0
        "lte": 1539792000000  // 2018/10/18 0:0:0
      }
    }
  }
}

prefix查詢,前綴搜索

GET fanya_statistics_fanyajw_zs/_search
{
    "query":{
      "prefix": {"nj": "2019" }
    }
}

wildcard查詢,通配符查詢,須要注意的是通配符查詢的性能問題,須要仔細測試

*能夠表明任意數量的任意字符

?表明一個任意字符

GET fanya_statistics_fanyajw_zs/_search
{
  "query": {
    "wildcard": {"hsz": "北京*大學*"}
  }
}

exists過濾器,須要注意的是高版本es filter的寫法改成在bool中指定filter了,並移除了missing的api,能夠在 bool must not 中指定exists表明不存在

GET fanya_statistics_fanyajw_zs/_search
{
  "query": {
    "bool": {
      "must": [
        {"match_all": {}}
      ],
      "filter": {
        "exists": {
          "field": "nj"
        }
      }
    }
  }
}
相關文章
相關標籤/搜索