關聯式資料庫不適合的用例

  • 搜尋的本質在於它的順序。每個人都希望以最適合的結果顯示在頂部的方式顯示搜尋結果。關聯式資料庫沒有這種能力。另一方面,Elasticsearch 在預設情況下基於相關性顯示結果。

    建立

    與前面示例中使用的相同。

    問題陳述

    假設使用者想要搜尋 shirts,但他對 red 彩色襯衫感興趣。在這種情況下,包含 redshirts 關鍵字的結果應該是最重要的。然後應該在他們之後顯示其他襯衫的結果。

    解決方案使用關聯式資料庫查詢

    select * from product where name like '%Red%' or name like '%Shirt%';

    輸出

    name       | id 
    -----------+----
    Shirt      |  1
    Red Shirt  |  2
    

    Elasticsearch 解決方案

    POST test/product/_search
    {
         "query": {
              "match": {
                "name": "Red Shirt"
             }
         }
    }
    

    輸出

    "hits": [
      {
         "_index": "test",
         "_type": "product",
         "_id": "AVzglFomaus3G2tXc6sB",
         "_score": 1.2422675,              ===> Notice this
         "_source": {
            "id": 2,
            "name": "Red Shirt"
         }
      },
      {
         "_index": "test",
         "_type": "product",
         "_id": "AVzglD12aus3G2tXc6sA",
         "_score": 0.25427115,             ===> Notice this
         "_source": {
            "id": 1,
            "name": "Shirt"
         }
      }
     ]
    

    結論

    正如我們在上面所看到的,Relational Database 以一些隨機順序返回結果,而 Elasticsearch 以 _score 的遞減順序返回結果,這是根據相關性計算的。

  • 我們在輸入搜尋字串時往往會犯錯誤。有些使用者輸入了錯誤的搜尋引數。關聯式資料庫不會處理這種情況。Elasticsearch 來救援。

    建立

    與前面示例中使用的相同。

    問題陳述

    假設使用者想要搜尋 shirts 但是他錯誤地輸入了錯誤的單詞 shrt。使用者仍然希望看到襯衫的結果

    解決方案使用關聯式資料庫查詢

    select * from product where name like '%shrt%';

    輸出

    No results found
    

    Elasticsearch 解決方案

    POST /test/product/_search
    
     {
        "query": {
          "match": {
            "name": {
              "query": "shrt",
              "fuzziness": 2,
              "prefix_length": 0
             }
          }
        }
     }  
    

    輸出

     "hits": [
      {
         "_index": "test",
         "_type": "product",
         "_id": "AVzglD12aus3G2tXc6sA",
         "_score": 1,
         "_source": {
            "id": 1,
            "name": "Shirt"
         }
      },
      {
         "_index": "test",
         "_type": "product",
         "_id": "AVzglFomaus3G2tXc6sB",
         "_score": 0.8784157,
         "_source": {
            "id": 2,
            "name": "Red Shirt"
         }
      }
    ]
    

    結論

    正如我們在上面所看到的,關聯式資料庫沒有返回搜尋到錯誤單詞的結果,而 Elasticsearch 使用其特殊的 fuzzy 查詢返回結果。