수색…


소개

이것은 관계 배경에서 왔으며 탄성 검색을 배우려는 독자를위한 것입니다. 이 주제에서는 관계형 데이터베이스가 적합한 옵션이 아닌 유스 케이스를 보여줍니다.

용어 차이

관계형 데이터베이스 탄성 검색
데이터 베이스 색인
유형
행 / 레코드 문서
열 이름

위의 표는 관계형 데이터베이스의 기본 요소와 탄성 검색 사이의 비유를 대략적으로 보여줍니다.

설정

관계형 데이터베이스에서 다음 구조 고려 :

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 색 셔츠에 관심이 있다고 가정합니다. 이 경우 redshirts 키워드가 포함 된 결과가 맨 앞에 와야합니다. 그 다음에 다른 셔츠에 대한 결과가 표시되어야합니다.

    관계형 데이터베이스 쿼리를 사용하는 솔루션

    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 쿼리를 사용하여 결과를 반환했습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow