elasticsearch(es) 에 없는 기능이 있다. (7.0.0 기준)
es는 full text 검색이 가능하다.
입력: 검색 keyword
출력: 검색 keyword가 포함된 full text 리스트
끝.
검색이 되는 건 좋으나 검색 결과로 full text를 포함한 리스트가 포함된다. (문서의 리스트)
난, 그 검색 keyword가 full text 중에서 어느 위치에 있는지 알고 싶은데, 그 위치는 알려주지 않는다. 충분히 가능한데 말이다.
예를 들어 다음의 데이터(문장)와 검색어가 있을 경우
데이터: solr in action, but elasticsearch in action, solr in action
검색어: solr in
결과는 그저 문장 전체가 다시 출력된다. (당연히 검색어를 포함하고 있으므로)
물론 highlight를 이용하면
<em>solr</em> <em>in</em> action, but elasticsearch in action, <em>solr</em> <em>in</em> action으로 만들어서 return 해 주기는 한다.
그럼 난, 위치를 찾기 위해 이 문장에서 tag를 찾아 다시 파싱해야 한다. 왜 그래야 하나..... -_-;; 두번 작업하는 일이 된다.
해결
이러한 이슈는 이미 2017년도에 거론이 되었고, 커뮤니티에 해결책이 나왔다.
논의: https://discuss.elastic.co/t/fetching-position-of-keyword-in-matched-document/94291/5
해결책: 다른 plugin을 사용하자.
https://github.com/wikimedia/search-highlighter
es에서는 plugin으로 기존 기능을 덮어쓸 수 있다.
설치방법(mac)::
bin> ./elasticsearch-plugin install org.wikimedia.search.highlighter:experimental-highlighter-elasticsearch-plugin:6.5.4
현재 maven 페이지에 들어가보니 6.5.4가 최신이었다. 그리고, 6.5.4를 사용하기 위해서 es도 6.5.4로 버전이 같아야 한다.
그리고 다음의 query를 실행하면,
GET /bookdb_index/book/_search
{
"_source": ["title"],
"query" : {
"match_phrase" : { "title" : "solr in action solr" }
},
"highlight" : {
"pre_tags" : [""],
"post_tags" : [""],
"fields" : {
"title" : {
"fragment_size" : 30,
"number_of_fragments" : 10,
"type": "experimental",
"options": {"return_offsets": true}
}
},
"order" : "score"
}
}
결과
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 2.6149776,
"hits": [
{
"_index": "bookdb_index",
"_type": "book",
"_id": "5",
"_score": 2.6149776,
"_source": {
"title": "Solr in Action Solr in Action"
},
"highlight": {
"title": [
"0:0-4,5-7,8-14,15-19:29"
]
}
}
]
}
}
"0:0-4,5-7,8-14,15-19:29" 를 얻을 수 있다.
'웹 > elasticsearch' 카테고리의 다른 글
openkoreantext_analyzer start_offset bug (0) | 2019.10.09 |
---|---|
한글 형태소 분석기 비교 (0) | 2019.07.05 |
test query (0) | 2019.04.26 |