kgneng2 / blokg

blog
MIT License
0 stars 0 forks source link

elasticsearch synonym dynamic #53

Open kgneng2 opened 2 years ago

kgneng2 commented 2 years ago

oss 7.10.2 버젼에서 테스트 진행

mapping 정보

      "placeNameKo" : {
          "type" : "text",
          "fields" : {
            "prefix" : {
              "type" : "text",
              "analyzer" : "prefix_place_ko",
              "search_analyzer" : "prefix_place_search"
            },
            "raw" : {
              "type" : "keyword"
            }
          }

        "place_search" : {
              "filter" : [
                "lowercase",
                "city_synonyms",
                "javacafe_jamo",
                "trim"
              ],
              "tokenizer" : "standard"
            }
  1. 동의어 사전에 서울, 김포 국제공항,GMP 를 추가함.
  2. placeNameKo에 place_search analyzer 를 적용해놨고, city_synonyms에 1번을 추가한것임.
  3. GET place-test4/_refresh 날렸지만, 의미없음 적용안됨
  4. POST place-test4/_reload_search_analyzers 날리면 된다고하지만, OSS버젼에선 안됨 (https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-reload-analyzers.html#indices-reload-analyzers-api-prereqs)

https://stackoverflow.com/questions/18476736/how-to-dynamically-change-synonyms-for-elasticsearch

  1. POST place-test4/_close 호출후
  2. POST place-test4/_open. 다시 열어줬더니, 동의어가 제대로 적용되었다.
    
    {
    "tokens" : [
    {
      "token" : "ㅅㅓㅇㅜㄹ",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "<HANGUL>",
      "position" : 0
    },
    {
      "token" : "ㄱㅣㅁㅍㅗ",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "SYNONYM",
      "position" : 0
    },
    {
      "token" : "gmp",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "SYNONYM",
      "position" : 0
    },
    {
      "token" : "ㄱㅜㄱㅈㅔㄱㅗㅇㅎㅏㅇ",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "SYNONYM",
      "position" : 1
    }
    ]
    }


- 실서비스에 적용하려면, 현재 1,2 index가 있어 번갈아가면서, 삭제하면서 생성되고 있다.
- clone을 이용해서 현재 current index를 복제한 후, 복제가 완료되면 변경된 synonym이 적용되어버림.
- clone 하는 방법 : https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-clone-index.html 문서 참고
- clone 시 주의사항은 클러스터상태가 green이여야하고, index.block.write를 막아야함. 

--------

## 방법 

- 인덱스 생성시, 미사용중인 인덱스(2)로 변경하고, 적용중인 인덱스(1)을 close 후 open 하여 동의어사전 업데이트 진행하고, 다시 alias를 변경하는 방법 (단점 : 미사용중인 인덱스가 완전히 1번 인덱스와 동일하지 않을수 있는데 크게 영향없을듯하다)
- 인덱스를 클론하여, alias를 적용함. 배치생성시  clone된 인덱스가  alias로 있다면, 새로 생성한 인덱스로 alias를 바꾸고, clone인덱스는 날림. 
- 이 두개도 귀찮으면... 파일 변경 사항을 확인해서 변경사항이 발견시, 내부에서 업데이트 하는 방법을 찾아서 plugins으로 개발 
kgneng2 commented 2 years ago

elasticsearch document 에서 동의어 document를 읽어서 처리할수없나? ㅇ_ㅇ... mongodb를 읽기엔... acl도 있고 ;; 동의어를 파일로 관리하기가 좀 번거롭기도하고, 일단 동의어를 파일로 관리하되, reload 하는 plugins를 개발 하면 좋을꺼같긴하다.