'2017/12'에 해당되는 글 9건

  1. 2017.12.27 [링크] 검색 Trend
  2. 2017.12.22 [GC] 관련 링크 모음
  3. 2017.12.21 [Elasticsearch] 실행 시 option arguments
  4. 2017.12.20 [Elasticsearch] simple query 내 synonym graph 사용
  5. 2017.12.19 [Lucene] LeafReaderContext 는...
  6. 2017.12.18 [Elasticsearch] Java Security Manager 관련
  7. 2017.12.13 [Elasticsearch] copy_to mapping 예제
  8. 2017.12.12 [Java] Executors 로 간단 multithread 테스트
  9. 2017.12.06 [Elasticsearch] Refresh interval while bulk request 2

[링크] 검색 Trend

ITWeb/스크랩 2017. 12. 27. 09:58

검색 Trend 를 알아보기 위한 대표 링크.


[네이버]

https://datalab.naver.com/


[구글]

https://trends.google.co.kr/trends/explore

:

[GC] 관련 링크 모음

ITWeb/개발일반 2017. 12. 22. 12:44
:

[Elasticsearch] 실행 시 option arguments

Elastic/Elasticsearch 2017. 12. 21. 14:13

Elasticsearch 클래스 보시면 잘 나와 있습니다.

저는 그냥 코드만 발췌했습니다.

Elasticsearch() {
super("starts elasticsearch");
versionOption = parser.acceptsAll(Arrays.asList("V", "version"),
"Prints elasticsearch version information and exits");
daemonizeOption = parser.acceptsAll(Arrays.asList("d", "daemonize"),
"Starts Elasticsearch in the background")
.availableUnless(versionOption);
pidfileOption = parser.acceptsAll(Arrays.asList("p", "pidfile"),
"Creates a pid file in the specified path on start")
.availableUnless(versionOption)
.withRequiredArg()
.withValuesConvertedBy(new PathConverter());
quietOption = parser.acceptsAll(Arrays.asList("q", "quiet"),
"Turns off standard output/error streams logging in console")
.availableUnless(versionOption)
.availableUnless(daemonizeOption);
}


PID 저장)

$ bin/elasticsearch -d -p ./bin/es.pid

- 이와 같이 하시면 daemon 으로 실행 되면서 process id 는 bin/ 디렉토리 아래 es.pid 파일로 생성이 됩니다.

:

[Elasticsearch] simple query 내 synonym graph 사용

Elastic/Elasticsearch 2017. 12. 20. 10:11

일단 나중에 잊을 수도 있어서 keep 합니다.


Ref.

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-simple-query-string-query.html#_synonyms_2


Simple Query 사용 시 추가 되는 parameter 인데, 이 기능을 잘 활용하면  query expansion (query rewrite) 기능을 대체 할 수도 있겠다는 생각이 듭니다.

그래서 일단 기록!

Synonyms

The simple_query_string query supports multi-terms synonym expansion with the synonym_graph token filter. When this filter is used, the parser creates a phrase query for each multi-terms synonyms. For example, the following synonym: "ny, new york" would produce:


(ny OR ("new york"))


It is also possible to match multi terms synonyms with conjunctions instead:

GET /_search

{

   "query": {

       "simple_query_string" : {

           "query" : "ny city",

           "auto_generate_synonyms_phrase_query" : false

       }

   }

}

약간의 부연 설명을 하자면, 보통 사용자가 입력한 검색어만 가지고 검색을 하는 경우는 이커머스에서는 거의 없습니다.

대부분 사용자가 입력한 검색어 + 확장검색어 형태로 질의를 하게 되는데요.

일반적으로 가장 많이 사용하는 방식이 색인 시점에 동의어를 통한 검색어 확장입니다.

이건 색인 시점이고 위 기능을 잘 활용하게 되면 질의 시점에 검색어 확장을 통한 상품 매칭을 할 수 있습니다.

저는 보통 Query Expansion 기능이라고 부르는데요. 이 작업은 Query Rewriter 라고 불리는 영역에서도 수행이 되기도 합니다.


간단한 예를 들자면)

"나이키" 라는 검색어가 들어 왔을 때 이를 개인화 query expansion 기능을 적용 한다면 저 키워드를 입력한 사용자가 선호 하는게 "운동화" 였다면, 실제 검색 매칭에 사용되는 검색어는 "나이키" + "운동화" 가 되는 것입니다.

이건 단순 예시 입니다.

:

[Lucene] LeafReaderContext 는...

ITWeb/검색일반 2017. 12. 19. 18:36

검색 질의가 들어 오게 되면 아래와 같은 Object 들이 생성이 되고 수행을 하게 됩니다.

개념적으로 flow 를 적어 본 것이고 자세한 건 IndexSearcher 클래스를 참고하세요.

Query

IndexSearcher

IndexReader

IndexreaderContext

List<LeafReaderContext>

LeafSlices

1. search(...)

Query, CollectorManager

2. search(...)

LeafReaderContext, Collector

return TopFieldDocs


여기서 가장 중요한건 아래 부분 입니다.

Query -> IndexReader -> LeafReaderContext:LeafReader (One LeafReader per Segment)


:

