Elasticsearch 중국어 동의어

Elasticsearch의 표준 버전과 이상은 동의어 설정 기능을 지원하지만, 사실은 OSS(개원) 버전을 제외한 다른 것은 모두 지원합니다.

환경 설명

  • Elasticsearch 7.6.x
  • ES와 일치하는 IK 분사 플러그인
  • 예시에서 셸 명령과 Kibana에 각각 사용됩니다. $로 시작하는 것은 셸 명령입니다. 그렇지 않으면 Kibana의 console 명령
  • 을 나타냅니다.

    조작하다


    동의어 사용 가능synonym 매개 변수에 지정을 삽입하거나 집단의 모든 노드에 있는 동의어 파일에 존재해야 합니다.동의어 파일 경로synonyms_path 매개변수 지정, Elasticsearch 대비 절대 또는config 디렉토리입니다.
    다음은 동의어의 두 가지 설정 방법으로 소개한다.

    동의어 파일 방식


    동의어 파일 설정

    #  Elasticsearch , 
    $ echo '"iPhone,  => iPhone, ",
        "2233,22 ,33  => bilibili,B "' > config/analysis/synonyms.txt

    색인 만들기

    PUT /goods2
    {
      "settings": {
        "analysis": {
          "filter": {
            "my_synonym_filter": {
              "type": "synonym",
              "updateable": true,
              "synonyms_path": "analysis/synonyms.txt"
            }
          },
          "analyzer": {
            "my_synonyms_analyzer": {
              "tokenizer": "ik_smart",
              "filter": [
                "my_synonym_filter"
              ]
            }
          }
        }
      },
      "mappings": {
        "properties": {
          "title": {
            "type": "text",
            "analyzer": "ik_smart",
            "search_analyzer": "my_synonyms_analyzer"
          }
        }
      }
    }
    my_synonym_filter 사용자 정의 , my_synonyms_analyzer는 사용자 정의 분석기로 후자가 전자를 포함하고 인용한 것을 알 수 있다.
    이 인덱스에서 사용자 정의된 어휘 과도기와 분석기도 현재 인덱스에서만 사용할 수 있습니다.updateable 동적 업데이트 여부를 표시하려면 true여야 동적 업데이트 동의어synonyms_path 동의어 파일의 위치 표시analysis.analyzer.tokenizer 이 분석기에서 ik_smart 분사기를 사용하도록 지시한다. 이 인덱스에서의 분석 체인은 => => , 즉 원시 텍스트는 먼저 분사의 결과를 거쳐 처리에 사용된다(이 인덱스의 역할은 동의어)이다.mappings.properties.title.search_analyzer지시title필드는 조회할 때 my_synonyms_analyzer분석기를 사용하고 동리mappings.properties.title.analyzer는 색인할 때 사용하는 분석기를 표시한다.

    분석 결과 보기


    첫 줄 분사 효과
    #  
    GET goods2/_analyze
    {
      "analyzer": "my_synonyms_analyzer",
      "text": "iphone"
    }
    
    GET goods2/_analyze
    {
      "analyzer": "my_synonyms_analyzer",
      "text": " "
    }

    위의 두 문장의 결과는 같다
    {
      "tokens" : [
        {
          "token" : "iphone",
          "start_offset" : 0,
          "end_offset" : 6,
          "type" : "ENGLISH",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 6,
          "type" : "SYNONYM",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 6,
          "type" : "SYNONYM",
          "position" : 1
        }
      ]
    }
    

    두 번째 줄 분사의 효과
    GET goods2/_analyze
    {
      "analyzer": "my_synonyms_analyzer",
      "text": "2233"
    }
    
    GET goods2/_analyze
    {
      "analyzer": "my_synonyms_analyzer",
      "text": "22 "
    }

    결과
    {
      "tokens" : [
        {
          "token" : "bilibili",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "SYNONYM",
          "position" : 0
        },
        {
          "token" : "b",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "SYNONYM",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "SYNONYM",
          "position" : 1
        }
      ]
    }
    

    동의어 변경 및 인덱스 업데이트

    #  Elasticsearch , 
    # `iPhone,  => iPhone, ` `iPhone, ` 
    #  `"` `,` ( ),  
    $ echo '"iPhone, ",
        "2233,22 ,33  => bilibili,B , "' > config/analysis/synonyms.txt
    #  
    POST /goods2/_reload_search_analyzers

    동의어 변경 후 두 번째 줄 분사 효과
    GET goods2/_analyze
    {
      "analyzer": "my_synonyms_analyzer",
      "text": "2233"
    }

    결과
    {
      "tokens" : [
        {
          "token" : "bilibili",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "SYNONYM",
          "position" : 0
        },
        {
          "token" : "b",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "SYNONYM",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "SYNONYM",
          "position" : 0
        },
        {
          "token" : " ",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "SYNONYM",
          "position" : 1
        }
      ]
    }
    

    내장 방식


    색인 만들기


    동의어 설정은 synonyms 속성에 있습니다.
    PUT /goods3
    {
      "settings": {
        "analysis": {
          "filter": {
            "my_synonym_filter": {
              "type": "synonym",
              "synonyms": [
                "iPhone,  => iPhone, ",
                "2233,22 ,33  => bilibili,B "
              ]
            }
          },
          "analyzer": {
            "my_synonyms_analyzer": {
              "tokenizer": "ik_smart",
              "filter": [
                "my_synonym_filter"
              ]
            }
          }
        }
      },
      "mappings": {
        "properties": {
          "title": {
            "type": "text",
            "analyzer": "ik_smart",
            "search_analyzer": "my_synonyms_analyzer"
          }
        }
      }
    }

    분석 결과 보기


    다음 결과는 동의어 파일 방식과 같습니다.
    
    GET goods3/_analyze
    {
      "analyzer": "my_synonyms_analyzer",
      "text": "iphone"
    }
    
    GET goods3/_analyze
    {
      "analyzer": "my_synonyms_analyzer",
      "text": "2233"
    }

    동의어 변경 및 인덱스 업데이트

    #  
    POST /goods3/_close
    
    PUT /goods3/_settings/
    {
      "analysis": {
        "filter": {
          "my_synonym_filter": {
            "type": "synonym",
            "synonyms": [
              "iPhone, ",
              "2233,22 ,33  => bilibili,B , "
            ]
          }
        }
      }
    }
    
    #  
    POST /goods3/_open

    조회 실천


    색인goods2을 예로 들다
    #  
    POST /goods2/_doc/1
    {
      "title":"bilibili "
    }
    
    #  `2233` 
    GET /goods2/_search
    {
      "query": {
        "match": {
          "title": "2233"
        }
      }
    }

    결과
    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1,
          "relation" : "eq"
        },
        "max_score" : 0.2876821,
        "hits" : [
          {
            "_index" : "goods2",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 0.2876821,
            "_source" : {
              "title" : "bilibili "
            }
          }
        ]
      }
    }

    총결산

  • Elasticsearch에서 동의어를 설정하는 것은 두 가지
  • 색인을 닫지 않고 동적으로 동의어를 업데이트할 수 있음
  • 참고 자료

  • Elasticsearch Reference 7.6 재부팅 분석기 API
  • Elasticsearch: 권위 있는 가이드
  • Elastic Stack 버전별 차이점
  • 좋은 웹페이지 즐겨찾기