'search'에 해당되는 글 28건

  1. 2017.07.31 [Lucene] SynonymFilter -> SynonymGraphFilter + FlattenGraphFilter
  2. 2017.07.31 [미미박스 검색이야기] 뷰티풀 솔루션 (Beautyfull Solution)
  3. 2017.07.28 [미미박스 검색이야기] Quick Search - 퀵서치
  4. 2017.07.17 [Elasticsearch] Multi Search API 사용
  5. 2017.06.23 [Arirang] 사전 기반으로만 형태소 분석 처리 해보기
  6. 2017.06.09 [Arirang Analyzer - lucene 6.5.0] Term startOffset 정렬 오류
  7. 2017.05.31 [검색] SEO 태그 가이드
  8. 2017.05.19 [미미박스 검색이야기] 상세검색 필터 개선
  9. 2017.03.31 [미미박스 검색이야기] 검색 홈 개인화 추천 서비스 오픈!!
  10. 2017.03.16 [미미박스 검색이야기] PC웹 검색 결과 내 검색어 추천 상품 제공

[Lucene] SynonymFilter -> SynonymGraphFilter + FlattenGraphFilter

ITWeb/검색일반 2017.07.31 18:37

오늘 뭐 좀 보다가 그냥 공유해 봅니다.
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html


lucene 6.6 에서는 SynonymFilter@Deprecated 되어 있습니다.

대체 filter 는 글에도 나와 있지만 SynonymGraphFilter 인데요.

재밌는건 이넘은 search time 에서 동작 하는 거라 index time 에는 여전히 SynonymFilter 또는 FlattenGraphFilter 를 사용해야 한다는 점입니다.

아직 깊게 분석해보지 않아서 ^^; 


간만에 lucene 코드 까서 이것 저것 테스트 해보니 재밌내요.

그냥 참고 하시라고 올려봤습니다.


저작자 표시 비영리 변경 금지
신고
Trackback 0 : Comment 0

[미미박스 검색이야기] 뷰티풀 솔루션 (Beautyfull Solution)

ITWeb/미미박스검색이야기 2017.07.31 16:03

2017년 7월 31일.

고객의 고민 해결을 위한 서비스를 이커머스 회사에서 이렇게 해냅니다. ^^


물건을 팔기 위함이 목적이 아닌 고객의 고민을 해결해 드리기 위해 기획하고 만든 서비스 입니다.

아직 부족한 점이 많지만 고객님들의 고민이 해결 되는 그날까지 최선을 다 해보겠습니다.


경험해 보기)

https://m.search.memebox.com/memebox/solution/home


검색어 입력 방법)

일반적인 얼굴 부위에 대한 메이크업 고민, 피부 트러블에 대한 고민, 스킨케어에 대한 고민을 입력해 주시면 됩니다.


예)

"얼굴이 너무 커요"

"유분이 많아서 화장이 무너져요"



※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.


저작자 표시 비영리 변경 금지
신고
Trackback 0 : Comment 0

[미미박스 검색이야기] Quick Search - 퀵서치

ITWeb/미미박스검색이야기 2017.07.28 16:35


기능 적용한지 좀 되었는데 이제야 홍보 합니다. ^^;


퀵서치라는 기능은 기본적으로 모바일 환경에서 검색어를 입력하지 않고 검색 필터 기능을 활용해서 쉽게 원하는 조건의 상품을 검색해서 볼 수 있도록 제공하기 위해 만들어 졌습니다.


더불어 해당 영역은 검색 이외 "바로가기" 기능이나 특정 페이지로 랜딩 시키기 위한 용도로도 활용이 가능 합니다.


구경하기)

http://m.search.memebox.com/





※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.


저작자 표시 비영리 변경 금지
신고
Trackback 0 : Comment 0

[Elasticsearch] Multi Search API 사용

Elastic/Elasticsearch 2017.07.17 12:48

2.X 랑 5.X 랑 크게 바뀐 부분은 없습니다.

다만 5.X 에서는 template 지원도 함께 됩니다.


참고문서)

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html


Multi Search API를 얼마나 많은 분들이 사용하고 계신지는 잘 모르겠습니다.

이 API 를 한 줄로 정의 하면 "통합 검색 API" 라고 할 수 있습니다.

뭐 동의 하지 않으시는 분들이 계시다면 어쩔수 없구요.


설명을 풀어서 하면, 서로 다른 query 를 하나의 index 에 질의 하거나 하나의 query 를 서로 다른 index 로 질의 할 때 사용 하시면 유용 합니다.


Case 1)

Single Query + Multi Index


Case 2)

Multi Query + Single Index


Case 3)

Multi Query + Multi Index