[Elasticsearch] Java Security Manager 관련

Elastic/Elasticsearch 2017. 12. 18. 15:45

elasticsearch plugin 을 만들다 보면 보안정책 강화에 따라 permission 에러가 발생 하는 경우가 있습니다.

이럴 경우 아래 내용을 통해서 문제를 해결해 보시기 바랍니다.


[Elasticsearch Java Security Manager]

$ export JAVA_OPTS="${JAVA_OPTS} -Djava.security.policy=file:///path/to/my.policy` ./bin/elasticsearch

# or config/jvm.options

$ vi config/jvm.options

-Djava.security.policy=file:///path/to/my.policy

$ export JAVA_OPTS="${JAVA_OPTS} -Dsecurity.manager.enabled=false` ./bin/elasticsearch

# or config/jvm.options

$ vi config/jvm.options 

-Dsecurity.manager.enabled=false


Example) my.policy

# Ref. https://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html


grant {

permission org.elasticsearch.script.ClassPermission "java.util.Base64"; // allow class

permission org.elasticsearch.script.ClassPermission "java.util.*"; // allow package

permission org.elasticsearch.script.ClassPermission "*"; // allow all (disables filtering basically)

permission java.io.FilePermission "$ES_HOME/config/resource/*", "read"; // allow all files

};


Example) plugin-metadata/plugin-security.policy (recommended)

# Ref. https://www.elastic.co/guide/en/elasticsearch/plugins/current/plugin-authors.html#plugin-authors-jsm

# Ref. https://github.com/elastic/elasticsearch/blob/master/plugins/discovery-gce/src/main/plugin-metadata/plugin-security.policy

:

[Elasticsearch] copy_to mapping 예제

Elastic/ElasticsearchReferences 2017. 12. 13. 16:31

nested mapping 구조를 가지는 경우 copy_to 에 대한 동작 오류가 몇 건 보고 된게 있어서 코드 보다가 살짝 올려 봅니다.

공식문서는 아래 링크 참고하세요.

https://www.elastic.co/guide/en/elasticsearch/reference/current/copy-to.html


XContentBuilder mapping = jsonBuilder().startObject()
.startObject("type")
.startObject("properties")
.startObject("target")
.field("type", "long")
.field("doc_values", false)
.endObject()
.startObject("n1")
.field("type", "nested")
.startObject("properties")
.startObject("target")
.field("type", "long")
.field("doc_values", false)
.endObject()
.startObject("n2")
.field("type", "nested")
.startObject("properties")
.startObject("target")
.field("type", "long")
.field("doc_values", false)
.endObject()
.startObject("source")
.field("type", "long")
.field("doc_values", false)
.startArray("copy_to")
.value("target") // should go to the root doc
.value("n1.target") // should go to the parent doc
.value("n1.n2.target") // should go to the current doc
.endArray()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject();


:

[Java] Executors 로 간단 multithread 테스트

ITWeb/개발일반 2017. 12. 12. 11:54

이전 글의 참고 문서들을 먼저 보시면 좋습니다.

http://jjeong.tistory.com/1296

package hello.executors;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class HelloExecutors {

public static class HelloCallableThread implements Callable<Integer> {
int input;

public HelloCallableThread(int input) {
this.input = input;
}

@Override
public Integer call() throws Exception {
return input + 1;
}
}

public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(4);
Set<Callable<Integer>> callables = new HashSet<Callable<Integer>>();

callables.add(new HelloCallableThread(1));
callables.add(new HelloCallableThread(2));
callables.add(new HelloCallableThread(3));
callables.add(new HelloCallableThread(4));

List<Future<Integer>> futures = executorService.invokeAll(callables);

for(Future<Integer> future : futures){
System.out.println("future.get = " + future.get());
}

executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.SECONDS);
}
}


:

[Elasticsearch] Refresh interval while bulk request

Elastic/Elasticsearch 2017. 12. 6. 14:00

작업 하면서 이상한 현상이 발생을 해서 분석 하다 보니 누구나 경험 할 수 있는 것 같아 올려 봅니다.


참고문서)

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-update-settings.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-refresh.html


보통 bulk request 하기 전에 아래 설정을 적용하게 됩니다.

index.refresh_interval: "-1"

이 설정은 해당 index 의 settings 에서 설정 합니다.


이 설정을 하게 되면 bulk request 시 refresh action 을 수행 하지 않게 되는데요.

제가 경험한 현상은 disable 했음에도 불구하고 refresh thread 수가 증가 한다는 것이였습니다.


문제는 역시 elasticsearch 에 있었던 것이 아닌 저의 잘 못 이였습니다.

이유는 제가 정의한 mapping 정보에서 dynamic field 에 따른 template 구성이 영향을 주는 것이였습니다.

결과적으로 dynamic field 설정으로 색인 시 mapping 정보가 바뀌게 되고 이를 반영 하기위해 IndexService 가 updateMetaData() 를 수행 하게 됩니다. 이 과정에서 자동으로 refresh 가 발생을 하기 때문에 bulk request 시 왜 성능이 안나오지 하지 마시고 어떤 구성을 하셨는지 부터 분석해 보시면 더 좋을 것 같습니다.


: