Elasticsearch
관계형 데이터베이스와 탄성 검색의 차이점
수색…
소개
이것은 관계 배경에서 왔으며 탄성 검색을 배우려는 독자를위한 것입니다. 이 주제에서는 관계형 데이터베이스가 적합한 옵션이 아닌 유스 케이스를 보여줍니다.
용어 차이
| 관계형 데이터베이스 | 탄성 검색 |
|---|---|
| 데이터 베이스 | 색인 |
| 표 | 유형 |
| 행 / 레코드 | 문서 |
| 열 이름 | 들 |
위의 표는 관계형 데이터베이스의 기본 요소와 탄성 검색 사이의 비유를 대략적으로 보여줍니다.
설정
관계형 데이터베이스에서 다음 구조 고려 :
create databse test;
use test;
create table product;
create table product (name varchar, id int PRIMARY KEY);
insert into product (id,name) VALUES (1,'Shirt');
insert into product (id,name) VALUES (2,'Red Shirt');
select * from product;
name | id
----------+----
Shirt | 1
Red Shirt | 2
탄성 검색 :
POST test/product
{
"id" : 1,
"name" : "Shirt"
}
POST test/product
{
"id" : 2,
"name" : "Red Shirt"
}
GET test/product/_search
"hits": [
{ ==============
"_index": "test", ===> index |
"_type": "product", ===>type |
"_id": "AVzglFomaus3G2tXc6sB", |
"_score": 1, |
"_source": { |===> document
"id": 2, ===>field |
"name": "Red Shirt" ===>field |
} |
}, ==============
{
"_index": "test",
"_type": "product",
"_id": "AVzglD12aus3G2tXc6sA",
"_score": 1,
"_source": {
"id": 1,
"name": "Shirt"
}
}
]
관계형 데이터베이스가 적합하지 않은 용도
검색의 본질은 그 순서대로 놓여 있습니다. 누구나 가장 적합한 결과가 맨 위에 표시되는 방식으로 검색 결과를 표시하려고합니다. 관계형 데이터베이스에는 이러한 기능이 없습니다. 반면에 Elasticsearch는 기본적으로 관련성을 기준으로 결과를 보여줍니다.
설정
이전 예제에서 사용한 것과 동일합니다.
문제 설명
사용자가
shirts를 검색하려고하지만 그는red색 셔츠에 관심이 있다고 가정합니다. 이 경우red과shirts키워드가 포함 된 결과가 맨 앞에 와야합니다. 그 다음에 다른 셔츠에 대한 결과가 표시되어야합니다.관계형 데이터베이스 쿼리를 사용하는 솔루션
select * from product where name like '%Red%' or name like '%Shirt%'.산출
name | id -----------+---- Shirt | 1 Red Shirt | 2탄성 검색 솔루션
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순서로 결과를 반환합니다.
검색 문자열을 입력하는 동안 실수를하는 경향이 있습니다. 사용자가 잘못된 검색 매개 변수를 입력하는 경우가 있습니다. 관계형 데이터베이스는 이러한 경우를 처리하지 않습니다. 구조에 탄력적 인 검색.
설정
이전 예제에서 사용한 것과 동일합니다.
문제 설명
사용자가
shirts를 검색하려고하지만 실수로 잘못된 단어shrt를 입력한다고 가정합니다. 사용자는 여전히 셔츠의 결과를 볼 것으로 예상됩니다 .관계형 데이터베이스 쿼리를 사용하는 솔루션
select * from product where name like '%shrt%'.산출
No results found탄성 검색 솔루션
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쿼리를 사용하여 결과를 반환했습니다.