elasticsearch 학습노트(6)-빠른 입문 사례 실전의 전자상거래 사이트 상품 관리: 다양한 검색 방식

9731 단어 elasticsearch
ES의 다양한 검색 방식을 간단히 소개해 드리겠습니다.

1、query string search


형식:
GET /{index}/_search
GET /product/_search
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : "jiajieshi yagao",
          "desc" : "youxiao fangzhu",
          "price" : 25,
          "producer" : "jiajieshi producer",
          "tags" : [
            "fangzhu"
          ]
        }
      },
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "name" : "zhonghua yagao",
          "desc" : "caoben zhiwu",
          "price" : 40,
          "producer" : "zhonghua producer",
          "tags" : [
            "qingxin"
          ]
        }
      }
    ]
  }
}

검색 결과의 각 값의 의미를 간단히 살펴보자: took: 소모되는 시간 단위는 밀리초timed_out: 시간 초과 여부_shards: total은 때린primaryshard(또는 replicashard)의 개수를 가리키며,successful은 조회에 성공한 조각수를 가리키며,skipped는 건너뛴 조각수를 가리키며,failed는 조회에 실패한 조각의 개수hits를 가리킨다.total:value는 조회가 일치하는 총수를 대표하고,relation은 The count is accurate(e.g. "eq"means equals)를 대표합니다.hits.max_score: 일치하는 문서 중 관련도 점수가 가장 높은hits를 가리킨다.hits: 검색에 일치하는document의 상세한 데이터 포함
왜querystringsearch라고 하는지 주로 검색 매개 변수는 http가 요청하는querystring으로 첨부되어 있기 때문입니다. 예를 들어 검색 상품 이름에 yagao가 포함된 상품을 포함하고 판매 가격의 순서에 따라 배열됩니다.
GET /product/_search?q=name:yagao&sort=price:desc
{
  "took" : 36,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : null,
        "_source" : {
          "name" : "zhonghua yagao",
          "desc" : "caoben zhiwu",
          "price" : 40,
          "producer" : "zhonghua producer",
          "tags" : [
            "qingxin"
          ]
        },
        "sort" : [
          40
        ]
      },
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : null,
        "_source" : {
          "name" : "jiajieshi yagao",
          "desc" : "youxiao fangzhu",
          "price" : 25,
          "producer" : "jiajieshi producer",
          "tags" : [
            "fangzhu"
          ]
        },
        "sort" : [
          25
        ]
      }
    ]
  }
}

querystring search는 명령줄에 임시로 사용되는 도구, 예를 들어curl, 원하는 정보를 검색하기 위해 요청을 신속하게 보내는 데 사용됩니다.그러나 검색 요청이 복잡하면 검색 조건을 구축하기 어려워 생산 환경에서 거의 사용되지 않는다.

2、query DSL


DSL이란 무엇입니까?DSL: Domain Specified Language 특정 영역 언어가query DSL 조회를 사용할 때 조회하는 매개 변수는 요청체(http request body)를 사용하고 json 형식으로 조회 문법을 구축할 수 있으며 비교적 편리하고 각종 복잡한 문법을 구축할 수 있습니다.querystring 검색보다 훨씬 강력한 포맷이 될 것입니다.
GET /{index}/{type}/_search
{
    "json "
}

다음은 모두 실제적인 몇 가지 예이다. 모든 상품을 조회하는 것이다.
GET /product/_search
{
  "query": {
    "match_all": {}
  }
}

조회 이름에 yagao가 포함된 상품은 가격 인하 순서에 따라 정렬됩니다.
GET /product/_search
{
  "query": {
    "match": {
      "name": "yagao"
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

페이지별로 상품을 조회하면 총 3개의 상품이 한 페이지당 1개의 상품이 표시된다고 가정하고 현재 2페이지를 표시하기 때문에 두 번째 상품을 찾아낸다
GET /product/_search
{
  "query": {
    "match_all": {}
  },
  "from": 1, 
  "size": 1
}

검색할 상품을 지정하면 이름과 가격, 즉 맞춤형 반환 필드만 되돌려줍니다.
GET /product/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["name", "price"]
}

query DSL은 복잡한 쿼리를 구축할 수 있는 운영 환경에 더욱 적합합니다.

3、query filter


검색 상품 명칭은 야가오를 포함하고 판매 가격이 25위안 이상인 상품을 포함한다
GET /product/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "yagao"
          }
        }
      ],
      "filter": {
        "range": {
          "price": {
            "gt": 25
          }
        }
      }
    }
  }
}

4、full-text search

GET /product/_search
{
  "query": {
    "match": {
      "producer": "jiajieshi producer"
    }
  }
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.18232156,
    "hits" : [
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.18232156,
        "_source" : {
          "name" : "jiajieshi yagao",
          "desc" : "youxiao fangzhu",
          "price" : 25,
          "producer" : "jiajieshi producer",
          "tags" : [
            "fangzhu"
          ]
        }
      },
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.18232156,
        "_source" : {
          "name" : "zhonghua yagao",
          "desc" : "caoben zhiwu",
          "price" : 40,
          "producer" : "zhonghua producer",
          "tags" : [
            "qingxin"
          ]
        }
      }
    ]
  }
}

왜 Zhonghua producer라는 문서까지 검색되었습니까? 왜냐하면producer라는 필드가 데이터에 삽입되기 시작할 때 해체되고 역렬 인덱스 jiajieshi 1zhonghua 2producer 1, 2를 검색할 때 yagao producer로 분해됩니다.

5. phrase 검색 단어 검색


phrase search는 전체 텍스트 검색과 반대로 전체 텍스트 검색은 입력한 검색을 분리하여 색인을 거꾸로 배열하여 일일이 일치하게 합니다. 임의의 해체된 단어만 일치하면 결과로 되돌아갈 수 있습니다.그러나phrasesesearch가 입력해야 하는 검색 문자열은 지정한 필드 텍스트에 똑같은 것을 완전히 포함해야 일치하는 것으로 계산되어 결과로 되돌아갈 수 있습니다.
GET /product/_search
{
  "query": {
    "match_phrase": {
      "producer": "jiajieshi producer"
    }
  }
}
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.87546873,
    "hits" : [
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.87546873,
        "_source" : {
          "name" : "jiajieshi yagao",
          "desc" : "youxiao fangzhu",
          "price" : 25,
          "producer" : "jiajieshi producer",
          "tags" : [
            "fangzhu"
          ]
        }
      }
    ]
  }
}

6. 하이라이트 검색 하이라이트 검색

GET /product/_search
{
  "query": {
    "match_phrase": {
      "producer": "jiajieshi producer"
    }
  },
  "highlight": {
    "fields": {
      "producer":{}
    }
  }
}
{
  "took" : 23,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.87546873,
    "hits" : [
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.87546873,
        "_source" : {
          "name" : "jiajieshi yagao",
          "desc" : "youxiao fangzhu",
          "price" : 25,
          "producer" : "jiajieshi producer",
          "tags" : [
            "fangzhu"
          ]
        },
        "highlight" : {
          "producer" : [
            "jiajieshi producer"
          ]
        }
      }
    ]
  }
}

좋은 웹페이지 즐겨찾기