위 참고문서 에서는 Request 에 대한 내용은 나와 있지만 실제 Response 에 대한 예시는 나와 있지 않아 실제 실행 보지 않고서는 어떻게 결과가 나올지 모르실 수도 있습니다.

(사실 상상은 되실거예요.)


아래는 제가 테스트로 하나의 클러스터에 "Case 3" 으로 실행한 결과 입니다.


Request API)

Endpoint : http://xxxx/_msearch

Method : POST (raw)


Request Query)

{"index":"service_product"}

{"query":{"match_all":{}},"from":0,"size":1}

{"index":"service_item"}

{"query":{"term":{"title":{"value":"틴트"}}},"from":0,"size":1}


Response Data)

{

    "responses": [

        {

            "took": 1,

            "timed_out": false,

            "_shards": {

                "total": 1,

                "successful": 1,

                "failed": 0

            },

            "hits": {

                "total": xxxxxx,

                "max_score": 1,

                "hits": [

                    {

                        "_index": "service_product_201707171215",

                        "_type": "deal",

                        "_id": "7510",

                        "_score": 1,

                        "_source": {

                        ... 생략 ...

                        }

                    }

                ]

            }

        },

        {

            "took": 1,

            "timed_out": false,

            "_shards": {

                "total": 1,

                "successful": 1,

                "failed": 0

            },

            "hits": {

                "total": xxxxxx,

                "max_score": 7.0183215,

                "hits": [

                    {

                        "_index": "service_item_201707171215",

                        "_type": "item",

                        "_id": "1170617",

                        "_score": 7.0183215,

                        "_source": {

                            ... 중략 ...

                            "title": "라네즈 투톤틴트바 No.3 2g 틴트민트",

                            ... 중략 ...

                        }

                    }

                ]

            }

        }

    ]

}


결과적으로 보면, 검색엔진에서 해당 연산과 실행을 하실지 아니면 별도 API Gateway 같은 WAS 에서 연산과 실행을 하실지에 대한 문제로 트래픽과 용량을 잘 산정 하셔서 사용하시면 매우 유용하리라 생각 합니다.

(너무 오래 전에 비슷한 내용을 올린 것 같아 5.5 릴리즈 기념으로 한번 더 복습해 봤습니다.)


저작자 표시 비영리 변경 금지
신고
Trackback 0 : Comment 0

[Arirang] 사전 기반으로만 형태소 분석 처리 해보기

ITWeb/검색일반 2017.06.23 13:51

그냥 사전만 가지고 몇 가지 형태소 분석 처리를 하기 위한 팁 정보 입니다.

한마디로 노가다 입니다.

모든 부분에 공통적으로 적용 되는 것은 아니며 사용 형태에 따라 수정 하셔야 하는 부분이니 그냥 참고 정도만 하자라고 생각해 주세요.


공통)

- 복합명사 분해 시 분해 된 단어가 용언일 경우 복합명사를 사용하지 말고 확장사전에 등록해서 사용을 합니다.

  또는 분해 된 단어가 용언일 경우 찾아서 체언 처리를 해줍니다.

- 체언과 기타품사 차이는 체언은 단독으로 사용 시 형태소 분석이 되지만 기타품사는 분석 되지 않습니다.


  복합명사)

    그리는게:그리는,게:0000


  확장사전)

    그리,100000000X

    그리는게,100000000X


  분해)

    그리는게

      그리는게

    그리는

      그리


'그리는' 자체를 체언으로 분해 하고 싶을 경우 확장 사전에 체언으로 등록이 되어야 하며, 그리에 대한 용언도 동일하게 체언처리가 되어야 합니다.



- '~요', '~해요' 로 끝나는 용언 처리

  좋아요

  좋아해요


  확장사전)

    좋아,100000000X

    좋아해,100000000X



- '~져', '~져서', '~서' 로 끝나는 용언 처리

  기존 용언으로 등록된 단어를 체언으로 변경 해야 합니다.

  010000000X -> 100000000X

  '~서' 의 경우 사전에 '서,110000000X' 와 같이 등록이 되어 있어 복합명사 사전에 추가 등록을 합니다.

  복합명사 등록 시 분해된 명사에 대한 확장사전 등록이 되어 있어야 합니다.


  확장사전)

    어두워지,100000000X

    어두워,100000000X

    늘어지,100000000X

    늘어져,100000000X


  복합명사)

    어두워서:어두워서,어두워:0000

    어두워져:어두워져,어두워:0000

    어두워져서:어두워져서,어두워:0000

    늘어져서:늘어져서,늘어져:0000



- 복합용언 + '~요' 로 끝나는 용언 처리

  크고낮아요

  말려들어요


  복합명사)

    크고낮아:크고,낮아:0000

    말려들어:말려,들어:0000



