[Elasticsearch] analyze

[์›๋ณธ ๋งํฌ]

match ๋“ฑ์˜ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ analyze๋ผ๋Š” ์ „์ฒ˜๋ฆฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ๊ฐ„๋‹ค๊ณ  ํ–ˆ์—ˆ๋‹ค.
์—ฌ๊ธฐ์— ๋Œ€ํ•ด์„œ ์ž ๊น ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค.

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html
์ด ์• ๋„๋ผ์ด์ฆˆ๋Š” ๊ผญ ๊ฒ€์ƒ‰์„ ํ• ๋•Œ๋งŒ ์“ธ์ˆ˜ ์žˆ๋Š”๊ฑด ์•„๋‹ˆ๊ณ , ์ œ๊ณต๋˜๋Š” API๋ฅผ ํ†ตํ•ด์„œ ๋”ฑ ๊ทธ ์ „์ฒ˜๋ฆฌ ๋‹จ๊ณ„๋งŒ์„ ํ…Œ์ŠคํŠธํ•ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

ํ˜ธ์ถœํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
๊ธฐ๋ณธ ์• ๋„๋ผ์ด์ €๋ฅผ ์“ฐ๊ณ  ํ…์ŠคํŠธ๋Š” "์‹œ์›ํ•œ ์ƒดํ‘ธ"๋‹ค.

๊ทธ๋Ÿผ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€๋ฅผ ๋ฆฌ์Šคํฐ์Šค๋กœ ์ฐ์–ด์ค€๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” "์‹œ์›ํ•œ"๊ณผ "์ƒดํ‘ธ"๋กœ ์ž˜๋ผ์คฌ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต๋ฐฑ๋‹จ์œ„๋Š” ์ „๋ถ€ ์ž๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ "์‹œ์›ํ•œ์ƒดํ‘ธ"๋ฅผ ์ž…๋ ฅํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” "์‹œ์›ํ•œ"๊ณผ "์ƒดํ‘ธ"์˜ 2๊ฐœ ๋‹จ์–ด๋กœ ๋‚˜๋‰จ์„ ์•Œ์ง€๋งŒ, ์• ๋„๋ผ์ด์ €๋Š” ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋ž˜์„œ "์‹œ์›ํ•œ ์ƒดํ‘ธ"์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰์€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

์ด๋Ÿฐ ๊ฒƒ ๋•Œ๋ฌธ์— ์• ๋„๋ผ์ด์ €์˜ ์ปค์Šคํ…€์ด ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค.

ํ•œ๊ตญ์–ด ํ˜•ํƒœ์†Œ๋ถ„์„๊ธฐ์ธ nori๋ฅผ ์“ด๋‹ค๋ฉด ํ•œ๊ตญ์–ด์— ๋Œ€ํ•œ ๋ฌธ์žฅ์š”์†Œ๋ณ„ ๋ถ„๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
์ด๊ฒƒ๋„ ์ œ๋Œ€๋กœ ์“ฐ๋ ค๋ฉด ์„ค์ •ํ• ๊ฒŒ ์—„์ฒญ ๋งŽ์€๋ฐ, ์ผ๋‹จ ๊ธฐ๋ณธ์„ค์ •์œผ๋กœ ๋‚ ๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ„์„๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

"์‹œ์›"๊ณผ "์ƒดํ‘ธ"๋กœ ๋ถ„๋ฆฌ๊ฐ€ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ๋„ explain์„ ์ผœ๋ฉด ๋ถ„์„๋ฒ•์„ ์ข€ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.




์• ๋„๋ผ์ด์ €์˜ ๊ตฌ์กฐ

์• ๋„๋ผ์ด์ €๋Š” ํฌ๊ฒŒ 3๋‹จ๊ณ„์˜ ์ฒ˜๋ฆฌ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค.
์บ๋ฆญํ„ฐ ํ•„ํ„ฐ, ํ† ํฌ๋‚˜์ด์ €, ํ† ํฐ ํ•„ํ„ฐ๋‹ค.

