본문 바로가기

programmer/Elasticsearch

[Elasticsearch] 영문 검색 시 띄어쓰기 제거[2/2]

Elk에서 영문 검색 시 띄어쓰기를 하지 않고 연속되는 단어가 있는 경우 검색.

kibana에서 실행 하면 된다.

index 생성 setting, mapping 입력

tokenize를 사용해 ngram을 설정한다. 최소 2음절씩 최대 5음절로 토큰을 생성한다.

PUT english_pattern_replace_test2
{
  "settings": {
    "analysis": {
      "char_filter": {
        "whitespace_remove": {
          "type": "pattern_replace",
          "pattern": "\\s+",
          "replacement": ""
        }
      },
      "analyzer": {
        "custom_analyzer": {
          "type": "custom",
          "tokenizer": "my_customer_ngram_tokenizer",
          "filter": [
            "lowercase",
            "asciifolding"
          ],
          "char_filter": [
            "whitespace_remove"
          ]
        }
      },
      "tokenizer": {
        "my_customer_ngram_tokenizer": {
          "type": "ngram",
          "min_gram": "2",
          "max_gram": "5"
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "dynamic": "false",
      "properties": {
        "title_eng": {
          "type": "keyword",
          "fields": {
            "analyze": {
              "type": "text",
              "term_vector": "yes",
              "analyzer": "custom_analyzer"
            }
          }
        }
      }
    }
  }
}

Analyser 확인

확인 결과 쭈~악 토큰이 쪼개지는 것을 확인할 수 있다. 이렇게하면 색인 시간 및 저장 용량이 늘어난다. 이에 * 검색 데이터가 작고 색인 크기도 작다면 wildcard를 사용하는게 나을 수도 있다.

GET english_pattern_replace_test2/_analyze
{
  "analyzer": "custom_analyzer",
  "text": [
    "Elastic Search"
  ]
}



-----------out-----------
{
  "tokens" : [
    {
      "token" : "el",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "ela",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "elas",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "elast",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "la",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : "las",
      "start_offset" : 1,
      "end_offset" : 4,
      "type" : "word",
      "position" : 5
    },
    ...

 

색인 삽입

'Mysql Search Guide'도 추가로 넣어보고 검색 결과를 확인하자.

PUT english_pattern_replace_test2/_doc/0 
{
  "title_eng" : "Elastic Search"
}
PUT english_pattern_replace_test2/_doc/1 
{
  "title_eng" : "Elastic Search2"
}
PUT english_pattern_replace_test2/_doc/2 
{
  "title_eng" : "Elastic Search Guide"
}
PUT english_pattern_replace_test2/_doc/3
{
  "title_eng" : "Mysql Search Guide"
}

검색

'Mysql Search Guide' 경우 검색 토큰에 search가 포함되어 있었기 때문에 mysql 관련 데이터도 검색 되었다.

ngram을 사용해 *검색이 가능해 졌지만 오히려 검색 신뢰도를 떨어 뜨릴수도 있다. Elk를 적용하는 인덱스에 따라 ngram적용을 고려해 보아야 할 것이다. 

GET english_pattern_replace_test2/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "dis_max": {
            "queries": [
              {
                "multi_match": {
                  "query": "elasticsearch",
                  "fields": [
                    "title_eng.analyze"
                  ],
                  "type": "cross_fields",
                  "operator": "OR"
                }
              }
            ]
          }
        }
      ]
    }
  }
}


-----------out----------------
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 4,
    "max_score" : 12.244228,
    "hits" : [
      {
        "_index" : "english_pattern_replace_test2",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 12.244228,
        "_source" : {
          "title_eng" : "Elastic Search Guide"
        }
      },
      {
        "_index" : "english_pattern_replace_test2",
        "_type" : "_doc",
        "_id" : "0",
        "_score" : 12.082647,
        "_source" : {
          "title_eng" : "Elastic Search"
        }
      },
      {
        "_index" : "english_pattern_replace_test2",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 12.082647,
        "_source" : {
          "title_eng" : "Elastic Search2"
        }
      },
      {
        "_index" : "english_pattern_replace_test2",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 4.0275493,
        "_source" : {
          "title_eng" : "Mysql Search Guide"
        }
      }
    ]
  }
}

 

 

참조 사이트

https://www.movingjin.com/20

https://findstar.pe.kr/2018/07/14/elasticsearch-wildcard-to-ngram/

 

반응형
사업자 정보 표시
라울앤알바 | 장수호 | 서울특별시 관악구 봉천로 13나길 58-10, 404호(봉천동) | 사업자 등록번호 : 363-72-00290 | TEL : 010-5790-0933 | Mail : shjang@raulnalba.com | 통신판매신고번호 : 2020-서울관악-0892호 | 사이버몰의 이용약관 바로가기