Elasticsearch Fuzziness에 대해서 알아보기

Match Query를 공부 중 Fuzziness 개념을 알게 되었습니다.

일부쿼리 및 API는 fuzziness 파라미터를 사용하여 정확하지 않은 퍼지매칭을 허용합니다.

text혹은 keyword쿼리시 fuzziness는 Levenshtein distance로 해석됩니다. Levenshtein distance 단어, 혹은 문장과 같은 string 간의 형태적 유사성을 정의하는 방법입니다. 하지만 한글처럼 각글자가 초/중/종성으로 이루어진 언어를 고려한 방법이 아니라고 합니다. 참고하세요

fuzziness의 허용되는 최대 거리 Levenshtein Edit Distance (또는 편집 횟수)는 0,1,2 입니다.

AUTO 는 용어의 길이에 따라 편집거리를 생성합니다.

Fuzziness 를 사용한 검색은 더 공부해봐야 겠지만 보통 AUTO만으로도 충분한 기대치를 얻을 수 있는 것 같습니다.

example1

AUTO를 테스트해봅니다.

curl "localhost:9200/sales-records/_search?pretty" -H "Content-Type:application/json" -d '
{
  "query": {
    "match": {
      "message": {
        "query":"cloth",
        "fuzziness":"AUTO"
      }
    }
  },
  "size": 2
}'

AUTO 로 하니 결과가 나오질 않았네요

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 0,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  }
}

example2

cloth 만 입력후 fuzziness를 2로 입력하니 clothes에 대한 결과물을 받아왔습니다.

curl "localhost:9200/sales-records/_search?pretty" -H "Content-Type:application/json" -d '
{
  "query": {
    "match": {
      "message": {
        "query":"cloth",
        "fuzziness":"2"
      }
    }
  },
  "size": 2
}'
{
  "took": 13,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 10000,
      "relation": "gte"
    },
    "max_score": 2.6643744,
    "hits": [
      {
        "_index": "sales-records",
        "_type": "_doc",
        "_id": "Nn9aY2oBml718jk9tMLH",
        "_score": 2.6643744,
        "_source": {
          "total_profit": 566589.6,
          "sales_channel": "Offline",
          "order_id": 800003659,
          "units_sold": 7715,
          "tags": ["_dateparsefailure"],
          "total_revenue": 843095.2,
          "unit_cost": 35.84,
          "country": "Cote d'Ivoire",
          "order_priority": "C",
          "ship_date": "4/6/2016",
          "unit_price": 109.28,
          "total_cost": 276505.6,
          "item_type": "Clothes",
          "region": "Sub-Saharan Africa",
          "@version": "1",
          "host": "c5ceb9b17956",
          "order_date": "2/19/2016",
          "path": "/config-dir/1500000 Sales Records.csv",
          "message": "Sub-Saharan Africa,Cote d'Ivoire,Clothes,Offline,C,2/19/2016,800003659,4/6/2016,7715,109.28,35.84,843095.20,276505.60,566589.60\r",
          "@timestamp": "2016-06-04T00:00:00.000Z"
        }
      },
      {
        "_index": "sales-records",
        "_type": "_doc",
        "_id": "4n9aY2oBml718jk9v9SH",
        "_score": 2.6643744,
        "_source": {
          "total_profit": 621228.96,
          "sales_channel": "Offline",
          "order_id": 614078938,
          "units_sold": 8459,
          "tags": ["_dateparsefailure"],
          "total_revenue": 924399.52,
          "unit_cost": 35.84,
          "country": "Cote d'Ivoire",
          "order_priority": "H",
          "ship_date": "11/28/2011",
          "unit_price": 109.28,
          "total_cost": 303170.56,
          "item_type": "Clothes",
          "region": "Sub-Saharan Africa",
          "@version": "1",
          "host": "c5ceb9b17956",
          "order_date": "11/17/2011",
          "path": "/config-dir/1500000 Sales Records.csv",
          "message": "Sub-Saharan Africa,Cote d'Ivoire,Clothes,Offline,H,11/17/2011,614078938,11/28/2011,8459,109.28,35.84,924399.52,303170.56,621228.96\r",
          "@timestamp": "2019-04-28T09:50:52.295Z"
        }
      }
    ]
  }
}

상황에 따라 “AUTO” 혹은 0,1,2 를 선택하여 진행하시면 될 것 같습니다.




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 백엔드 개발자가 리액트 네이티브로 달력 앱을 배포해보았습니다.
  • MySQL 실시간 쿼리 확인하기
  • MySQL 트랜잭션 격리수준 Isolation level 알아보기
  • 레디스에 대한 간단한 설명과 성능향상시키기
  • Apple login 사용해보기