https://esbook.kimjmin.net/06-text-analysis/6.2-text-analysis




1. ์บ๋ฆญํ„ฐ ํ•„ํ„ฐ

์บ๋ฆญํ„ฐ ํ•„ํ„ฐ๋Š” ํ† ํฌ๋‚˜์ด์ €๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ๊ฐ€๋ฒผ์šด ์ „์ฒ˜๋ฆฌ๋ฅผ ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.
ํ† ํฌ๋‚˜์ด์ €์™€ ํ† ํฐ ํ•„ํ„ฐ์— ๋น„ํ•ด์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ ์“ฐ์ด์ง€๋Š” ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์บ๋ฆญํ„ฐ ํ•„ํ„ฐ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTML Strip, Mapping, Pattern Replace์˜ 3๊ฐ€์ง€ ํ•„ํ„ฐ๊ฐ€ ์ œ๊ณต๋œ๋‹ค.
"char_filter" ์˜ต์…˜์œผ๋กœ ์ง€์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

html strip์€ ๊ทธ๋ƒฅ html ํŠน์ˆ˜๋ฌธ์ž๋“ค์„ ์ฝ์–ด์„œ ์น˜ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
์›๋ž˜๋ผ๋ฉด ์ œ๋Œ€๋กœ ์ฝ์ง€ ๋ชปํ•  ๊ฒƒ์„

char_filter๋กœ ์ ์šฉํ•ด์ฃผ๋ฉด html ํŠน์ˆ˜๋ฌธ์ž &npsp๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ์„œ ์ธ์‹ํ•˜๊ฒŒ ๋œ๋‹ค.

๋งคํ•‘ ํ•„ํ„ฐ๋Š” ๊ทธ๋ƒฅ ํŠน์ • ๋‹จ์–ด๋ฅผ ๋‹ค๋ฅธ ๋‹จ์–ด๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
"๋Œ€์ƒ ๋‹จ์–ด => ๋ฐ”๊ฟ€ ๋‹จ์–ด"์˜ ํ˜•ํƒœ๋กœ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

Pattern Replace๋Š” ๊ทธ๋ƒฅ ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ์น˜ํ™˜์„ ํ•ด์ฃผ๋Š”๊ฑด๋ฐ, ์ด๊ฑด ๋ณต์žกํ•ด์„œ ์ผ๋‹จ ๋„˜๊ธฐ๊ฒ ๋‹ค.




2. ํ† ํฌ๋‚˜์ด์ €

์•„๊นŒ ์œ„์—์„œ ๋‹ค๋ค˜๋˜ nori๋ผ๋Š” ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๊ฐ€ ์‚ฌ์‹ค ํ† ํฌ๋‚˜์ด์ €์˜€๋‹ค.
ํ† ํฌ๋‚˜์ด์ €๋Š” ์ •์˜๋œ ๊ทœ์น™์— ๋”ฐ๋ผ์„œ ํ…์ŠคํŠธ๋ฅผ ํ† ํฐ ๋‹จ์œ„๋กœ ์ž˜๋ผ์ฃผ๋Š” ๋…€์„์ด๋‹ค.

"tokenizer" ์˜ต์…˜์œผ๋กœ ์ง€์ • ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํ† ํฌ๋‚˜์ด์ €๋กœ๋Š” standard, letter, whiltespace ๋“ฑ์ด ์žˆ๋‹ค.
์ด์™ธ์—๋„ ๋ช‡๊ฐœ ์žˆ๊ธด ํ•œ๋ฐ ๊ตณ์ด ์—ฌ๊ธฐ์„œ ๋‹ค ๋‹ค๋ฃจ์ง€๋Š” ์•Š๊ฒ ๋‹ค.

standard๋Š” ๊ทธ๋ƒฅ ๊ณต๋ฐฑ์œผ๋กœ ํ† ํฐ์„ ์ž๋ฅด๋ฉด์„œ @ ๊ฐ™์€ ์ผ๋ถ€ ํŠน์ˆ˜๋ฌธ์ž๋งŒ ์ง€์›Œ์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  letter๋Š” ๊ณต๋ฐฑ์„ ํฌํ•จํ•œ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ† ํฐ์„ ์ž๋ฅธ๋‹ค.

whiltespace๋Š” ๊ทธ๋ƒฅ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ† ํฐ์„ ์ž๋ฅด๊ธฐ๋งŒ ํ•œ๋‹ค.

nori ๊ฐ™์€ ์ „๋ฌธํ™”๋œ ํ˜•ํƒœ์†Œ ํ† ํฌ๋‚˜์ด์ €๋Š” ๋ณ„๋„ ํฌ์ŠคํŠธ๋กœ ๋‹ค๋ฃจ๊ฒ ๋‹ค.




3. ํ† ํฐ ํ•„ํ„ฐ

์ด๊ฑด ํ† ํฌ๋‚˜์ด์ €๋กœ ๋ถ„๋ฆฌ๋œ ํ† ํฐ์„, ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ๋ฒˆ ๋” ์น˜ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
"filter" ์˜ต์…˜์œผ๋กœ ๋ณต์ˆ˜ ์ง€์ • ๊ฐ€๋Šฅํ•˜๋ฉฐ, lowercase, uppercase, stop, unique, synonym ๋“ฑ์ด ์žˆ๋‹ค.

์ด์ค‘์—์„œ stopword์™€ synonym์ด ์•„๋งˆ ์ œ์ผ ์ž์ฃผ ์“ฐ์ผ ๊ฒƒ์ด๋‹ค.



ํ† ํฐํ•„ํ„ฐ - lowercase, uppercase

lowercase, uppercase๋Š” ๊ฐ๊ฐ ์ „๋ถ€ ์†Œ๋ฌธ์ž, ๋Œ€๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•ด์ฃผ๋Š” ํ•„ํ„ฐ๋‹ค.

stop์€ ํŠน์ • ํ† ํฐ๋“ค์„ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. stopword๋กœ ์ง€์ •๋œ ๋‹จ์–ด๋ฅผ ํ† ํฐ ๋‹จ์œ„๋กœ ๋˜์ ธ๋ฒ„๋ฆฐ๋‹ค.
์ด๊ฑด ๊ทธ๋ƒฅ ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์•ˆ๋ผ์„œ, ์ธ๋ฑ์Šค์™€ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ๋‹ค.

์ด๋Ÿฌ๋ฉด ์ด์ œ stopword๋กœ ์ง€์ •๋œ ๋‹จ์–ด is๊ฐ€ ์ž๋™์œผ๋กœ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ด๋‹ค.



ํ† ํฐํ•„ํ„ฐ - unique

unique๋Š” ํ•œ ์ค‘๋ณต๋œ ํ† ํฐ์„ ์ž˜๋ผ์ค€๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ์ค‘๋ณต๋‹จ์–ด Happy๊ฐ€ ํ•˜๋‚˜๋งŒ ์ „๋‹ฌ๋  ๊ฒƒ์ด๋‹ค.




ํ† ํฐํ•„ํ„ฐ - synonym

synonym์€ ๋™์˜์–ด๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
๊ณ ํ’ˆ์งˆ์˜ ๊ฒ€์ƒ‰์„ ์›ํ•œ๋‹ค๋ฉด ์ ๋‹นํžˆ ๋„ฃ์–ด์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„  ๋™์˜์–ด ๋ชฉ๋ก์„ synonyms๋กœ ๋ฐ•์•„๋†จ์ง€๋งŒ ๋”ฐ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œํ•ด์„œ synonyms_path๋กœ ํŒŒ์ผ๊ฒฝ๋กœ ์ง€์ •ํ•ด์ฃผ๋Š”๊ฒŒ ์ •์„์ด๋‹ค.
์ €๋Ÿฌ๋ฉด shampoo, ์ƒดํ‘ธ, ์ƒดํ“จ ํ† ํฐ์„ ๋งŒ๋‚˜๋ฉด ์ „๋ถ€ "์ƒดํ‘ธ"๋กœ ์น˜ํ™˜ํ•œ๋‹ค๋Š” ๋‚ด์šฉ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”๋ฒ„๋ฆฐ๋‹ค.

