'2016/11'에 해당되는 글 17건

  1. 2016.11.08 [미미박스 검색이야기] 자동완성이란? 2
  2. 2016.11.08 [미미박스 검색이야기] 인기검색어란?
  3. 2016.11.07 [미미박스 검색이야기] 미미박스는 정확도 우선 검색 기능을 제공 합니다.
  4. 2016.11.07 [미미박스 검색이야기] 시작하며
  5. 2016.11.02 [Elasticsearch] Elasticsearch 5.0 GA 살펴보기 - 2
  6. 2016.11.02 [Elasticsearch] Elasticsearch 5.0 GA 살펴보기 - 1
  7. 2016.11.01 [Elasticsearch] Multi fields 질의

[미미박스 검색이야기] 자동완성이란?

ITWeb/미미박스검색이야기 2016. 11. 8. 18:06

자동완성이란?

네이버 지식백과에서는 아래와 같이 나옵니다.

https://search.naver.com/search.naver?where=kdic&query=%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1&ie=utf8&sm=tab_nmr


그냥 제가 정의 하는 자동완성은 검색어에 대한 recommendation 이나 suggestion 기능이라고 생각 합니다.

미미박스에서 구현하고 있는 자동완성 기능은 아래와 같습니다.


기본은 검색결과가 있는 검색어를 대상으로 로그를 수집하며, 최근 일주일 데이터를 기반으로 Near Real Time 반영을 하고 있습니다.

이유는 좀 전까지 존재하던 검색어의 검색결과가 없어지게 되는 경우가 있습니다. 이를 반영해 주기 위해 NRT 색인을 하고 있습니다.


1. 초성 입력에 대한 검색어 제안이 가능 합니다.

검색어 입력) ㅁㅁㅂㅅ



2. 자소분리 입력에 대한 검색어 제안이 가능 합니다.

검색어 입력) 미밉 -> ㅁㅣㅁㅣㅂ


자소 단위 검색은 입력한 자음과 모음을 분리해서 검색이 가능 하도록 해주는 기능 입니다.


3. 한영 변환에 대한 검색어 제안이 가능 합니다.

검색어 입력) alalqkrtm


※ 한영 변환의 경우 영타로만 입력이 가능 할 경우 유용하게 사용할 수 있는 기능이며 자동으로 지원 됩니다.


4. 자동완성 검색어에 대한 검색 베스트 딜 제안이 가능 합니다.

검색어 입력) 미미박스 브러쉬 (선택)


5. 자동완선 검색어에 대한 매칭 검색어에 강조 표기가 가능 합니다.

검색어 입력) 아임미미


6. 바로보기 라는 카테고리와 브랜드 필터 추천이 가능 합니다.

검색어 입력) 틴트


※ 바로보기 란? 우선 급하게 작명을 하다 보니 너무 뻔한 "추천필터", "추천카테고리", "추천브랜드" 등등으로 넣기가 싫었습니다. 하지만 개발자의 작명 실력으로 인해 이름과 기능에 대한 오해를 만들게 되었는데요. 이 기능은 검색어를 기반으로 한 추천 카테고리와 추천 브랜드를 보여주는 검색 필터링 기능 이며, 검색 결과 화면에서 제공되는 카테고리, 브랜드 필터 기능이 되겠습니다.


※ 저 추천 카테고리와 브랜드는 검색어가 완성형으로 입력이 되었을 때만 노출이 되게 됩니다. 이유는 사용자가 입력한 검색어를 조작하지 않기 위함이며 정확한 의도를 반영해 주기 위해서 이와 같이 구현하였습니다. 이 필터와 함께 사용하시면 원하시는 상품에 대한 대상을 좁혀서 검색을 하실 수 있게 됩니다.



좀 더 사용하기 편한 기능과 도움이 되는 정보를 제공드릴 수 있도록 노력 하겠습니다.


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

:

[미미박스 검색이야기] 인기검색어란?

ITWeb/미미박스검색이야기 2016. 11. 8. 13:13

현재 미미박스 인기검색어 (이하 인검 이라고 합니다.)는 이전 인검과 달라진 점이 있습니다.

이전의 미미박스 인검은 하루 전날 인입된 검색 질의 누적 카운트로 상위 20개를 뽑아 보여 주는 형식이었습니다.

하지만 미미박스 서비스 특성상 하루 전날 데이터를 기반으로 생성하는 인검은 거의 변동이 없었으며 늘 보던 인검이 노출 되는 모습이었습니다.


즉, 인기검색어에 대한 정의를 다시 해야 했고 사용자들이 서비스에 들어와서 어떤 검색을 많이 하고 있는지 보여줘야 한다고 생각을 했습니다.


일반적으로 인기검색어는 그때 그때 트렌드를 보여 주는 도구로도 사용을 할 수 있습니다.

네이버의 실시간 인기검색어를 보시면 아실 수 있을 것 같습니다.


미미박스에서 인기검색어란?)

검색 결과를 포함한 검색어로 총 누적 카운트 기준 Top 20개를 인기검색어라고 정의 한다.

인기검색어의 누적 카운트 반영 주기는 실시간성을 반영해 주어야 한다. (최근 10분 단위 로그 반영)

단순 누적 카운트이외 인기검색어에 대한 랭킹을 적용해 주어야 한다.

- 내부 정책에 따른 Query Count와 Click Count 등의 정보를 추가하여 가중치를 별도 부과 하고 있다.


처음 부터 최근 10분단위 인검을 적용하지는 않았습니다.

미미박스의 경우 대형 온라인 쇼핑몰에 비해 상품의 종류나 수, 사용자에 대한 규모가 다르기 때문에 미미박스에 맞는 인검 로직과 주기를 찾아야 했습니다.


초기에 하루 단위 데이터를 분석하고 각 시간별 데이터를 분석하고 어떤 데이터가 트렌드를 반영 할 수 있을지를 판단해서 결정한게 10분 이였고 지금의 인검 데이터가 된 것입니다.


역시나 새벽 시간에는 10분으로 할 경우 Top 20개를 채울수가 없어 새벽 시간에만 1시간 단위로 인검을 반영하고 있긴 합니다.


인검에 대한 개선은 앞으로 더 꾸준히 해야 합니다.

이유는 인검에 대한 사용성이 그다지 높지 않기 때문이기도 하고 누구를 위한 인검인지 그리고 고객에게 어떤 유의미한 인검을 제공해 줘야 하는지 고민이 되어야 할 것 같습니다.


더불어 검색 홈 개발이 들어가게 됩니다. 다양한 검색  콘텐츠를 제공할 예정이니 많이 애용해 주세요. ^^;


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

:

[미미박스 검색이야기] 미미박스는 정확도 우선 검색 기능을 제공 합니다.

ITWeb/미미박스검색이야기 2016. 11. 7. 12:19

[간단 요약]

미미박스 검색서비스에서는)

1. 정확도 우선의 검색 기능을 제공 하고 있습니다.

2. 정확도 우선의 검색 기능을 활용하기 위해서는 검색어에 대한 띄어쓰기중요합니다.

3. 검색 태그 관리가 중요 합니다. (아직 검색 태그에 대한 개선 작업을 못하고 있습니다.)


참고자료)

Precision 과 Recall


제가 미미박스에 합류하게 된 이유는

1. 검색 서비스에 대한 개발을 제가 주도적으로 할 수 있을 것 같아서와 

2. 해야할 게 많을 것 같다 라는

것 때문 이었습니다.


예전 미미박스 검색은 형태소 분석기에 의존적인 검색 기능을 제공하고 있었습니다.

이 방법이 틀렸다 나쁘다는 것은 절대 아닙니다.

단, 형태소 분석기 의존적으로 검색 기능을 제공하기 위해서는 사전 관리가 매우 중요합니다.


여기서 사전관리는 포괄적인 사전 관리를 의미 하며, 단순 유의어/동의어 관리 수준을 의미 하는 것이 아닙니다.


미미박스에서는 검색 서비스는 아래와 같이 분리가 되어 진행 되고 있었습니다.

1. Native App

2. PC Web

3. Mobile Web


각 서비스 마다 제공되는 검색 기능이 달랐으며, 가장 중요하게 생각했던 서비스는 App 이였기 때문에 PC Web, Mobile Web에 대한 검색 기능 개선은 관심 밖이였던 것 같습니다.


보통 e-커머스 서비스에 들어오는 고객들은 크게 두 분류로 나뉘다고 생각 합니다.

1. 불특정 목적으로 방문하는 고객

