Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

유사어 검색을 위한 라우터 추가 및 collection 추가 #103

Merged
merged 10 commits into from
Dec 19, 2019

Conversation

kgpyo
Copy link
Contributor

@kgpyo kgpyo commented Dec 17, 2019

PR에 대한 요약

유사어 검색을 위한 라우터 추가 및 collection 추가

  • 이전에 마이페이지 관련 PR을 merge하지 않고 별도의 branch를 생성하지 않아서 이전 commit 이어서 작성합니다.

PR에 대한 동기와 상황에 대한 설명 부탁드립니다.

이번 코드는 어떻게 테스트 되었나요?

  • 별도의 테스트를 진행하지 못하였습니다.
  • 기존 작성한 테스트코드는 es 와 연동한 테스트가 아니기 때문에 NODE_NEV를 이용하여 테스트가 진행하는 동안 es가 연결되지 않도록 package와 config 파일을 수정하였습니다.

결과물 스크린샷 (선택) :

2

클라이언트와 연결했을 때 동작 예상화면

3

어떤 변화인가요?

  • Bug fix (큰 변화없이 이슈를 고칩니다.)
  • New feature (큰 변화없이 기능을 추가합니다.)
  • Breaking change (기능을 추가하거나, 수정함으로서 기존의 기능에 영향을 줄 수 있습니다.)

체크리스트:

  • 본 프로젝트의 코드 스타일을 따랐습니다.
  • 이번 변화에 대한 결과로, 본 프로젝트의 문서를 수정해야 합니다.
  • 이에 따라 본 프로젝트의 문서를 적절히 갱신하였습니다.

본 PR은 다음 이슈에 해당하는 내용입니다.

Closes #48

- 개인이 판매하고 있는 물품을 조회하기 위해 기존 일래스틱 서치에서
비공개 글을 색인하지 않았던 부분 제거
- 모든 글을 색인하되, 단순 조회시 비공개글을 조회가 불가능하도록
필터 추가
- 개인 사용자의 구매내역과, 관심목록을 조회하기 위해 이를 검색
할 수 있는 쿼리 추가
- 별도의 테이블을 유지하는 것보다 하나의 테이블내에서 처리하는 것이
간편하기 때문에 interest내에서 숫자 카운트대신에 회원 아이디정보 저장
- 유사어 검색을 위해 fuzziness사용, 글자수에 따라 허용되는 편집거리
가 달라지게 하기 위해서 auto 옵션 사용(최대 2글자)
- 검색결과가 최신순만이 아니라 정확도 - 날짜순으로 배치되어야 하므로
_score 필드에 대한 정렬 추가
@kgpyo kgpyo requested review from Johnie-Yeo and sukjae and removed request for Johnie-Yeo December 17, 2019 08:24
@kgpyo kgpyo self-assigned this Dec 17, 2019
@kgpyo kgpyo requested a review from Johnie-Yeo December 17, 2019 08:26
@kgpyo kgpyo added epic:상품검색 epic feature New feature or request labels Dec 17, 2019
@kgpyo kgpyo force-pushed the product-api/search branch from 861698b to 8b20bb6 Compare December 17, 2019 11:44
Copy link
Collaborator

@Johnie-Yeo Johnie-Yeo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생많으셨습니다.

import indexRouter from './routes/index';
import productRouter from './routes/product';
import infoRouter from './routes/info';
import secretRouter from './routes/secret';
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

secretRouter 좀 더 직관적인 이름으로 변경해주세요

