Elk에서 영문 검색 시 띄어쓰기를 하지 않고 연속되는 단어가 있는 경우 검색.
kibana에서 실행 하면 된다.
index 생성 setting, mapping 입력
tokenize를 사용해 ngram을 설정한다. 최소 2음절씩 최대 5음절로 토큰을 생성한다.
PUT english_pattern_replace_test2
{
"settings": {
"analysis": {
"char_filter": {
"whitespace_remove": {
"type": "pattern_replace",
"pattern": "\\s+",
"replacement": ""
}
},
"analyzer": {
"custom_analyzer": {
"type": "custom",
"tokenizer": "my_customer_ngram_tokenizer",
"filter": [
"lowercase",
"asciifolding"
],
"char_filter": [
"whitespace_remove"
]
}
},
"tokenizer": {
"my_customer_ngram_tokenizer": {
"type": "ngram",
"min_gram": "2",
"max_gram": "5"
}
}
}
},
"mappings": {
"_doc": {
"dynamic": "false",
"properties": {
"title_eng": {
"type": "keyword",
"fields": {
"analyze": {
"type": "text",
"term_vector": "yes",
"analyzer": "custom_analyzer"
}
}
}
}
}
}
}
Analyser 확인
확인 결과 쭈~악 토큰이 쪼개지는 것을 확인할 수 있다. 이렇게하면 색인 시간 및 저장 용량이 늘어난다. 이에 * 검색 데이터가 작고 색인 크기도 작다면 wildcard를 사용하는게 나을 수도 있다.
GET english_pattern_replace_test2/_analyze
{
"analyzer": "custom_analyzer",
"text": [
"Elastic Search"
]
}
-----------out-----------
{
"tokens" : [
{
"token" : "el",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 0
},
{
"token" : "ela",
"start_offset" : 0,
"end_offset" : 3,
"type" : "word",
"position" : 1
},
{
"token" : "elas",
"start_offset" : 0,
"end_offset" : 4,
"type" : "word",
"position" : 2
},
{
"token" : "elast",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 3
},
{
"token" : "la",
"start_offset" : 1,
"end_offset" : 3,
"type" : "word",
"position" : 4
},
{
"token" : "las",
"start_offset" : 1,
"end_offset" : 4,
"type" : "word",
"position" : 5
},
...
색인 삽입
'Mysql Search Guide'도 추가로 넣어보고 검색 결과를 확인하자.
PUT english_pattern_replace_test2/_doc/0
{
"title_eng" : "Elastic Search"
}
PUT english_pattern_replace_test2/_doc/1
{
"title_eng" : "Elastic Search2"
}
PUT english_pattern_replace_test2/_doc/2
{
"title_eng" : "Elastic Search Guide"
}
PUT english_pattern_replace_test2/_doc/3
{
"title_eng" : "Mysql Search Guide"
}
검색
'Mysql Search Guide' 경우 검색 토큰에 search가 포함되어 있었기 때문에 mysql 관련 데이터도 검색 되었다.
ngram을 사용해 *검색이 가능해 졌지만 오히려 검색 신뢰도를 떨어 뜨릴수도 있다. Elk를 적용하는 인덱스에 따라 ngram적용을 고려해 보아야 할 것이다.
GET english_pattern_replace_test2/_search
{
"query": {
"bool": {
"must": [
{
"dis_max": {
"queries": [
{
"multi_match": {
"query": "elasticsearch",
"fields": [
"title_eng.analyze"
],
"type": "cross_fields",
"operator": "OR"
}
}
]
}
}
]
}
}
}
-----------out----------------
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 4,
"max_score" : 12.244228,
"hits" : [
{
"_index" : "english_pattern_replace_test2",
"_type" : "_doc",
"_id" : "2",
"_score" : 12.244228,
"_source" : {
"title_eng" : "Elastic Search Guide"
}
},
{
"_index" : "english_pattern_replace_test2",
"_type" : "_doc",
"_id" : "0",
"_score" : 12.082647,
"_source" : {
"title_eng" : "Elastic Search"
}
},
{
"_index" : "english_pattern_replace_test2",
"_type" : "_doc",
"_id" : "1",
"_score" : 12.082647,
"_source" : {
"title_eng" : "Elastic Search2"
}
},
{
"_index" : "english_pattern_replace_test2",
"_type" : "_doc",
"_id" : "3",
"_score" : 4.0275493,
"_source" : {
"title_eng" : "Mysql Search Guide"
}
}
]
}
}
참조 사이트
https://findstar.pe.kr/2018/07/14/elasticsearch-wildcard-to-ngram/
반응형
사업자 정보 표시
라울앤알바 | 장수호 | 서울특별시 관악구 봉천로 13나길 58-10, 404호(봉천동) | 사업자 등록번호 : 363-72-00290 | TEL : 010-5790-0933 | Mail : shjang@raulnalba.com | 통신판매신고번호 : 2020-서울관악-0892호 | 사이버몰의 이용약관 바로가기
'programmer > Elasticsearch' 카테고리의 다른 글
[Elasticsearch] 거리 가중치에 따른 Score 집계 방법 (0) | 2022.03.07 |
---|---|
Set up basic security for the Elastic Stack (0) | 2022.03.03 |
[Elasticsearch] 영문 검색 시 띄어쓰기 제거[1/2] (0) | 2022.02.23 |
Kibana to website (0) | 2021.12.21 |
Elasticsearch to PowerBI (0) | 2021.12.21 |