์ €๊ฑด ์ผ๋ฐฉ์ ์ธ ์น˜ํ™˜์ด๊ณ ,

์„œ๋กœ ์น˜ํ™˜๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ๊ทธ๋ƒฅ ์ด๋ ‡๊ฒŒ ์ฝค๋งˆ๋กœ๋งŒ ๊ตฌ๋ถ„ํ•ด์„œ ๋˜์ ธ์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋™์˜์–ด ๋ชฉ๋ก์„ ์ „๋ถ€ ํ† ํฐ์œผ๋กœ ๋„ฃ์–ด๋ฒ„๋ฆฐ๋‹ค.




์ธ๋ฑ์Šค์— ์ ์šฉํ•˜๊ธฐ

๊ทธ๋Ÿฐ๋ฐ ์ €๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ธฐ๋งŒ ํ•˜๋ฉด ๋ญํ•˜๊ฒ ๋Š”๊ฐ€. ์‹ค์ œ๋กœ ๋ถ™์—ฌ์„œ ์จ์•ผ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€.
์• ๋„๋ผ์ด์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ด์„œ ์ธ๋ฑ์Šค์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
settings.analysis ์ ˆ์ด๋‹ค.

PUT test6
{
  "settings": {
    "analysis": {
      "analyzer": {
        "korean": {
            "type": "custom",
            "tokenizer": "nori",
            "filter": ["my_synonym"],
            "char_filter": []
        }
      },
      "filter": {
        "my_synonym": {
          "type": "synonym",
          "synonyms": [
            "shampoo, ์‚ผํ‘ธ => ์ƒดํ“จ, ์ƒดํ‘ธ"
          ]
        }
      },
      "tokenizer": {
        "nori": {
          "decompound_mode": "mixed",
          "type": "nori_tokenizer",
          "user_dictionary":"user_dictionary.txt"
        }
      }
    }
  },
  "mappings": {
    ...
  }
}

analysis.filter ์ ˆ๋กœ ํ† ํฐํ•„ํ„ฐ๋ฅผ ์ •์˜ํ•ด๋‘๊ณ , analysis.tokenizer ์ ˆ๋กœ ํ† ํฌ๋‚˜์ด์ €๋ฅผ ์ •์˜ํ•ด์„œ,
analysis.analyzer ์ ˆ์— ์ •์˜ํ•ด๋‘” ๊ฒƒ๋“ค์„ ๊ผฝ์•„์“ฐ๋Š” ์‹์ด๋‹ค.

์œ„์—์„œ๋Š” korean ์ ˆ๋กœ ํ•œ๊ตญ์–ด์—๋งŒ ์ž๋™์œผ๋กœ ์• ๋„๋ผ์ด์ €๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ํ•ด๋‘” ๊ฒƒ์ด๊ณ , ๊ทธ๋ƒฅ ์™„์ „ ๋””ํดํŠธ๋กœ ํ•˜๋ ค๋ฉด ํ‚ค๊ฐ’์„ default๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

์• ๋„๋ผ์ด์ € ์ด๋ฆ„์„ "korean" ๊ฐ™์€ ์–ธ์–ด๋ช…์ด๋‚˜ default ๋“ฑ ์˜ˆ์•ฝ๋œ ์ด๋ฆ„์œผ๋กœ ํ•ด๋‘์ง€ ์•Š์œผ๋ฉด ๊ทธ๋ƒฅ ๋“ฑ๋ก๋งŒ ๋˜๊ณ , ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ์ด ๋˜์ง„ ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡๋‹ค.



์ฐธ์กฐ
https://esbook.kimjmin.net/06-text-analysis/6.2-text-analysis
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-custom-analyzer.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html