본문 바로가기

반응형

Elastic Search

(10)
[Elastic Search] MBTI 검색 프로젝트 - 3. API 구축하기 MBTI 검색엔진 데이터를 API 형태로 전달합니다. API 목록 전체 문서에서 각 MBTI 타입별 상위 100개 키워드 출력 - 문서 수 기준 MBTI 유형 중 E 또는 I 유형에 따라 상위 100개 키워드 출력 MBTI 유형 중 E 또는 I 유형에 따라 검색어를 입력하여 검색된 상위 100개 키워드 출력 구현한 API는 다음과 같습니다. 전체 문서에서 각 MBTI 타입별 상위 100개 키워드를 출력 @app.get('/top/keywords/{mbti_type}') def get_top_keywords(mbti_type: str, q:Optional[str]=None): es_query = { "size": 0, "query": {"match": {"keyword": mbti_type}}, "aggs..
[Elastic Search] MBTI 검색 프로젝트 - 2. Emoji 검색 및 Aggregation(3편) Re-Index 막상 이모티콘 검색을 해보니 각 원문에서 이모티콘이 얼마나 포함되어 있는지, 어떤 이모티콘이 가장 많이 있는지 검색해보자 그전에 사전 준비 작업으로 text field로 들어간 데이터에서 키워드를 추출(Es 내부에서는 Term)할 수 있도록 인덱스를 구성하고 전체 문서에서 키워드 빈도수를 기준으로 데이터를 추출하는 방법을 찾아봅니다. 인덱스 구성 PUT /mbti_term { "settings": { "analysis": { "analyzer": { "nori_mixed": { "tokenizer": "nori_t_mixed", "filter": "shingle" }, "nori_pos_noun": { "type": "custom", "tokenizer": "nori_t_mixed", "..
[Elastic Search] MBTI 검색 프로젝트 - 2. Emoji 검색 및 Aggregation(2편) 기존 콘텐츠에서 이모티콘만 파싱 하여 데이터를 RDB에 수집하였습니다. (ES Analyzer에 regex filter를 적용하여 분석하는 것은 다음에 진행해보겠습니다!) 스키마를 다음과 같이 구성하고 데이터를 Insert 하였습니다(RDB) T: t_emoji_dashboard Columns: emoji, mbti_type(MBTI 타입 입니다), emoji_count(각 문서별 등장 횟수입니다) SELECT emoji, mbti_type, sum(emoji_count) FROM t_emoji_dashboard WHERE emoji = '😘' GROUP BY emoji, mbti_type ORDER BY mbti_type, sum DESC 사용한 쿼리로 조회한 결과입니다. (특정 이모티콘만 조회하였습니..
[Elastic Search] MBTI 검색 프로젝트 - 2. Emoji 검색 및 Aggregation MBTI 별 특성을 파악하는 프로젝트를 진행 중입니다. 수집된 텍스트들을 보니 이모지가 많이 사용되고 있는 걸 찾을 수 있었습니다. ###Q: Emoji가 ElasticSearch 에서 검색이 되나요? ###A: 네 Emoji도 텍스트로 취급되기 때문에 검색이 잘 됩니다! 하지만 모든 이모지를 검색하여 문서 수가 얼마나 있는지 파악하기는 쉽지 않습니다. 그래서 이미 수집된 데이터에서 이모지만 파싱 해봅시다. 저는 Python의 Regex를 이용해서 이모지를 추출했습니다. import pandas as pd import re # ... DB에서 데이터를 가져오는 부분은 생략 # df는 칼럼으로 contents(수집된 텍스트), doc_url(텍스트의 url)을 가지고 있음 emoji_pattern = re..
[Elastic Search] MBTI 검색 프로젝트 - 1. 검색 Score 튜닝 현재 엘라스틱서치를 이용해 수집한 데이터(MBTI 타입별 텍스트 데이터)를 조회하는 프로젝트를 진행하고 있습니다. 여기서 MBTI 타입과 스마트폰(아이폰 또는 갤럭시)의 상관성을 분석하기 위해 ES의 쿼리를 튜닝하고 있습니다. 인덱스 구성 콘텐츠 내부에서 명사만 추출하여 분석하기 위해 nori_noun이라는 분석기를 별도로 생성하여 필드로 설정했습니다. { "mbti" : { "aliases" : { }, "mappings" : { "properties" : { "comment_cnt" : { "type" : "integer" }, "contents" : { "type" : "text", "fields" : { "full" : { "type" : "keyword" }, "nori_mixed" : { "t..
[Elastic Search] 검색 구현하기(with Fast API) ES로 검색엔진을 구현하였다. 구현된 검색 엔진을 실제 서비스처럼 사용하기 위해 REST API를 구현해보자. REST API의 로직은 단순하게 본다면 2단계이다. 1. 사용자가 검색 키워드를 입력한다. 2. 검색 키워드에 해당하는 문서를 찾는다. 사용자 입력 구현 사용자 입력 구현에서 고려할 점은 단순하게 하나의 키워드만 입력받아서 문서를 상세하게 검색할 수는 없다는 것이다. 유사어, 제외어, 여러 키워드, And 조건, Or 조건 등 다양한 조건으로 검색이 가능하면 사용자에게 더 좋은 검색 시스템이 될 수 있다. 그래서 검색 키워드에서 사용할 수 있도록 특수 커맨드를 정리해보았다. 단일 검색: search= 예) 맨투맨 유사어 검색: search= 예) 맨투맨 +아디다스 => 맨투맨이 포함된 문서에서..
[Elastic Search] Nori Tokenizer & Filter 적용기 이전 글에서 Elastic Search의 쿼리들을 공부하면서 조금 더 자세하게 데이터 조회를 해보고 싶었다. 그래서 저장된 텍스트들에 한글 형태소 분석기를 적용하여 검색을 좀 더 자세히 할 수 있는 방법을 찾아보았다. Elastic Search 한글 형태소 분석기 Elastic Search 7.0 이후 버전부터는 Nori(노리)라는 한글 형태소 분석기를 사용할 수 있다. (공식적으로는 6.6 버전 이후부터 제공) Nori의 설치는 아래 링크를 참조하여 진행한다. https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-nori.html 현 상황 기존에는 아래와 같이 인덱스 & 분석기를 구성하였다. { "settings": { "inde..
[Elastic Search] Query 스터디-3편 필드 가중치, 논리 쿼리, 패턴 검색 필드에 가중치 두기 특정 필드에 가중치를 두는 방법을 사용 - 부스팅 기법. 즉 검색하는 여러 필드 중 중요한 필드를 알고 있다면 그 필드에 가중치를 두어 더 상위로 검색 결과를 올리는 방법 GET product/_search { "query": { "multi_match": { "query": "맨투맨", "fields": [ "category2", "title^2" ] } } } 특정 필드에 가중치를 줘서 특정 필드의 스코어 값을 N배 해주는 효과를 준다. 위 쿼리에서는 title 필드에 2배의 효과를 주었다. 즉 title 필드에서 검색한 결과 스코어에 2배의 효과를 주어 검색 결과를 상위로 올렸다. 논리 쿼리 논리 쿼리는 복합 쿼리로, match, multi_math, match_phrase 등을..

반응형