关系数据库不适合的用例
-
搜索的本质在于它的顺序。每个人都希望以最适合的结果显示在顶部的方式显示搜索结果。关系数据库没有这种能力。另一方面,Elasticsearch 在默认情况下基于相关性显示结果。
建立
与前面示例中使用的相同。
问题陈述
假设用户想要搜索
shirts
,但他对red
彩色衬衫感兴趣。在这种情况下,包含red
和shirts
关键字的结果应该是最重要的。然后应该在他们之后显示其他衬衫的结果。解决方案使用关系数据库查询
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
查询返回结果。