export const redisConnection = {
port: 6379,
host: '127.0.0.1',
password: 'test132@',
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

왜 직접적으로 노출되었나요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헉, 감사합니다;

@@ -118,7 +145,7 @@ const Core = {
if (isNotDefaultSetSortOption(sort)) {
sort = [
...sort,
{ order: 'desc' },
{ _score: 'desc', order: 'desc' },
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[질문]
score desc는 디폴트 아닌가요? 명시적으로 선언하는것이 필요한가요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 조건이 없으면 _score 가 반영이 되지 않고 출력이 되어서 관련순이 높은 순서대로 출력되지 않는 문제가 있어서 _socre sort를 추가하여 해결하였습니다.


const { Schema } = mongoose;

const KEYWORD_ANALYSIS_CYCLE = 5000;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[질문]
무슨 역할인가요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

키워드 분석 사이클 주기 입니다. 다른 변수명을 고려해보겠습니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹은 해당 작업을 다른 파일로 옮겨서 처리하도록 고려해보겠습니다 감사합니다.

@@ -192,4 +190,36 @@ Product.createMapping({
},
}, () => { });

const timer = setInterval(() => {
const title = documentsToAnalyze.title.slice(0, 100).join(' ');
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메서드가 연속적으로 호출되는 경우는 별도의 함수로 묶는다면 더 읽기 좋은 코드가 될 것 같습니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메서드로 연속적으로 호출되는 경우 가 chain 형태를 말씀하시는건가요?

}
const words = tokens
.filter(({ token }) => token.length >= 2)
.map(({ token }) => ({ word: token }));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위의 의견과 같습니다. 별도의 함수로 분리해 주세요

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

재사용이 안되는 것 같아서 그대로 두었습니다.

.map(({ token }) => ({ word: token }));
const wordSet = new Set();
words.forEach((word) => (wordSet.add(word)));
wordSet.forEach(async (word) => {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

forEach 안에서 async await이 정상작동하나요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 async는 아래와 같은 문제가 있어서 이를 해결하기 위해서 async, await로 설정하였습니다.

우선 제 의도는 wordSet이 모두 처리가 될 때 까지 해당 메소드를 대기하도록 처리하는 것을 의도하지 않았습니다. (이부분은 혼동을 피하기 위해서 다른 방법으로 변경하겠습니다.)

async - await 가 되어있지 않으면 mongoDB에 데이터가 들어가지 않는 문제가 있어서 원인은 찾지 못하여 임시방편으로 해둔 것입니다.

} catch (e) {
throw Error(e);
console.log(e);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

에러 처리 왜 로그로 끝나나요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 파일은 yarn seed 스크립트로 실행되는 스크립트입니다.
관리자가 직접 에러 로그를 확인할 수 있게 하기 위해서 console.log를 사용하였습니다.

Copy link
Collaborator

@sukjae sukjae left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.
고생 많으셨습니다!

- 자동완성을 구현할 때, '아이폰XR팝니다'를 보여주는 것이 아닌 '아'
를 입력하면 '아이폰'만 자동완성이 되게 하기 위해서 사용자가 등록한
제목을 anaylzer의 분석결과를 다시 keyword index로 저장하여 이를
사용
- 중복된 데이터 삽입을 방지하기 위해 해당 collection에서 word를
index로 지정하여 처리
- 사용자 정의 메소드 search는 모두 동일한 함수이고 공통으로 사용
되기 때문에 별도의 common폴더를 생성하여 분리
- elasticsearch와 연결하기 위해 hosts에 port정보와 함께 넣으면
no living connection 오류가 발생하므로, hosts정보와 port 정보를분리
- 키워드는 단순 목록만 출력하기 때문에 info와 묶어서 지정
- 테스트를 진행할때 순수 함수 테스트이므로 elastic search에 연결하는
과정 제거
- DB가 접속되지 않을 때 서버를 종료하여 api연결 시 실패 원인을 모르는
것보다, 500 에러를 출력하여 왜 처리가 안되는지 명확히 표시하여
클라이언트내에서 다른 처리가 가능하도록 하기 위해 변경
- 불필요한 파일 제거
- es 검색결과 내용 출력하게 반환값 수정(hits.this)
- product.static에서 esSearch속성을 조회하기 위해 bind 제거
@kgpyo kgpyo force-pushed the product-api/search branch from 8b20bb6 to a79b9a8 Compare December 18, 2019 13:42
- foreach를 제거하고 callback 함수 형 findAndUpdate로 교체
- 적당한 변수명이 생각이 나질 않아 주석 추가
@kgpyo kgpyo requested review from Johnie-Yeo and sukjae December 19, 2019 08:37
@Johnie-Yeo Johnie-Yeo merged commit 0a9e8d5 into product-api/master Dec 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
epic:상품검색 epic feature New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants