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)


+ Random Posts