2. 특정 목적으로 방문하는 고객


이 두 고객의 행동 특성은 검색 관점에서 아래와 같이 분류 된다고 생각 합니다.

1. 단순 브라우징 검색을 하는 고객

2. 목적성을 갖는 검색어를 통한 검색을 활용하는 고객


어쨌든 미미박스에서 검색서비스 기능은 통합 검색창 이외 어떤 기능도 제공이 되고 있지 않았습니다. (PC Web, Mobile Web)

단, native app은 일부 정렬과 검색 필터 기능을 포함하고 있었습니다.

그래서 미미박스 검색서비스를 완전 바닥 부터 새로 만들기로 하였습니다.


제가 처음 검색 개편을 이야기 하면서 e-커머스 에서 검색 서비스는 기본적으로 정확도(precision)가 중요하다고 이야기를 하였고 미미박스도 정확도 우선의 검색 서비스를 제공해 줘야 한다고 했습니다.


제가 제시한 정확도는 사용자가 입력한 검색어와 정확히 일치하는 문서에 대해서 검색이 되어야 한다는 것이었습니다.

이와 같이 변경이 될 경우 띄어쓰기는 매우 중요해 집니다.


예) 정확도 우선 시 검색어 적용 예시


1번은 "포니" + "립스틱" 라는 두 개의 검색어가 포함된 문서를 검색해 주며, 반드시 두 개의 검색어를 문서가 포함하고 있어야 합니다.

- 1번의 의도는 포니라는 제품과 립스틱 이라는 제품에 대한 AND 또는 OR 검색을 원한다고 생각 할 수 있습니다.


2번은 "포니립스틱" 라는 하나의 검색어가 포함된 문서를 검색해 줍니다.

- 2번의 의도는 포니립스틱이라는 단일 제품을 원한다고 생각 할 수 있습니다.


하지만 기존 사용자들은 정확도 우선으로 검색 경험을 가지고 있지 않았기 때문에 띄어쓰기에 대한 개념이나 활용에 대해서 인지를 못하고 있습니다. 여전히 띄어쓰기를 활용한 검색 패턴이 늘어나지 않고 있는 이유 이기도 한 것 같습니다.


결과적으로 검색을 하는 사용자들은 자신이 찾고자 하는 상품을 잘 찾을 수 있어야 하고 그 대상이 너무 많이 노출 되게 되면 상대적으로 상품을 클릭하기 보다 이탈을 하게 되는 경우가 많이 발생하게 됩니다.

이렇기 때문에 검색에서는 narrow down search 기능을 제공을 해줘야 하고 그에 맞는 검색 필터링 기능이 제공되어야 합니다.


좀 두서 없이 쓰다 보니 내용의 본질이 뭔지 전달이 잘 안되는 것 같내요.


정리 하겠습니다.

미미박스 검색서비스에서는)

1. 정확도 우선의 검색 기능을 제공 하고 있습니다.

2. 정확도 우선의 검색 기능을 활용하기 위해서는 검색어에 대한 띄어쓰기가 중요합니다.

3. 검색 태그 관리가 중요 합니다. (아직 검색 태그에 대한 개선 작업을 못하고 있습니다.)


앞으로 고객 요구에 맞는 검색 기능을 제공 할 수 있도록 노력 하겠습니다.


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

:

[미미박스 검색이야기] 시작하며

ITWeb/미미박스검색이야기 2016. 11. 7. 11:36

오늘 부터 미미박스에서 검색 서비스에 대한 이야기를 블로그에 정리해 볼까 합니다.

개인적으로 회사에 소속되어 있으면서 서비스를 하고 싶은 방향에 맞춰서 빠르게 개발하고 적용 할 수 있다는게 얼마나 좋은지 모릅니다.


하지만 저희 팀에서 개발하고 배포하고 하면서 고객들에게 기능에 대한 설명이라던가 사용법에 대해서는 한번도 설명을 해주거나 도움을 주기 위한 채널을 만들지 못하는 것 같아 그냥 서비스에 대한 기능 위주로 어떻게 만들어졌고 어떻게 동작하는지 정리를 하고자 합니다.


생각 보다 잦은 기능 변경도 많고 눈에 띄는 것 그렇지 않은 것 등등 매주 많은 변화가 있지만 사실 사용하는 사람들에게는 뭐가 어떻게 바뀌었고 어떻게 사용해야 좋은지 전혀 전달해 주지 못했습니다.