- '~다', '~데' 로 끝나는 용언 처리

  크다

  작다

  큰데

  작은데

  '~다' 끝나는 용언이 형태소분리가 되기 위해서는 확장사전에 등록이 되어야 합니다.


  확장사전)

    크다,100000000X

    작다,100000000X

    큰데,100000000X

    작은데,100000000X

  


- '~ㄴ', '~은', '~는' 으로 끝나는 용언 처리

  짧은

  넒은

  튀어나온

  어울리는

    어울리,010000000X 용언 처리가 되어 있기 때문에 체언으로 fully 등록 합니다.

  잃어가는


  확장사전)

    짧은,100000000X

    넓은,100000000X

    튀어나온,100000000X

    잃어가는,100000000X

    어울리는,100000000X



- 'ㅎ' 불규칙 용언 처리

  노랗고

  동그랗고


  확장사전)

    노랗,100000000X


  복합명사)

    노랗고:노랗고,노랗:0000


- '~하', '~한' 으로 끝나는 용언 처리

  확장사전에 용언 처리가 되어 있는지 확인 합니다.

  용언 처리가 되어 있다면 체언으로 변경해 줍니다.

  확장사전에 ~하, ~한 을 제외 및 하다 동사 표기를 포함한 체언으로 등록 합니다.


  확장사전 1)

    넓적하,010000000X -> 100000000X

    넓적,100100000X

저작자 표시 비영리 변경 금지
신고
Trackback 0 : Comment 0

[Arirang Analyzer - lucene 6.5.0] Term startOffset 정렬 오류

ITWeb/검색일반 2017.06.09 10:23

[arirang-analyzer-6.5.0]

  term analyzed 시 startOffset 정보에 대한 정렬이 역전 되는 오류

  개별 term 에서의 startOffset 이 역전 되기 때문에 아래 class 의 method 에서 정렬을 다시 맞춰줍니다.

  (정상적인 방법 이라기 보다는 일단 문제를 회피하기 위한 방법 입니다.)


  Class : KoreanFilter

  Method 1 :

    private void analysisKorean(String input) throws MorphException {


  //  input = trimHangul(input);

      List<AnalysisOutput> outputs = morph.analyze(input);

      if (outputs.size() == 0) {

        return;

      }


      Map<String, KoreanToken> map = new LinkedHashMap<String, KoreanToken>();

      if (hasOrigin) {

        map.put("0:" + input, new KoreanToken(input, offsetAtt.startOffset()));

      }


      extractKeyword(outputs, offsetAtt.startOffset(), map, 0);


      Collection<KoreanToken> values = map.values();

      for (KoreanToken kt : values) {

        kt.setOutputs(outputs);

      }


      // 이 부분에서 map 에 등록된 정보를 정렬 합니다.


      morphQueue.addAll(map.values());

    }


  Method 2 :

    private void analysisKorean(String input) throws MorphException {


  //  input = trimHangul(input);

      List<AnalysisOutput> outputs = morph.analyze(input);

      if (outputs.size() == 0) {

        return;

      }


      Map<String, KoreanToken> map = new LinkedHashMap<String, KoreanToken>();

      if (hasOrigin) {

        map.put("0:" + input, new KoreanToken(input, offsetAtt.startOffset()));

      }


      extractKeyword(outputs, offsetAtt.startOffset(), map, 0);


      Collection<KoreanToken> values = map.values();

      for (KoreanToken kt : values) {

        kt.setOutputs(outputs);

      }


      morphQueue.addAll(map.values());

      // 이 부분에서 morphQueue 에 등록된 정보를 정렬 합니다.

      morphQueue.sort(Comparator.comparingInt(KoreanToken::getOffset));

    }


  Method 3 : 

    protected void extractKeyword(List<AnalysisOutput> outputs, int startoffset,

      final Map<String, KoreanToken> map, int position) {

      ... 원본 코드 생략


      // 이 부분에서 map 에 대한 등록된 정보를 정렬 합니다.

    }


  정렬 방법 :

    참고) https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java


    final List<Map.Entry<String, KoreanToken>> offsetSorts = map.entrySet().stream()

        .sorted(Map.Entry.comparingByValue(Comparator.comparingInt(KoreanToken::getOffset)))

        .collect(Collectors.toList());


    map.clear();


    offsetSorts.stream().forEachOrdered(e -> map.put(e.getKey(), e.getValue()));


  Method 4 :

    KoreanFilter 를 상속받아 CustomKoreanFilter 를 만들어 사용 하면 됩니다.


저작자 표시 비영리 변경 금지
신고
Trackback 0 : Comment 0

