Elasticsearch----Query DSL

基本語(yǔ)法

{
    QUERY_NAME:{
        ARGUMENT:VALUE,
        ARGUMENT:VALUE,
        ...
    }
}
{
    QUERY_NAME:{
        FIELD_NAME:{
            ARGUMENT:VALUE,
            ARGUMENT:VALUE,
            ...
        }
    }
}

示例

GET /_search    //查詢所有的,默認(rèn)只會(huì)顯示10條document
{
  "query":{
    "match_all": {}
  }
}

GET /test_index/test_type/_search    //查詢字段“test_field”,包含“test”
{
  "query": {
    "match": {
      "test_field": "test"
    }
  }
}

組合搜索多個(gè)條件

//模擬數(shù)據(jù)
PUT /website/article/1
{
  "title":"my elasticsearch article",
  "content":"es is very good",
  "author_id":110
}
PUT /website/article/2
{
  "title":"my hadoop article",
  "content":"hadoop is very bad",
  "author_id":111
}
PUT /website/article/3
{
  "title":"my elasticsearch article",
  "content":"es is very bad",
  "author_id":112
}
//查詢 title必須包含elasticsearch,content可以不包含elasticsearch,author_id必須不為110
GET /website/article/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "elasticsearch"
          }
        }
      ],
      "should": [
        {
         "match": {
           "content":"elasticsearch"
         }
        }
      ],
      "must_not": [
        {
          "match": {
            "author_id": 110
          }
        }
      ]
    }
  }
}
//查詢title,content包含elasticsearch
GET /website/article/_search
{
  "query": {
    "multi_match": {
      "query": "elasticsearch",
      "fields": ["title","content"]
    }
  }
}
//查詢title,content必須包含elasticsearch,并且author_id必須不為110的
GET /website/article/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "elasticsearch",
            "fields": ["title","content"]
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "author_id": 110
          }
        }
      ]
    }
  }
}

定位不合法的搜索以及原因

//以這樣的語(yǔ)法,來(lái)判斷一個(gè)查詢json串是否合法
GET /test_index/test_type/_validate/query?explain
{
  "query":{
    "math":{
      "test_field":"test"
    }
  }
}
//出錯(cuò)返回值
{
  "valid": false,
  "error": "org.elasticsearch.common.ParsingException: no [query] registered for [math]"
}
//正確返回值
{
  "valid": true,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "explanations": [
    {
      "index": "test_index",
      "valid": true,
      "explanation": "+test_field:test #(#_type:test_type)"
    }
  ]
}

filter與query的對(duì)比

//模擬數(shù)據(jù)
PUT /company/employee/1
{
  "address":{
    "country":"china",
    "provice":"beijing",
    "city":"beijing"
  },
  "name":"jack",
  "age":28,
  "join_date":"2017-01-01"
}
PUT /company/employee/2
{
  "address":{
    "country":"china",
    "provice":"jiangsu",
    "city":"nanjing"
  },
  "name":"tom",
  "age":30,
  "join_date":"2016-01-01"
}
PUT /company/employee/3
{
  "address":{
    "country":"china",
    "provice":"shanxi",
    "city":"xian"
  },
  "name":"marry",
  "age":35,
  "join_date":"2015-01-01"
}
//查詢年齡大于等于30,同時(shí)join_date必須是2016-01-01
GET /company/employee/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "join_date": "2016-01-01"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 30
          }
        }
      }
    }
  }
}

filter與query的對(duì)比

  • filter,僅僅只是按照搜索條件過(guò)濾出需要的數(shù)據(jù)而已,不計(jì)算任何相關(guān)度分?jǐn)?shù),對(duì)相關(guān)度沒(méi)有任何影響
  • query,會(huì)去計(jì)算每個(gè)document相對(duì)于搜索條件的相關(guān)度,并按照相關(guān)度進(jìn)行排序
  • 一般來(lái)說(shuō),如果是在進(jìn)行搜素,需要將最匹配搜索條件的數(shù)據(jù)先返回,那么用query;如果只是要根據(jù)一些條件篩選出一部分?jǐn)?shù)據(jù),不關(guān)注其排序,那么用filter
  • 如果你希望越符合這些搜索條件的document越排在前面返回,那么這些搜索條件就要放在query中;如果不希望一些搜索條件來(lái)影響你的document排序,那么就放在filter中即可
  • filter不需要計(jì)算相關(guān)度分?jǐn)?shù),不需要按照相關(guān)度分?jǐn)?shù)進(jìn)行排序,同時(shí)還有內(nèi)置的自動(dòng)cache最常使用filter的數(shù)據(jù);query則相反,要計(jì)算相關(guān)度分?jǐn)?shù),還需要按照分?jǐn)?shù)排序,而且無(wú)法cache結(jié)果。所以,filter的速度會(huì)更快些
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,915評(píng)論 18 139
  • 教你如何迅速秒殺掉:99%的海量數(shù)據(jù)處理面試題 本文經(jīng)過(guò)大量細(xì)致的優(yōu)化后,收錄于我的新書(shū)《編程之法》第六章中,新書(shū)...
    Helen_Cat閱讀 7,455評(píng)論 1 39
  • 歡迎訪問(wèn)我的博客查看原文:http://wangnan.tech 注:文本整理自《ELKstack權(quán)威指南》 目錄...
    GhostStories閱讀 10,505評(píng)論 0 7
  • Solr&ElasticSearch原理及應(yīng)用 一、綜述 搜索 http://baike.baidu.com/it...
    樓外樓V閱讀 7,339評(píng)論 1 17
  • 狀態(tài)碼用來(lái)告訴HTTP客戶端,HTTP服務(wù)器是否產(chǎn)生了預(yù)期的Response. HTTP/1.1中定義了5類(lèi)狀態(tài)碼...
    Jackson_Z閱讀 300評(píng)論 0 0