이제 부터 하나씩 하나씩 미미박스 검색 서비스에 대한 이야기를 풀어 보도록 하겠습니다.

:

[Elasticsearch] Elasticsearch 5.0 GA 살펴보기 - 2

Elastic/Elasticsearch 2016. 11. 2. 17:49

site plugin head 설치를 해보려 합니다.

설치 방법이 달라졌습니다.


[사전준비]

Elasticsearch 5.0 GA 살펴보기 - 1 에서 클러스터 구성

그냥 bin/elasticsearch, bin/elasticsearch 두 번 하시면 됩니다.


[설치 명령어]

https://www.elastic.co/guide/en/elasticsearch/plugins/current/installation.html#_core_elasticsearch_plugins


$ bin/elasticsearch-plugin install [plugin-name]


[Head Plugins]

https://github.com/mobz/elasticsearch-head#running-with-built-in-server


설치 방법은 위 문서에 잘 나와 있습니다.

아래는 제가 그냥 실행한 명령어를 나열 하였습니다.


$ git clone git://github.com/mobz/elasticsearch-head.git

$ cd elasticsearch-head/

$ npm install

$ sudo npm install -g grunt-cli

$ grunt server


[Head 접속]

$ open http://localhost:9100

- cross origin  정책으로 인해서 초기 접속이 되지 않습니다.

- elasticsearch.yml 에 아래 내용 추가해 주시고 재실행 하시면 됩니다.


[Cross Origin 정책수정]

$ vi config/elasticsearch.yml


http.cors.enabled: true

http.cors.allow-origin: "*"




노드명이 많이 아쉽내요 ㅠ.ㅠ

:

[Elasticsearch] Elasticsearch 5.0 GA 살펴보기 - 1

Elastic/Elasticsearch 2016. 11. 2. 17:11
내년에 업그레이드를 해야 하기 때문에 한번 살펴 보고자 합니다.

오늘은 가볍게 다운 받고 압축 풀고 기본 구조가 어떻게 변경이 되었나 한번 살펴 보려 합니다.


[다운로드]

https://www.elastic.co/downloads/elasticsearch


$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.0.0.tar.gz


[압축해제]

$ tar -xvzf elasticsearch-5.0.0.tar.gz

$ ln -s elasticsearch-5.0.0 elasticsearch


[바로실행]

$ bin/elasticsearch


[2016-11-02T16:52:22,051][INFO ][o.e.n.Node               ] [] initializing ...

[2016-11-02T16:52:22,246][INFO ][o.e.e.NodeEnvironment    ] [DiStpli] using [1] data paths, mounts [[/ (/dev/disk1)]], net usable_space [734.4gb], net total_space [930.3gb], spins? [unknown], types [hfs]

[2016-11-02T16:52:22,247][INFO ][o.e.e.NodeEnvironment    ] [DiStpli] heap size [1.9gb], compressed ordinary object pointers [true]

[2016-11-02T16:52:22,248][INFO ][o.e.n.Node               ] [DiStpli] node name [DiStpli] derived from node ID; set [node.name] to override

[2016-11-02T16:52:22,268][INFO ][o.e.n.Node               ] [DiStpli] version[5.0.0], pid[14095], build[253032b/2016-10-26T04:37:51.531Z], OS[Mac OS X/10.12.1/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_72/25.72-b15]