[검색] SEO 태그 가이드

ITWeb/검색일반 2017.05.31 16:52

- 네이버 검색 관련 가이드 : http://webmastertool.naver.com/guide/basic_optimize.naver

- 구글 검색 관련 가이드 : https://developers.google.com/search/docs/guides/search-gallery 

- 페이스북 오픈 그래프 태그 가이드 : https://developers.facebook.com/docs/sharing/webmasters#markup

- 페이스북 앱 링크 태그 가이드 : https://developers.facebook.com/docs/applinks/metadata-reference


저작자 표시 비영리 변경 금지
신고
tags : search, SEO, tag, 검색
Trackback 0 : Comment 0

[미미박스 검색이야기] 상세검색 필터 개선

ITWeb/미미박스검색이야기 2017.05.19 10:49

늦었지만 그래도 열심히 작업한 내용이니 공유해 봅니다.

이 작업 내용은 좀 큰 작업이였습니다.

상세검색 기능이 있었지만 실제 사용양이 거의 없다고 할 정도로 충격적이였습니다.

우선 모바일 경험에서 보면 숨겨 놓은 것 자체가 많이 쓰지 말라는 것과 같은 것인데 시간이 없다는 이유로 .... ㅡ.ㅡ;

그래서 대표가 되는 검색 필터를 밖으로 끄집어 냈습니다.


결과는 기존 대비 5배에서 7배 정도의 사용성 개선 효과가 있었습니다.

각 플랫폼 별로 보면 android 는 5배 개선, ios 와 mobile web 은 7배 개선이 되었습니다.


앞으로도 더 좋은 모습으로 찾아 뵙겠습니다.


구경하기)

http://m.search.memebox.com/



※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.

저작자 표시 비영리 변경 금지
신고
Trackback 0 : Comment 0

[미미박스 검색이야기] 검색 홈 개인화 추천 서비스 오픈!!

ITWeb/미미박스검색이야기 2017.03.31 16:07

3월의 마지막 드디어 미미박스 검색 홈에 개인화 추천 상품 서비스가 오픈이 되었습니다.


구경하러 가기)

https://m.search.memebox.com


추천 상품을 다양하게 보고 싶으시다면 검색 기능 활용을 많이 해보시면 좋습니다.

대부분의 추천 상품들은 협업필터를 이용해서 구성이 되어 있습니다.


2. 비슷한 취향의 고객님이 선택한 상품

이 기능은 user to user CF를 이용해서 추출 하였습니다.

저희는 데이터의 규모가 크지 않아서 sampling 을 100% 로 적용했습니다.


4. 많이 본 상품과 연관된 추천상품

이 기능은 item to item CF를 이용해서 추출 하였습니다.


각 추천 영역별 설명은 아래 이미지를 참고 하시면 됩니다.


※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.

저작자 표시 비영리 변경 금지
신고
Trackback 0 : Comment 0

[미미박스 검색이야기] PC웹 검색 결과 내 검색어 추천 상품 제공

ITWeb/미미박스검색이야기 2017.03.16 12:33

작년 10월에 만들어 놨던 추천 데이터 마트 인데 이제야 겨우 PC웹에만 적용이 되었습니다.

우선 검색어 추천 상품은 어떻게 만들어 질까요?


기본 데이터 생성 로직은 아래와 같습니다.


Step 1)

검색을 한 사용자들의 검색어 로그를 수집 합니다.


Step 2)

검색 결과에서 클릭이 발생한 상품 정보를 수집 합니다.


Step 3)

검색어 + 클릭이 발생한 상품 정보에 대한 통계 분석을 하고 RDBS 에 저장 합니다.


Step 4) 

저장된 데이터를 서비스하기 위해 별도 색인 및 API 서버로 데이터를 제공 합니다.


이 과정을 거쳐 아래와 같은 결과가 나오게 됩니다.


검색어)

메이크업


결과)


사실 보통 검색어 별 최대 20개 까지의 추천 상품을 만들어 놓게 되는데요.

왜 3개만 보여 주고 있는지 저는 이해할 수 없지만, 추후 개선해 보자고 설득해 보려 합니다.

만들어진 데이터는 더보기 버튼을 넣어서 보여 주는게 더 좋겠다는 개인적인 생각 입니다.

더 보고 싶은 고객은 더 볼 것이고 보고 싶지 않은 고객은 안 볼 것이고 만들어 놓고 그냥 포기 하는건 지금도 이해가 잘 안되내요.


더 좋은 추천 상품을 제공 할 수 있도록 노력하겠습니다. ^^


※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.


저작자 표시 비영리 변경 금지
신고
Trackback 0 : Comment 0