1. 程式人生 > 實用技巧 >elasticsearch之查詢的兩種方式

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" : [
            "造資料",
            "",
            ""
          ]
        }
      }
    ]
  }
}