天天看點

Elasticsearch之search搜尋入門

1. 搜尋文法入門

1.1query string search

無條件搜尋所有

GET /book/_search
{
  "took" : 969,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "book",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "Bootstrap開發",
          "description" : "Bootstrap是由Twitter推出的一個前台頁面開發css架構,是一個非常流行的開發架構,此架構內建了多種頁面效果。此開發架構包含了大量的CSS、JS程式代碼,可以幫助開發者(尤其是不擅長css頁面開發的程式人員)輕松的實作一個css,不受浏覽器限制的精美界面css效果。",
          "studymodel" : "201002",
          "price" : 38.6,
          "timestamp" : "2019-08-25 19:11:35",
          "pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
          "tags" : [
            "bootstrap",
            "dev"
          ]
        }
      },
      {
        "_index" : "book",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : "java程式設計思想",
          "description" : "java語言是世界第一程式設計語言,在軟體開發領域使用人數最多。",
          "studymodel" : "201001",
          "price" : 68.6,
          "timestamp" : "2019-08-25 19:11:35",
          "pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
          "tags" : [
            "java",
            "dev"
          ]
        }
      },
      {
        "_index" : "book",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "name" : "spring開發基礎",
          "description" : "spring 在java領域非常流行,java程式員都在用。",
          "studymodel" : "201001",
          "price" : 88.6,
          "timestamp" : "2019-08-24 19:11:35",
          "pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
          "tags" : [
            "spring",
            "java"
          ]
        }
      }
    ]
  }
}
           

解釋

took:耗費了幾毫秒

timed_out:是否逾時,這裡是沒有

_shards:到幾個分片搜尋,成功幾個,跳過幾個,失敗幾個。

hits.total:查詢結果的數量,3個document

hits.max_score:score的含義,就是document對于一個search的相關度的比對分數,越相關,就越比對,分數也高

hits.hits:包含了比對搜尋的document的所有詳細資料

1.2傳參

與http請求傳參類似

GET /book/_search?q=name:java&sort=price:desc      

類比sql: select * from book where name like ’ %java%’ order by price desc

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "book",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : null,
        "_source" : {
          "name" : "java程式設計思想",
          "description" : "java語言是世界第一程式設計語言,在軟體開發領域使用人數最多。",
          "studymodel" : "201001",
          "price" : 68.6,
          "timestamp" : "2019-08-25 19:11:35",
          "pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
          "tags" : [
            "java",
            "dev"
          ]
        },
        "sort" : [
          68.6
        ]
      }
    ]
  }
}
           

1.3圖解timeout

GET /book/_search?timeout=10ms

全局設定:配置檔案中設定 search.default_search_timeout:100ms。預設不逾時。

2.multi-index 多索引搜尋

2.1multi-index搜尋模式

告訴你如何一次性搜尋多個index和多個type下的資料

/_search:所有索引下的所有資料都搜尋出來
/index1/_search:指定一個index,搜尋其下所有的資料
/index1,index2/_search:同時搜尋兩個index下的資料
/index*/_search:按照通配符去比對多個索引
           

應用場景:生産環境log索引可以按照日期分開。

log_to_es_20190910

log_to_es_20190911

log_to_es_20180910

2.2初步圖解一下簡單的搜尋原理

搜尋原理初步圖解

Elasticsearch之search搜尋入門

3. 分頁搜尋

3.1分頁搜尋的文法

sql: select * from book limit 1,5

和 SQL 使用

LIMIT

關鍵字傳回單個

page

結果的方法相同,Elasticsearch 接受

from

size

參數:

  • size

    顯示應該傳回的結果數量,預設是

    10

  • from

    顯示應該跳過的初始結果數量,預設是

顯示應該傳回的結果數量,預設是

10

顯示應該跳過的初始結果數量,預設是

如果每頁展示 5 條結果,可以用下面方式請求得到 1 到 3 頁的結果:

GET /book/_search?size=5
​
GET /book/_search?size=5&from=5
​
GET /book/_search?size=5&from=10
           

3.2deep paging

什麼是deep paging

根據相關度評分倒排序,是以分頁過深,協調節點會将大量資料聚合分析。

Elasticsearch之search搜尋入門

deep paging 性能問題

1消耗網絡帶寬,因為所搜過深的話,各 shard 要把資料傳遞給 coordinate node,這個過程是有大量資料傳遞的,消耗網絡。

2消耗記憶體,各 shard 要把資料傳送給 coordinate node,這個傳遞回來的資料,是被 coordinate node 儲存在記憶體中的,這樣會大量消耗記憶體。

3消耗cup,coordinate node 要把傳回來的資料進行排序,這個排序過程很消耗cpu。 是以:鑒于deep paging的性能問題,所有應盡量減少使用。

4. query string基礎文法

4.1query string基礎文法

GET /book/_search?q=name:java

GET /book/_search?q=+name:java

GET /book/_search?q=-name:java
           
+和-的含義:
    + 表示必須包含
    - 表示 不包含      

4.2、_all metadata的原理和作用

GET /book/_search?q=java      

直接可以搜尋所有的field,任意一個field包含指定的關鍵字就可以搜尋出來。我們在進行中搜尋的時候,難道是對document中的每一個field都進行一次搜尋嗎?不是的。

es中all中繼資料。建立索引的時候,插入一條document,es會将所有的field值經行全量分詞,把這些分詞,放到all field中。在搜尋的時候,沒有指定field,就在_all搜尋。

舉例

{
    name:jack
    email:[email protected]
    address:beijing
}      

_all : jack,[email protected],beijing

繼續閱讀