elasticsearch之查詢的兩種方式


前言

簡單的沒挑戰,來點復雜的,比如查看來自顧家的都有哪些人怎么查呢?elasticsearch提供兩種查詢方式:

  • 查詢字符串(query string),簡單查詢,就像是像傳遞URL參數一樣去傳遞查詢語句,被稱為簡單搜索或查詢字符串(query string)搜索。
  • 另外一種是通過DSL語句來進行查詢,被稱為DSL查詢(Query DSL),DSL是Elasticsearch提供的一種豐富且靈活的查詢語言,該語言以json請求體的形式出現,通過restful請求與Elasticsearch進行交互。

准備數據

PUT zhifou/doc/1
{
  "name":"顧老二",
  "age":30,
  "from": "gu",
  "desc": "皮膚黑、武器長、性格直",
  "tags": ["黑", "長", "直"]
}

PUT zhifou/doc/2
{
  "name":"大娘子",
  "age":18,
  "from":"sheng",
  "desc":"膚白貌美,嬌憨可愛",
  "tags":["白", "富","美"]
}

PUT zhifou/doc/3
{
  "name":"龍套偏房",
  "age":22,
  "from":"gu",
  "desc":"mmp,沒怎么看,不知道怎么形容",
  "tags":["造數據", "真","難"]
}


PUT zhifou/doc/4
{
  "name":"石頭",
  "age":29,
  "from":"gu",
  "desc":"粗中有細,狐假虎威",
  "tags":["粗", "大","猛"]
}

PUT zhifou/doc/5
{
  "name":"魏行首",
  "age":25,
  "from":"廣雲台",
  "desc":"仿佛兮若輕雲之蔽月,飄飄兮若流風之回雪,mmp,最后竟然沒有嫁給顧老二!",
  "tags":["閉月","羞花"]
}

查詢字符串

GET zhifou/doc/_search?q=from:gu

還是使用GET命令,通過_serarch查詢,查詢條件是什么呢?條件是from屬性是gu家的人都有哪些。最后,別忘了_searchfrom屬性中間的英文分隔符?

結果如下:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "zhifou",
        "_type" : "doc",
        "_id" : "4",
        "_score" : 0.6931472,
        "_source" : {
          "name" : "石頭",
          "age" : 29,
          "from" : "gu",
          "desc" : "粗中有細,狐假虎威",
          "tags" : [
            "粗",
            "大",
            "猛"
          ]
        }
      },
      {
        "_index" : "zhifou",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "顧老二",
          "age" : 30,
          "from" : "gu",
          "desc" : "皮膚黑、武器長、性格直",
          "tags" : [
            "黑",
            "長",
            "直"
          ]
        }
      },
      {
        "_index" : "zhifou",
        "_type" : "doc",
        "_id" : "3",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "龍套偏房",
          "age" : 22,
          "from" : "gu",
          "desc" : "mmp,沒怎么看,不知道怎么形容",
          "tags" : [
            "造數據",
            "真",
            "難"
          ]
        }
      }
    ]
  }
}

我們來重點說下hitshits是返回的結果集——所有from屬性為gu的結果集。重點中的重點是_score得分,得分是什么呢?根據算法算出跟查詢條件的匹配度,匹配度高得分就高。后面再說這個算法是怎么回事。

結構化查詢

我們現在使用DSL方式,來完成剛才的查詢,查看來自顧家的都有哪些人。

GET zhifou/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  }
}

上例,查詢條件是一步步構建出來的,將查詢條件添加到match中即可,而match則是查詢所有from字段的值中含有gu的結果就會返回。
當然結果沒啥變化:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "zhifou",
        "_type" : "doc",
        "_id" : "4",
        "_score" : 0.6931472,
        "_source" : {
          "name" : "石頭",
          "age" : 29,
          "from" : "gu",
          "desc" : "粗中有細,狐假虎威",
          "tags" : [
            "粗",
            "大",
            "猛"
          ]
        }
      },
      {
        "_index" : "zhifou",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "顧老二",
          "age" : 30,
          "from" : "gu",
          "desc" : "皮膚黑、武器長、性格直",
          "tags" : [
            "黑",
            "長",
            "直"
          ]
        }
      },
      {
        "_index" : "zhifou",
        "_type" : "doc",
        "_id" : "3",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "龍套偏房",
          "age" : 22,
          "from" : "gu",
          "desc" : "mmp,沒怎么看,不知道怎么形容",
          "tags" : [
            "造數據",
            "真",
            "難"
          ]
        }
      }
    ]
  }
}

see also:[Elasticsearch查詢規則(一)match和term](https://www.jianshu.com/p/eb30eee13923) that's all


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM