关系数据库不适合的用例

  • 搜索的本质在于它的顺序。每个人都希望以最适合的结果显示在顶部的方式显示搜索结果。关系数据库没有这种能力。另一方面,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 查询返回结果。