ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python3] ElasticSearch 사용하기
    언어/파이썬 & 장고 2019. 2. 17. 20:16

    1. 기본 세팅

    엘라스틱 서치 설치 : https://www.elastic.co/kr/downloads/elasticsearch

    한글 형태소 분석기 노리 설치: https://www.elastic.co/kr/blog/nori-the-official-elasticsearch-plugin-for-korean-language-analysis

    파이썬3 엘라스틱서치 패키지 설치: https://elasticsearch-py.readthedocs.io/en/master/

    2. 파이썬 Elastic Search 세팅

    아래는 위에서 설치 받은 한글 형태소 분석기인 nori를 특정 필드에 적용도록 하는 세팅 방법 입니다.

    from elasticsearch import Elasticsearch

    # es 실행 기본포트: 9200, 기본 ip: 루프백 아이피 - 127.0.0.1 (localhost)
    es = Elasticsearch()
    
    # test-index 인덱스가 이미 사용하고 있을 시, 삭제
    es.indices.delete(index='test-index', ignore=[400, 404])
    body = {
        "settings": {
            "index": {
                "analysis": {
    				
                    "tokenizer": {
                        "nori_tokenizer": {
                            "type": "nori_tokenizer",
                        },
                    },
                    "analyzer": {
    					# nori 분석기 설정
                        "nori_korean": {
                            "type": "custom",
                            "tokenizer": "nori_tokenizer"
                        },
                    }
                }
            }
        },
        "mappings": {
            "goods": {
                "properties": {
                    "name": {
                        "type": "text",
    					# name에 nori 형태소 분석기 설정
                        "analyzer": "nori_korean",
                    },
                    "description": {
                        "type": "text",
                    },
                    "name_eng": {
                        "type": "text"
                    },
                    "pid": {
                        "type": "integer"
                    },
                }
            }
        }
    }
    es.indices.create(index='test-index', body=body)
    # 테스트 데이터
    goods = [
        {
            "name": '주름원피스',
            "name_eng": "Pleated dress",
            "pid": 0,
            "description": '주름진 원피스'
        }
    ]
    for i, data in enumerate(goods):
        res = es.index(index="test-index", doc_type='goods', body=data, id=i)
        print(res['result'])


    3. 검색하기

    query = {
        "query": {
            "bool": {
                "should": [
                    {
                        "match": {
                            "name": {
                                "query": "주름", "boost": 3
                            }
                        }
                    }
                ]
            }
        }
    }
    
    res = es.search(index="test-index", body=query)


    댓글