[2016-11-02T16:52:23,487][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [aggs-matrix-stats]

[2016-11-02T16:52:23,487][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [ingest-common]

[2016-11-02T16:52:23,488][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [lang-expression]

[2016-11-02T16:52:23,488][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [lang-groovy]

[2016-11-02T16:52:23,488][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [lang-mustache]

[2016-11-02T16:52:23,488][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [lang-painless]

[2016-11-02T16:52:23,488][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [percolator]

[2016-11-02T16:52:23,488][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [reindex]

[2016-11-02T16:52:23,488][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [transport-netty3]

[2016-11-02T16:52:23,488][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [transport-netty4]

[2016-11-02T16:52:23,489][INFO ][o.e.p.PluginsService     ] [DiStpli] no plugins loaded

[2016-11-02T16:52:27,399][INFO ][o.e.n.Node               ] [DiStpli] initialized

[2016-11-02T16:52:27,399][INFO ][o.e.n.Node               ] [DiStpli] starting ...

[2016-11-02T16:52:27,809][INFO ][o.e.t.TransportService   ] [DiStpli] publish_address {127.0.0.1:9300}, bound_addresses {[fe80::1]:9300}, {[::1]:9300}, {127.0.0.1:9300}

[2016-11-02T16:52:30,900][INFO ][o.e.c.s.ClusterService   ] [DiStpli] new_master {DiStpli}{DiStpli8S4-rE5QKCPP_Lw}{bwHQPV_UTl6NSPCfx8IE3w}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-elected-as-master ([0] nodes joined)

[2016-11-02T16:52:30,974][INFO ][o.e.h.HttpServer         ] [DiStpli] publish_address {127.0.0.1:9200}, bound_addresses {[fe80::1]:9200}, {[::1]:9200}, {127.0.0.1:9200}

[2016-11-02T16:52:30,974][INFO ][o.e.n.Node               ] [DiStpli] started

[2016-11-02T16:52:30,975][INFO ][o.e.g.GatewayService     ] [DiStpli] recovered [0] indices into cluster_state


[접속]

http://localhost:9200


{
  "name" : "DiStpli",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "eA4iUJ4BSoOxmoDbLjFgoQ",
  "version" : {
    "number" : "5.0.0",
    "build_hash" : "253032b",
    "build_date" : "2016-10-26T04:37:51.531Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.0"
  },
  "tagline" : "You Know, for Search"
}



[디렉토리구조]

$ ls -al

total 56

drwxr-xr-x  12  staff    408 11  2 16:52 .

drwxr-xr-x  34  staff   1156 11  2 16:45 ..

-rw-r--r--   1  staff  11358 10 26 13:35 LICENSE.txt

-rw-r--r--   1  staff    150 10 26 13:35 NOTICE.txt

-rw-r--r--   1  staff   9108 10 26 13:35 README.textile

drwxr-xr-x  15  staff    510 10 26 13:40 bin

drwxr-xr-x   6  staff    204 11  2 16:52 config

drwxr-xr-x   3  staff    102 11  2 16:52 data

drwxr-xr-x  36  staff   1224 10 26 13:40 lib

drwxr-xr-x   6  staff    204 11  2 16:52 logs

drwxr-xr-x  12  staff    408 10 26 13:40 modules

drwxr-xr-x   2  staff     68 11  2 16:52 plugins


- 실행 후 모습 입니다.


[디렉토리 bin]

- 실행 파일들이 위치해 있습니다.


[디렉토리 config]

- elasticsearch.yml 은 그대로 존재 합니다.

- logging.yml 은 log4j2.properties 로 변경 되었습니다.

- jvm.options 가 추가 되었습니다.

기존에 실행 시 설정에 필요했던 jvm 옵션을 스크립트에 추가 하기 위해 커스텀하게 사용했는데요. 이 옵션이 생겨서 좀 더 유연해 졌내요.

- scripts 디렉토리가 생겼습니다.

잘 아시겠지만 각종 script 관련 코드를 이곳에 저장하고 읽어 들일 수 있도록 된 것 같습니다.


[디렉토리 data]

- 예전 그대로 같지만 조금 달라졌습니다.

즉, 예전에는 data/클러스터명/nodes/0 뭐 이런 식이였는데요.

지금은 data/nodes/0 으로 생성이 되내요.

클러스터명이 사라졌내요. (여전히 default cluster_name 은 elasticsearch 입니다.)


[디렉토리 lib]

- 바뀐건 종속 라이브러리가 바뀌었내요.


[디렉토리 modules]

- elastic 에서 제공하는 추가 modules 들이 들어 있습니다.


[디렉토리 plugins]

- 바뀐건 아마도 plugin 만드는 방법이 바뀌었을 것 같습니다.


[초간단 클러스터 구성 테스트]

- 기본적으로 elasticsearch 는 bin/elasticsearch 를 여러번 실행 하면 클러스터로 묶어 줍니다.

단, 인스턴스를 분리 하셔야 합니다.


$ bin/elasticsearch

[2016-11-02T17:21:04,689][INFO ][o.e.n.Node               ] [] initializing ...

[2016-11-02T17:21:04,770][INFO ][o.e.e.NodeEnvironment    ] [npjHq7P] using [1] data paths, mounts [[/ (/dev/disk1)]], net usable_space [734.4gb], net total_space [930.3gb], spins? [unknown], types [hfs]

[2016-11-02T17:21:04,771][INFO ][o.e.e.NodeEnvironment    ] [npjHq7P] heap size [1.9gb], compressed ordinary object pointers [true]

[2016-11-02T17:21:04,772][INFO ][o.e.n.Node               ] [npjHq7P] node name [npjHq7P] derived from node ID; set [node.name] to override

[2016-11-02T17:21:04,773][INFO ][o.e.n.Node               ] [npjHq7P] version[5.0.0], pid[14680], build[253032b/2016-10-26T04:37:51.531Z], OS[Mac OS X/10.12.1/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_72/25.72-b15]

[2016-11-02T17:21:05,375][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [aggs-matrix-stats]

[2016-11-02T17:21:05,375][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [ingest-common]

[2016-11-02T17:21:05,376][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [lang-expression]

[2016-11-02T17:21:05,376][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [lang-groovy]

[2016-11-02T17:21:05,376][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [lang-mustache]

[2016-11-02T17:21:05,376][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [lang-painless]

[2016-11-02T17:21:05,376][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [percolator]

[2016-11-02T17:21:05,376][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [reindex]

[2016-11-02T17:21:05,376][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [transport-netty3]

[2016-11-02T17:21:05,376][INFO ][o.e.p.PluginsService     ] [npjHq7P] loaded module [transport-netty4]

[2016-11-02T17:21:05,377][INFO ][o.e.p.PluginsService     ] [npjHq7P] no plugins loaded

[2016-11-02T17:21:06,764][INFO ][o.e.n.Node               ] [npjHq7P] initialized

[2016-11-02T17:21:06,765][INFO ][o.e.n.Node               ] [npjHq7P] starting ...

[2016-11-02T17:21:06,895][INFO ][o.e.t.TransportService   ] [npjHq7P] publish_address {127.0.0.1:9301}, bound_addresses {[fe80::1]:9301}, {[::1]:9301}, {127.0.0.1:9301}

[2016-11-02T17:21:09,996][INFO ][o.e.c.s.ClusterService   ] [npjHq7P] detected_master {DiStpli}{DiStpli8S4-rE5QKCPP_Lw}{oJ9y-SxJTYex3ZNBmRIpoQ}{127.0.0.1}{127.0.0.1:9300}, added {{DiStpli}{DiStpli8S4-rE5QKCPP_Lw}{oJ9y-SxJTYex3ZNBmRIpoQ}{127.0.0.1}{127.0.0.1:9300},}, reason: zen-disco-receive(from master [master {DiStpli}{DiStpli8S4-rE5QKCPP_Lw}{oJ9y-SxJTYex3ZNBmRIpoQ}{127.0.0.1}{127.0.0.1:9300} committed version [7]])

[2016-11-02T17:21:10,030][INFO ][o.e.h.HttpServer         ] [npjHq7P] publish_address {127.0.0.1:9201}, bound_addresses {[fe80::1]:9201}, {[::1]:9201}, {127.0.0.1:9201}

[2016-11-02T17:21:10,031][INFO ][o.e.n.Node               ] [npjHq7P] started



$ bin/elasticsearch

[2016-11-02T17:19:34,869][INFO ][o.e.n.Node               ] [] initializing ...

[2016-11-02T17:19:35,074][INFO ][o.e.e.NodeEnvironment    ] [DiStpli] using [1] data paths, mounts [[/ (/dev/disk1)]], net usable_space [734.4gb], net total_space [930.3gb], spins? [unknown], types [hfs]

[2016-11-02T17:19:35,074][INFO ][o.e.e.NodeEnvironment    ] [DiStpli] heap size [1.9gb], compressed ordinary object pointers [true]

[2016-11-02T17:19:35,076][INFO ][o.e.n.Node               ] [DiStpli] node name [DiStpli] derived from node ID; set [node.name] to override

[2016-11-02T17:19:35,079][INFO ][o.e.n.Node               ] [DiStpli] version[5.0.0], pid[14588], build[253032b/2016-10-26T04:37:51.531Z], OS[Mac OS X/10.12.1/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_72/25.72-b15]

[2016-11-02T17:19:37,110][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [aggs-matrix-stats]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [ingest-common]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [lang-expression]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [lang-groovy]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [lang-mustache]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [lang-painless]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [percolator]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [reindex]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [transport-netty3]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] loaded module [transport-netty4]

[2016-11-02T17:19:37,111][INFO ][o.e.p.PluginsService     ] [DiStpli] no plugins loaded

[2016-11-02T17:19:40,144][INFO ][o.e.n.Node               ] [DiStpli] initialized

[2016-11-02T17:19:40,145][INFO ][o.e.n.Node               ] [DiStpli] starting ...

[2016-11-02T17:19:40,356][INFO ][o.e.t.TransportService   ] [DiStpli] publish_address {127.0.0.1:9300}, bound_addresses {[fe80::1]:9300}, {[::1]:9300}, {127.0.0.1:9300}



[2016-11-02T17:19:43,625][INFO ][o.e.c.s.ClusterService   ] [DiStpli] new_master {DiStpli}{DiStpli8S4-rE5QKCPP_Lw}{oJ9y-SxJTYex3ZNBmRIpoQ}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-elected-as-master ([0] nodes joined)

[2016-11-02T17:19:43,742][INFO ][o.e.g.GatewayService     ] [DiStpli] recovered [0] indices into cluster_state

[2016-11-02T17:19:43,750][INFO ][o.e.h.HttpServer         ] [DiStpli] publish_address {127.0.0.1:9200}, bound_addresses {[fe80::1]:9200}, {[::1]:9200}, {127.0.0.1:9200}

[2016-11-02T17:19:43,750][INFO ][o.e.n.Node               ] [DiStpli] started

[2016-11-02T17:21:09,966][INFO ][o.e.c.s.ClusterService   ] [DiStpli] added {{npjHq7P}{npjHq7PlTqqiB2bhXkIxqQ}{IhQPGv_rTsyd7a1DbXFMwA}{127.0.0.1}{127.0.0.1:9301},}, reason: zen-disco-node-join[{npjHq7P}{npjHq7PlTqqiB2bhXkIxqQ}{IhQPGv_rTsyd7a1DbXFMwA}{127.0.0.1}{127.0.0.1:9301}]

[2016-11-02T17:21:10,007][WARN ][o.e.d.z.ElectMasterService] [DiStpli] value for setting "discovery.zen.minimum_master_nodes" is too low. This can result in data loss! Please set it to at least a quorum of master-eligible nodes (current value: [-1], total number of master-eligible nodes used for publishing in this round: [2])

- 친절하게 quorum 구성 하라고 메시지도 보여 주내요.

:

[Elasticsearch] Multi fields 질의

Elastic/Elasticsearch 2016. 11. 1. 13:33

요즘 추천 데이터 만드느라 도통 mapping 정보 설계나 dsl 작성을 안했더니 까먹기 일수내요.

그래서 그냥 기억하는 차원에서 가볍게 작성해 봅니다.


[참고문서]

https://www.elastic.co/guide/en/elasticsearch/reference/2.4/multi-fields.html


[설명]

- 예전에는 multi-field 라고 했고 지금은 fields 라고 합니다.

- fields 의 용도는 단일 field 에 여러가지 속성을 부여하고 싶을 때 사용을 합니다.


예를 들면)

- index:analyzed 로 선언을 했는데 정렬을 해야 할 경우.

- index:not_analyzed 로 선언을 했는데 같은 value로 fulltext 검색을 해야 할 경우.


보통은 index:analyzed 로 선언 하고 fields 로 index:not_analyzed 로 구성 하는게 많습니다.


[mappings 정보]

...중략...

"keyword": { "type":"string", "index":"analyzed", "analyzer":"edge_ngram_analyzer", "index_options":"docs", "norms": { "enabled":false },

  "fields": {

    "exact": {

      "type":"string", "index":"not_analyzed", "store":"no"

    }

  }

},

...중략...

- 위 맵핑 정보는 제가 자동완성에서 사용하는 정보를 일부 발췌한 내용입니다.


[query dsl]

{

  "query": {

    "term": {

      "keyword.exact": "향수"

    }

  }

}

- 질의는 위에서와 같이 .(dot) 을 이용해서 field 명을 사용하시면 됩니다.

: