Elasticsearch, django - rest_framework로 검색엔진 만들기 - 2차 트러블슈팅(미해결)
reference
https://blog.nerdfactory.ai/2019/04/29/django-elasticsearch-restframework.html
너드팩토리
너드팩토리에서 운영하는 블로그 입니다.
blog.nerdfactory.ai
MacOS 기준으로 진행했다.
0. 기본장고 세팅하기
우선 가상환경 활성화하기
python3 -m venv myvenv #myvenv라는 가상환경 만들기
source myvenv/bin/activate
활성화하는 코드인데
저 디렉터리 순서는 잘 맞는지 어째서인지 저 코드로 한번에 안되길래
그냥 bin들어가서 source activate로 활성화 해줬다.
그리고 애당초 myvenv\Scripts\activate 이 명령어는 window용이라 안된다.
django-admin startproject server_project
cd server_project
pip install django && python3 manage.py startapp search_app
장고 깔려있으면 뒤에 명령어만 해주면 됨
django를 설정하고 server_project라는 이름으로 프로젝트 폴더를 생성하고, search_app이라는 애플리케이션을 만들기
manage.py => python 형식에서 작성된 애플리케이션 생성 방식을 표현한 파일
VSC에서 server_project 열어주고
#server_project/settings.py
#...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # Django REST framework 사용을 하기 위함
'search_app' # 이전에 생성한 애플리케이션
]
#...
요 부분에 주석 단 코드들을 추가해준다
장고 세팅 끝
1. Python ES API, nori 한글 형태소 분석기 설치
우선 pwd가 project안으로 되어있을텐데,
로컬에 Elasticsearch를 편하게 사용할 수 있느 Python ES API를 설치해야하기 때문에
홈디렉터리로 다시 가서 가상환경 활성화해주고
거기서 깔아주면된다
그런데 문제점1
{
"name" : "instance-0000000000",
"cluster_name" : "",
"cluster_uuid" : "",
"version" : {
"number" : "8.11.3",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "",
"build_date" : "2023-12-08T11:33:53.634979452Z",
"build_snapshot" : false,
"lucene_version" : "9.8.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
내가 접속하려는 elasticsearch endpoint는 버전이 8.11.3인데
안된다길래 그냥 8.11.1설치했다
그런데
암만 들여다봐도 docker에서 설치했을 때처럼 bin안에 plugins나 elastic-plugin가 없는거임
그래서
일단 8.11.1버전 설치한 거 지우고
elasticsearch에서 8.12.0 다운받고
brew 명령어로 해보기로 했다
https://memostack.tistory.com/201
MacOSX 에 ElasticSearch 설치하기 (Homebrew 사용)
Elastic Search 설치 아래 사이트에서 설치를 진행한다. www.elastic.co/kr/downloads/elasticsearch Download Elasticsearch Free | Get Started Now | Elastic | Elastic Want it hosted? Deploy on Elastic Cloud. Get Started » www.elastic.co Mac 용
memostack.tistory.com
맥북(MacBook), 엘라스틱서치(elasticsearch) 설치 하기
1.설치 elasticsearch 를 위해서 java 설치가 필요하다. (사실, 뒤에서 brew install elasticsearch 를 실행하면, 가이드에 나오는 내용이다.) $ brew cask install homebrew/cask-versions/adoptopenjdk8 homebrew를 업데이트 한다
richwind.co.kr
brew tap elastic/tap
brew install elastic/tap/elasticsearch-full
얘네 써서도 해보고
brew cleanup 하고도 해보고
brew install elasticsearch 도 해봤는데
뭔놈의 에러가 나는지
그냥 사이트 들어가서 다운로드 했다.
그런데 또
안되는거야~~ 처음에는 elasticsearch-plugin 들어가지지도 않고
그래서 결국 쓴 갓 sudo
sudo가 짱이야...
이 플러그인 쓰려면 elasticsearch 재실행 해줘야된다
근데 재실행하는 명령어인
sudo systemctl restart elasticsearch
얘도 오류가 나더랜다 (순서 바꿔서나 systemctl 빼거나 이것저것 조합해서 다 해도 안되더라)
지금 생각해보면 pwd 문제였던 것 같은데
cluster명이랑... 나중에 바꿀 때 참고할 것
https://programmer-chocho.tistory.com/25
[Elasticsearch]엘라스틱서치 설치 및 실행
Mac OS 환경을 기반으로 설치 및 실행한다. 엘라스틱서치 설치 1. 공식 홈페이지에 접속하여 메인화면 배너에 있는 Elasticsearch 다운로드 버튼을 클릭한다. 환경에 맞는 설치 파일을 다운로드 받는
programmer-chocho.tistory.com
2. 인덱스 설정 및 생성
setting_bulk.py 만들어서 코드 추가해준다
2.1. 토크나이징 설정: 한글 형태소 분석기 nori를 통해 데이터를 토크나이징할 수 있도록 설정
2.2. mapping 설정:
매핑 설정을 직접 해주지 않아도 Elastic에서 자동으로 mapping이 만들어지지만, 사용자의 의도대로 mapping 꼭 해주진 않음.
mapping이 잘못되면 Kibana와 연동할 때도 비효율적이기 때문에 직접 해주기
각 필드의 타입을 정의하고 위에서 설정해준 분석기 ‘my_analyzer’로 title과 content를 분석할 수 있도록 설정
setting_bulk.py 코드↓
# search_app/setting_bulk.py
from elasticsearch import Elasticsearch
es = Elasticsearch()
es.indices.create(
index='dictionary',
body={
"settings": {
"index": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "nori_tokenizer"
}
}
}
}
},
"mappings": {
"dictionary_datas": {
"properties": {
"id": {
"type": "long"
},
"title": {
"type": "text",
"analyzer": "my_analyzer"
},
"content": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
}
)
3. 데이터 삽입
dictionary.json파일을 만들어줬다
데이터가 마땅히 가져올게 아직 만들어지지 않기도 했고 n-gram 적용전 테스트용이라
조금만... (머쓱)
[
{
"id": 1,
"title": "주식",
"content": "주식회사 자본 단위 금액 전체"
},
{
"id": 2,
"title": "채원",
"content": "고려 후기 무신. 주식과는 무관"
},
{
"id": 3,
"title": "김향",
"content": "고려시대 문신. 단위 자본 어쩌고와는 무관"
},
{
"id": 4,
"title": "구의 증명",
"content": "구의 증명이 뭔가요? 대단한 책이죠"
},
{
"id": 5,
"title": "AWS 입문",
"content": "aws 다루는 기초 입문자를 위한 책이다."
}
]
4. view 구현
클래스 기반 뷰로 API를 작성
GET Method를 통해 요청을 하면 parameter로 전달된 검색어에 해당하는 검색 결과를 응답하도록 작성
# search_app/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from elasticsearch import Elasticsearch
class SearchView(APIView):
def get(self, request):
es = Elasticsearch()
# 검색어
search_word = request.query_params.get('search')
if not search_word:
return Response(status=status.HTTP_400_BAD_REQUEST, data={'message': 'search word param is missing'})
docs = es.search(index='dictionary',
doc_type='dictionary_datas',
body={
"query": {
"multi_match": {
"query": search_word,
"fields": ["title", "content"]
}
}
})
data_list = docs['hits']
return Response(data_list)
5. url 설정
# server_project/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('search_app.urls')),
]
Django는 http://127.0.0.1:8000/로 들어오는 모든 접속 요청을 search_app.urls로 전송해 추가 명령을 찾을 것
search_app 디렉터리에 urls.py 파일을 생성하고 url 패턴을 추가
# search_app/urls.py
from django.urls import path
from search_app import views
urlpatterns = [
path('', views.SearchView.as_view()),
]
6. 검색 결과 확인
postman 이용
우선 그전에
$ python3 manage.py runserver 해보고
ModuleNotFoundError: No module named 'rest_framework 에러메시지가 뜨길래
settings.py에
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
}
추가해주고,
pip install djangorestframework
pip install elasticsearch
python manage.py migrate
차례대로 터미널에서 이렇게 했더니
드디어...... 뷰가 뜨다.
감동되,
는줄 알았는데
search 안되고 http 403 forbidden 나왔다.
이 에러인걸로 보아 인증 문제가 있어서 내가 username이랑 password를 뭔가 날려주거나
해줘야될것같은데...
트러블슈팅 시작...
# search_app/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from elasticsearch import Elasticsearch
class SearchView(APIView):
def get(self, request):
es = Elasticsearch()
# 검색어
search_word = request.query_params.get('search')
if not search_word:
return Response(status=status.HTTP_400_BAD_REQUEST, data={'message': 'search word param is missing'})
docs = es.search(index='dictionary',
doc_type='dictionary_datas',
body={
"query": {
"multi_match": {
"query": search_word,
"fields": ["title", "content"]
}
}
})
data_list = docs['hits']
return Response(data_list)
이렇게 생긴 view 코드에서
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import permissions
from elasticsearch import Elasticsearch
class AllowAnyReadOnly(permissions.BasePermission):
def has_permission(self, request, view):
return request.method in permissions.SAFE_METHODS
class SearchView(APIView):
permission_classes = [AllowAnyReadOnly]
def get(self, request):
es = Elasticsearch()
# 검색어
search_word = request.query_params.get('search')
if not search_word:
return Response(status=status.HTTP_400_BAD_REQUEST, data={'message': 'search word param is missing'})
docs = es.search(index='dictionary',
doc_type='dictionary_datas',
body={
"query": {
"multi_match": {
"query": search_word,
"fields": ["title", "content"]
}
}
})
data_list = docs['hits']
return Response(data_list)
permission 을 추가해줬다
그랬더니 500 internal server error 생김
그래서 우선 이전 코드로 돌려놓고 403 오류를 settings 코드 수정으로 해결해보기로 한다
https://dev-guardy.tistory.com/80
[django] 403 forbidden Error 해결하기(CSRF token)
django, CSRF token missing or incorrect, 403 forbidden, python 장고를 이용할 때 CSRF 문제로 인해 아래와 같이 403 forbidden Error가 발생하곤한다. {"detail":"CSRF Failed: CSRF token missing or incorrect."} 이때 해결 방법을 공
dev-guardy.tistory.com
MIDDLEWARE = [
#'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
#'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
저 세 코드를 주석처리해줌
ERRORS:
?: (admin.E408) 'django.contrib.auth.middleware.AuthenticationMiddleware' must be in MIDDLEWARE in order to use the admin application.
응 안돼. 있어야된대.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
그래서 csrf만 주석처리해주고 view 를 수정해보기로 한다
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt,name='dispatch')
이 코드를 넣어주었다
admin.E408 에러는 안나는데 403 에러는 해결이 안된다.
Django Rest Framework - Authentication credentials were not provided
I'm developing an API using Django Rest Framework. I'm trying to list or create an "Order" object, but when i'm trying to access the console gives me this error: {"detail": "Authentication credent...
stackoverflow.com
settings.py에 REST_FRAMEWORK 부분을 이렇게 수정해줬다
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAdminUser'
),
}
그랬더니 500 에러가 다시 뜬다
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',#이부분
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
}
그래서 원래 코드로 다시 돌아온 뒤 저 부분을 추가해줬더니
new error... 401 에러가 뜬다.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
}
default_permission_classes가 없어도 된다길래 지워봤더니
401 에러가 뜬다
흠... 인증문제라고 하니까
elasticsearch username이랑 password를 넣어서 curl을 날려봐야겠다는 생각에
걔네 찾기 시작
그리고 우선 localhost를 모든 네트워크주소를 받기위해 config/elasticsearch.yml 파일 안에 network부분을 수정해줬다
그리고 ... django jwt auth 관련 문젠가 싶어서...
Django-Rest-Framework(DRF)로 JWT 기반 Authentication 세팅하기(with simplejwt) — 초기 환경 세팅(1)
앞서 포스팅했던 소셜 로그인 구현에서 생각보다 많은 개발자 분들이 봐주신 덕분에 상위노출도 되어 기뻤지만, 이전 코드를 다시 보니 많이 부족하단 생각이 들었다. 특히 JWT 부분에서 이해력
medium.com
Custom users using Django REST framework | Kraken Systems Ltd.
The built-in Django User model follows the pattern consisted of username, email and password. In this tutorial you will learn to RESTfully simplify it to just email and password.
krakensystems.co
얘네를 참고해서 settings.py랑 server_project/url.py를 필요한 부분만 참고해서 수정했다
그랬더니
다시 코드에서 오류 발생~~
ModuleNotFoundError
"""
Django settings for server_project project.
Generated by 'django-admin startproject' using Django 5.0.1.
For more information on this file, see
https://docs.djangoproject.com/en/5.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.0/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-z@wc=dyzhqdbnscmmlfev2fy=+!xu70rig3bh_on80w!fm2-c6'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # Django REST framework 사용을 하기 위함
'search_app' # 이전에 생성한 애플리케이션
#django-rest-auth
'dj_rest_auth',
'dj_rest_auth.registration',
#django-allauth
'allauth'
]
AUTH_USER_MODEL = 'accounts.User'
SITE_ID = 1
#DEFAULT_PERMISSION_CLASSES는 API에 접근 시에 인증된 유저, 즉 헤더에 access token을 포함하여 유효한 유저만이 접근이 가능하는 것을 Default로 설정
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'dj_rest_auth.jwt_auth.JWTCookieAuthentication',
),
}
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = None
REST_USE_JWT = True
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'server_project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'server_project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/5.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/
STATIC_URL = 'static/'
# Default primary key field type
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
내가 생각해도 엉망이다
뭘 알고 넣어야지...
오류가 너무 많이 나서
"""
Django settings for server_project project.
Generated by 'django-admin startproject' using Django 5.0.1.
For more information on this file, see
https://docs.djangoproject.com/en/5.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.0/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-z@wc=dyzhqdbnscmmlfev2fy=+!xu70rig3bh_on80w!fm2-c6'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # Django REST framework 사용을 하기 위함
'search_app' # 이전에 생성한 애플리케이션
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
}
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'server_project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'server_project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/5.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/
STATIC_URL = 'static/'
# Default primary key field type
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
다시 원래대로 돌려준다
그리고 runserver 했는데
로그인 비밀번호 화면이 생겼다
로그인... 뭔 정보를 입력하라는건지
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
"USER": "user",
"PASSWORD": "password",
"HOST": "127.0.0.1",
"PORT": "8000"
}
}
settings.py에 얘네 추가해서 얘네 user랑 password 했는데 안됨
그래서 어차피 지금 확인만 하는거니까 걍 인증하는걸 없애버려야겠다고 생각.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [],
'DEFAULT_PERMISSION_CLASSES': [],
}
#server_project/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('search_app.urls')),
path('search/', include('search_app.urls')) # search/ URL 패턴 추가
]
없앴는데...
여전히 로그인화면이 뜬다...
어떡하라고, 어떻하라고, 어떡콰라고, 어뜨카라고, 억떡 하라고, 우뜨카라고, 모루카라고, 오픈카라고, 엉뜨켜라 고, 엉뚱하라고, 오또카라고 어떡하라고, 어띃하라고, 어 떡콰라고, 어뜨카라고, 억떡하라고, 우뜨카라고, 모루카 라고, 오픈카라고, 엉뜨켜라고, 엉뚱하라고, 오또카라고, 어떡하라고
일단 성공한 뒤 시나리오
1. n-gram 적용으로 수정
- 위에까지 진행한 코드는 '주린이' 라는 단어가 있으면 '주' 만 검색했을 때 검색이 안된다.
2. n-gram으로 검색 안되는 신조어 및 일부 단어 처리
- 사용자 사전은 한 줄에 하나의 합성어를 정의하며 한 줄은 합성어 어근 어근 ··· 어근 형태로 whitespace를 구분자로 하여 정의
- 어근은 필요에 따라 여러 개를 적어도 되고 안 적어도 됨- txt 파일로 사용자 사전을 작성
txt 파일 이름이 userdict_ko.txt일 경우 적용되도록 넣는 setting_bulk.py 코드↓
# search_app/setting_bulk.py
"settings": {
"index": {
"analysis": {
"tokenizer": {
"nori_user_dict": {
"type": "nori_tokenizer",
"decompound_mode": "mixed",
"user_dictionary": "userdict_ko.txt"
}
},
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "nori_user_dict"
}
}
}
}
}