Elastic/Elasticsearch 2018. 12. 19. 09:46
그냥 뭐 급하게 테스트 할 때 필요해서 올려 놓고 쓰려고 합니다.
(git 에 올리면 될 것을 ㅡ.ㅡ;;)
http://localhost:9200/helloworld
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0,
"analysis": {
"analyzer": {
"custom_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"trim",
"custom_synonym"
]
},
"cnori_analyzer" : {
"type" : "custom",
"tokenizer" : "cnori_tokenizer"
}
},
"tokenizer" : {
"cnori_tokenizer" : {
"type": "nori_tokenizer",
"decompound_mode": "mixed"
}
},
"filter": {
"custom_synonym": {
"type": "synonym_graph",
"synonyms": []
}
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"analyzer" : "cnori_analyzer",
"fielddata" : true
},
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"created": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
}
공유하기
URL 복사 카카오톡 공유 페이스북 공유 엑스 공유
Elastic/Elasticsearch 2018. 7. 4. 14:05
[Settings]
"settings":{
"number_of_shards":1,
"number_of_replicas":0,
"index.refresh_interval":"1h",
"index.routing.allocation.require.box_type":"indexing",
"index.similarity.default.type":"BM25",
"index":{
"analysis":{
"analyzer":{
"arirang_custom_analyzer":{
"tokenizer":"arirang_tokenizer",
"filter":[
"lowercase",
"trim",
"arirang_synonym",
"arirang_filter"
]
}
},
"filter":{
"arirang_synonym":{
"type":"synonym_graph",
"synonyms":[]
}
}
}
}
}
[Mappings]
"mappings" : {
"product": {
"_source": {
"enabled": true
},
"dynamic_templates": [
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"analyzer": "arirang_custom_analyzer",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 50
}
}
}
}
}
]
}
}
Elastic/Elasticsearch 2016. 3. 17. 18:34
나중에 또 잊어 버릴까봐 기록합니다.
참고문서)
예시)
"index" : { "analysis" : { "analyzer" : { "arirang_custom" : { "type" : "custom" , "tokenizer" : "arirang_tokenizer" , "filter" : [ "lowercase" , "trim" , "arirang_filter" ] } , "arirang_custom_searcher" : { "tokenizer" : "arirang_tokenizer" , "filter" : [ "lowercase" , "trim" , "arirang_filter" , "meme_synonym" ] } } , "filter" : { "meme_synonym" : { "type" : "synonym" , "synonyms" : [ "henry,헨리,앙리 " ] } } } }
여기서 주의할 점 몇 가지만 기록 합니다.
1. synonym analyzer 생성 시 type을 custom 으로 선언 하거나 type을 아예 선언 하지 않습니다.
2. synonym 은 filter 로 생성 해서 analyzer 에 filter 로 할당 합니다.
3. 색인 시 사용할 것인지 질의 시 사용할 것인지 장단점과 서비스 특성에 맞게 검토 합니다.
4. synonyms_path 를 이용하도록 합니다. (이건 주의라기 보다 관리적 차원)
5. match type 의 query만 사용이 가능 하며, term type 의 query를 사용하고 싶으시다면 색인 시 synonym 적용해야 합니다.
그럼 1번에서 선언 하지 않는 다는 이야기는 뭘까요?
선언 하지 않으시면 그냥 custom 으로 만들어 줍니다.
못 믿으시는 분들을 위해 아래 소스코드 투척 합니다.
[AnalysisModule.java]
String typeName = analyzerSettings.get( "type" ) ; Class<? extends AnalyzerProvider> type ; if (typeName == null ) { if (analyzerSettings.get( "tokenizer" ) != null ) { // custom analyzer, need to add it type = CustomAnalyzerProvider. class; } else { throw new IllegalArgumentException( "Analyzer [" + analyzerName + "] must have a type associated with it" ) ; } } else if (typeName.equals( "custom" )) { type = CustomAnalyzerProvider. class; } else { type = analyzersBindings. analyzers .get(typeName) ; if (type == null ) { throw new IllegalArgumentException( "Unknown Analyzer type [" + typeName + "] for [" + analyzerName + "]" ) ; } }
Elastic/Elasticsearch 2016. 3. 2. 12:30
그냥 복습 하는 차원에서 기록 합니다.
$ curl -XPUT "http://localhost:9200/INDEX_NAME " -d'
{
"settings": {
...설정할 정보를 넣으세요...
},
"mapping": {
...설정할 정보를 넣으세요...
}
}
별 내용 없습니다.
그냥 rest api를 이용해서 index 생성 할 때 필요한 설정 정보를 작성하는 틀 정도 입니다.
type 정보는 mappings 안에 넣으시면 됩니다.
기본적으로 해당 설정은 지정한 INDEX_NAME 에 한해서 적용되는 것입니다. 별도의 global 설정을 하고 싶으시다면 template 기능을 활용하시기 바랍니다.
참고링크)
Elastic/TheDefinitiveGuide 2015. 12. 3. 17:24
아주 좋은 글 귀가 보여서 이건 기록을 안할래야.. ^^
원문링크)
원문 Snippet)
Elasticsearch comes with good defaults. Don’t twiddle these knobs until you understand what they do and why you should change them.
Elasticsearch는 잘 모르겠다 싶으시면 그냥 default 로 사용하시는게 제일 좋습니다. :)
Elastic/Elasticsearch 2014. 1. 7. 18:41
그냥 참고용으로 올려 놓는 것입니다.
각 속성들은 서비스 특성에 맞춰서 설정 하시는게 좋습니다.
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-put-mapping.html
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html
{ "settings" : { "number_of_shards" : 5, "number_of_replicas" : 0, "index" : { "refresh_interval" : "1s", "merge" : { "policy" : { "segments_per_tier" : 5 } }, "analysis" : { "analyzer" : { "analyzer_standard" : { "type" : "standard", "tokenizer" : "whitespace", "filter" : ["lowercase", "trim"] }, "analyzer_pattern" : { "type" : "custom", "tokenizer" : "tokenizer_pattern", "filter" : ["lowercase", "trim"] }, "analyzer_ngram" : { "type" : "custom", "tokenizer" : "tokenizer_ngram", "filter" : ["lowercase", "trim"] } }, "tokenizer" : { "tokenizer_ngram" : { "type" : "nGram", "min_gram" : "2", "max_gram" : "10", "token_chars": [ "letter", "digit" ] }, "tokenizer_pattern" : { "type" : "pattern", "pattern" : "," } } }, "store" : { "type" : "mmapfs", "compress" : { "stored" : true, "tv" : true } } } }, "mappings" : { "INDICE_TYPE_NAME" : { "_id" : { "index" : "not_analyzed", "path" : "KEY_FIELD_NAME" }, "_source" : { "enabled" : "true" }, "_all" : { "enabled" : "false" }, "_boost" : { "name" : "_boost", "null_value" : 1.0 }, "analyzer" : "analyzer_standard", "index_analyzer" : "analyzer_standard", "search_analyzer" : "analyzer_standard", "properties" : { "LONG_KEY_FIELD" : {"type" : "long", "store" : "no", "index" : "not_analyzed", "omit_norms" : true, "index_options" : "docs", "ignore_malformed" : true, "include_in_all" : false}, "STRING_SEARCH_FIELD" : {"type" : "string", "store" : "no", "index" : "analyzed", "omit_norms" : false, "index_options" : "offsets", "term_vector" : "with_positions_offsets", "include_in_all" : false}, "STRING_VIEW_FIELD" : {"type" : "string", "store" : "yes", "index" : "no", "include_in_all" : false}, "INTEGER_KEY_FIELD" : {"type" : "integer", "store" : "no", "index" : "not_analyzed", "omit_norms" : true, "index_options" : "docs", "ignore_malformed" : true, "include_in_all" : false}, "FLOAT_KEY_FIELD" : {"type" : "float", "store" : "no", "index" : "not_analyzed", "omit_norms" : true, "index_options" : "docs", "ignore_malformed" : true, "include_in_all" : false}, "LONG_VIEW_FIELD" : {"type" : "long", "store" : "yes", "index" : "no", "ignore_malformed" : true, "include_in_all" : false}, "STRING_KEY_FIELD" : {"type" : "string", "store" : "no", "index" : "not_analyzed", "omit_norms" : true, "index_options" : "docs", "include_in_all" : false}, "NESTED_KEY_FIELD" : {"type" : "nested", "properties" : { "STRING_KEY_FIELD" : {"type" : "string", "store" : "no", "index" : "not_analyzed", "omit_norms" : true, "index_options" : "docs", "include_in_all" : false}, "INTEGER_VIEW_FIELD" : {"type" : "integer", "store" : "yes", "index" : "no", "ignore_malformed" : true, "include_in_all" : false} } }, "BOOLEAN_VIEW_FIELD" : {"type" : "boolean", "store" : "yes", "include_in_all" : false}, "BOOLEAN_KEY_FIELD" : {"type" : "boolean", "store" : "no", "index" : "not_analyzed", "omit_norms" : true, "index_options" : "docs", "include_in_all" : false}, "OBJECT_VIEW_FIELD" : {"type" : "object", "dynamic" : true, "store" : "yes", "index" : "no", "include_in_all" : false} } } } }
Elastic/Elasticsearch 2013. 4. 16. 10:54
본 문서는 개인적인 테스트와 elasticsearch.org 그리고 community 등을 참고해서 작성된 것이며,
정보 교환이 목적입니다.
잘못된 부분에 대해서는 지적 부탁 드립니다.
(예시 코드는 성능 및 보안 검증이 되지 않았습니다.)
[elasticsearch java api 리뷰]
원문 링크
http://www.elasticsearch.org/guide/reference/modules/
http://www.elasticsearch.org/guide/reference/index-modules/
http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings/
이번 문서는 Java API에서도 제공하고 있는 settings 관련 설정 값들 입니다.
물론 cluster.settings 와 index.settings 도 있기 때문에 모두 확인을 하셔야 합니다.
보통 cluster 와 index 에 대한 설정들은 모두 global setting 을 사용하도록 구성 하기 때문에 elasticsearch.yml 을 구성 할 때 활용 하시면 됩니다.
업데이트 세팅과 작성된 JSON 형식의 예제를 확인해 보도록 하겠습니다.
[admin indices update settings]
Setting Description index.number_of_replicas
The number of replicas each shard has. index.auto_expand_replicas
Set to an actual value (like 0-all
) or false
to disable it. index.blocks.read_only
Set to true
to have the index read only. false
to allow writes and metadata changes. index.blocks.read
Set to true
to disable read operations against the index. index.blocks.write
Set to true
to disable write operations against the index. index.blocks.metadata
Set to true
to disable metadata operations against the index. index.refresh_interval
The async refresh interval of a shard. index.term_index_interval
The Lucene index term interval. Only applies to newly created docs. index.term_index_divisor
The Lucene reader term index divisor. index.translog.flush_threshold_ops
When to flush based on operations. index.translog.flush_threshold_size
When to flush based on translog (bytes) size. index.translog.flush_threshold_period
When to flush based on a period of not flushing. index.translog.disable_flush
Disables flushing. Note, should be set for a short interval and then enabled. index.cache.filter.max_size
The maximum size of filter cache (per segment in shard). Set to -1
to disable. index.cache.filter.expire
The expire after access time for filter cache. Set to -1
to disable. index.gateway.snapshot_interval
The gateway snapshot interval (only applies to shared gateways). merge policy All the settings for the merge policy currently configured. A different merge policy can’t be set. index.routing.allocation.include.*
A node matching any rule will be allowed to host shards from the index. index.routing.allocation.exclude.*
A node matching any rule will NOT be allowed to host shards from the index. index.routing.allocation.require.*
Only nodes matching all rules will be allowed to host shards from the index. index.routing.allocation.total_shards_per_node
Controls the total number of shards allowed to be allocated on a single node. Defaults to unbounded. index.recovery.initial_shards
When using local gateway a particular shard is recovered only if there can be allocated quorum shards in the cluster. It can be set to quorum
(default), quorum-1
(or half
), full
and full-1
. Number values are also supported, e.g. 1
. index.gc_deletes
index.ttl.disable_purge
Disables temporarily the purge of expired docs.
이 세팅 값들은 서비스 특성에 맞게 구성을 하셔야 합니다.
아래는 위 속성들에 대한 참고용 입니다.
[Sample JSON String]
curl -XPUT 'http://localhost:9200/test/' -d '{
"settings" : {
"number_of_shards" : 5,
"number_of_replicas" : 1,
"index" : {
"analysis" : {
"analyzer" : {
"default" : {
"type" : "standard",
"tokenizer" : "standard",
"filter" : ["lowercase", "trim"]
},
"default_index" : {
"type" : "standard",
"tokenizer" : "standard",
"filter" : ["lowercase", "trim"]
},
"default_search" : {
"type" : "standard",
"tokenizer" : "standard",
"filter" : ["lowercase", "trim"]
},
"my_analyzer1" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "trim"]
},
"my_analyzer 2" : {
"type" : "custom",
"tokenizer" : "tokenizer1",
"filter" : ["filter1", "trim"]
}
},
"tokenizer" : {
"tokenizer1" : {
"type" : "standard",
"max_token_length" : 255
}
},
"filter" : {
"filter1" : {
"type" : "lowercase",
"language" : "greek"
}
}
},
"compound_format" : false,
"merge" : {
"policy" : {
"max_merge_at_once" : 10,
"segments_per_tier" : 20
}
},
"refresh_interval" : "1s",
"term_index_interval" : 1,
"store" : {
"type" : "mmapfs",
"compress" : {
"stored" : true,
"tv" : true
}
}
}
}
}'
- 위 표에 없는 설정에 대해서만 기술 합니다.
number_of_shards
색인 파일에 대한 shard 수
index.analysis.analyzer .default
.default_index
.default_search
.my_analyzer1
.my_analyzer2
.tokenizer
.filter
색인 및 검색 시 사용할 분석기를 등록함
.default* 은 기본 분석기를 등록 index/type 에 대한 기본 설정으로 동작
.my_analyzer* 은 사용자 정의 분석기
.tokenizer 와 .filter 는 analyzer 에서 사용하게 될 tokenizer 와 filter 를 정의
index.compound_format
파일 기반 저장 시스템을 사용할 경우 false 로 설정해야 더 나은 성능을 지원함
index.store.type
index.store.compress .stored
.tv
색인 저장 시 압축 기능에 대한 설정
. 64KB 이하의 작은 문서에 대한 압축 효과가 좋음
Elastic/Elasticsearch 2013. 4. 8. 18:42
본 문서는 개인적인 테스트와 elasticsearch.org 그리고 community 등을 참고해서 작성된 것이며,
정보 교환이 목적입니다.
잘못된 부분에 대해서는 지적 부탁 드립니다.
(예시 코드는 성능 및 보안 검증이 되지 않았습니다.)
[elasticsearch java api 리뷰]
원문 링크 : http://www.elasticsearch.org/guide/reference/java-api/index_/
json document 를 생성하는 몇 가지 방법을 설명하고 있습니다.
There are different way of generating JSON document:
- Manually (aka do it yourself) using native byte[] or as a String
- Using Map that will be automatically converted to its JSON equivalent
- Using a third party library to serialize your beans such as Jackson
- Using built-in helpers XContentFactory.jsonBuilder()
위 방법들 중에서 제일 아래 elasticsearch helper 를 이용한 방법을 테스트해 봅니다.
우선 간단하게 index 와 index type 을 정의해 보도록 하겠습니다.
curl -XPUT 'http://localhost:9200/facebook' -d '{
"settings" : {
"number_of_shards" : 5,
"number_of_replicas" : 1
},
"mappings" : {
"post" : {
"properties" : {
"docid" : { "type" : "string", "store" : "yes", "index" : "not_analyzed" },
"title" : { "type" : "string", "store" : "yes", "index" : "analyzed", "term_vector" : "yes", "analyzer" : "standard" }
}
}
}
}'
- index 는 facebook 으로 생성을 하고
- index type 은 post 라고 생성을 합니다.
- settings 와 mappings 에 대한 상세한 내용은 아래 링크 참고 하시기 바랍니다.
http://www.elasticsearch.org/guide/reference/api/admin-indices-create-index/
http://www.elasticsearch.org/guide/reference/index-modules/
http://www.elasticsearch.org/guide/reference/mapping/
http://www.elasticsearch.org/guide/reference/mapping/core-types/
index, index type 생성이 끝났으면 이제 색인을 해보도록 하겠습니다
// 생성할 문서가 아래와 같다고 가정
// curl -XPUT 'http://localhost:9200/facebook/ post/1' -d '{ " docid " : " henry ", "title" : "This is the elasticsearch hadoop test." }'
// curl -XPUT 'http://localhost:9200/facebook/ post/2' -d '{ " docid " : " henry ", "title" : " elasticsearch test." }'
// curl -XPUT 'http://localhost:9200/facebook/ post/3' -d '{ " docid " : " howook ", "title" : " hadoop test." }'
// curl -XPUT 'http://localhost:9200/facebook/ post/4' -d '{ " docid " : " howook ", "title" : "test." }'
IndexRequestBuilder requestBuilder;
IndexResponse response;
requestBuilder = client.prepareIndex("facebook", " post");
// setSource parameter 로 json string 형태로 등록
requestBuilder.setId("1");
requestBuilder.setSource("{ \"docid\" : \"henry\", \"title\" : \"This is the elasticsearch hadoop test.\" }");
response = requestBuilder.execute().actionGet();
// XContentBuilder 로 setSource 전달
XContentBuilder jsonBuilderDocument = jsonBuilder().startObject();
jsonBuilderDocument.field( "docid" , "henry" );
jsonBuilderDocument.field( "title" , "elasticsearch test." );
jsonBuilderDocument.endObject();
requestBuilder.setId("2");
requestBuilder.setSource(jsonBuilderDocument );
response = requestBuilder.execute().actionGet();
- IndexRequestBuilder 의 setSource 에 대한 코드를 보시면 어떤 arguments 받는지 알 수 있습니다.
- 그리고 문서 색인에 사용되는 여러가지 다양항 옵션들은 아래 링크를 참고 하시기 바랍니다.
http://www.elasticsearch.org/guide/reference/api/index_/
아래는 index 생성 시 필요한 settings 와 mappings 에 대한 예제 코드 입니다.
맛보기 참고용 입니다.
IndicesAdminClient indices = client.admin().indices() ;
CreateIndexRequest indexRequest = new CreateIndexRequest ( "INDEX_NAME" );
indexRequest
.settings(jsonBuilderIndexSetting)
.mapping( "INDEX_TYPE_NAME" , jsonBuilderIndiceSetting);
indices .create(indexRequest).actionGet();
- INDEX_NAME 은 생성한 index
- INDEX_TYPE_NAME 은 생성한 index type
- jsonBuilerIndexSetting 과 jsonBuilderIndiceSetting 은 XContentBuilder 객체