Opensearch에서 한글 부분문자열 검색 오류

0

Python을 통해 json 형태의 상권 데이터를 Opensearch에 적재한 상황입니다.

이 정보에서 '스타벅스'라는 문자열을 검색 시 GET _search { "query": { "match": { "name":"스타벅스" } } } 로 검색 할 경우 ... "hits" : [ { "_index" : "map", "_id" : "25313530", "_score" : 7.797021, "_source" : { "number" : "25313530", "name" : "스타벅스", "highcategory" : "음식", "midcategory" : "커피점/카페", ... } },

와 같이 name 필드가 '스타벅스'라는 검색어와 일치하는 결과들이 리턴됩니다.

그런데 '스타벅스강남점'과 같이 '스타벅스' 검색어를 포함하고 있는 결과는 출력되지 않습니다.

즉 RDB로 비유할 경우 한글 like 검색이 되지 않는 것인데 영문이나 숫자 등은 정상적으로 like 검색이 이루어집니다.

이러한 문제를 해결할 수 있는 방안에 대한 질의를 드립니다.

profile picture
질문됨 일 년 전481회 조회
2개 답변
1

index 생성시에 mapping을 하지 않았다면 질문에 입력하신 대로 검색 한 경우, text 타입의 필드에서 검색할 것으로 예상됩니다. 이 경우 indexing 과정에서 analyzer를 거치게 되고 입력한 문자 또는 문장이 token화 되어서 저장됩니다. index 생성시에 analyzer를 지정하지 않았다면 기본값인 standard analyzer(Standard Tokenizer)가 지정되었으리라 생각됩니다.

standard analyzer에서는 기본적으로 공백 단위로 텀을 구분합니다. 결론적으로 기본값을 그대로 사용하실 예정이라면 데이터 입력시 공백으로 구분해주시고, 데이터 입력시 조작이 불가능한 상황이라면 index 생성시에 사용자 사전이나 상황에 맞도록 tokenizer 변경이 필요해보입니다. 참고로 한글로 된 전문 검색이 필요한 경우 OpenSearch에 기본적으로 포함된 seunjeon를 고려해보면 좋습니다.

GET _analyze
{
  "tokenizer": "standard", 
  "text" : "스타벅스강남점"
}

결과
{
  "tokens" : [
    {
      "token" : "스타벅스강남점",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "<HANGUL>",
      "position" : 0
    }
  ]
}
GET _analyze
{
  "tokenizer": "standard", 
  "text" : "스타벅스 강남점"
}

결과
{
  "tokens" : [
    {
      "token" : "스타벅스",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "<HANGUL>",
      "position" : 0
    },
    {
      "token" : "강남점",
      "start_offset" : 5,
      "end_offset" : 8,
      "type" : "<HANGUL>",
      "position" : 1
    }
  ]
}
profile pictureAWS
답변함 일 년 전
0

Opensearch의 Language analyzer가 지원하는 언어에 한글이 없던 기억입니다. unicode FTS 구현이 쉽지 않아서 적합한 솔루션을 잘 찾아보셔알지도 모르겠습니다.

Language analyzer OpenSearch supports the following language values with the analyzer option: arabic, armenian, basque, bengali, brazilian, bulgarian, catalan, czech, danish, dutch, english, estonian, finnish, french, galicia, german, greek, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian, persian, portuguese, romanian, russian, sorani, spanish, swedish, turkish, and thai.

https://opensearch.org/docs/2.1/opensearch/query-dsl/text-analyzers/

profile picture
답변함 일 년 전

로그인하지 않았습니다. 로그인해야 답변을 게시할 수 있습니다.

좋은 답변은 질문에 명확하게 답하고 건설적인 피드백을 제공하며 질문자의 전문적인 성장을 장려합니다.

질문 답변하기에 대한 가이드라인