일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 파이썬
- docker
- MySQL
- flask
- Mac
- sort
- aggregation
- Java
- aggs
- ELASTIC
- Python
- Kafka
- License
- API
- zip 암호화
- token filter test
- TensorFlow
- zip 파일 암호화
- analyzer test
- Elasticsearch
- license delete
- query
- high level client
- 900gle
- 차트
- springboot
- plugin
- matplotlib
- Test
- licence delete curl
Archives
- Today
- Total
개발잡부
[es] 재현율 개선 본문
반응형
목표
QueryString 쿼리를 OR 검색조건으로 추가해서 재현율을 개선
작업방향
AS-IS
Query > bool > must > multi_match
에서
Query > bool >must > bool > should > bool > must > multi_match OR Query > bool > must > bool > should > bool > must > query_string
로 변경
쿼리 구조
추가 개선 작업
재현율은 올라갔으나 정밀도를 올려야 함
추가 작업
- tokenizer 테스트 : 검색결과의 노출기준을 term 의 매칭 수로 판단 정밀도를 올리기 위해 토근 분해의 디테일을 올린다.
- analyzer 테스트 : 1번테스트에서 유의미한 결과를 보이는 tokenizer 를 포함한 analyzer 를 세팅, 필드에 맵핑해준다.
- 최소매칭텀의 갯수를 조절
- sort 에 영향을 미치지 않게 할 경우 score 를 0으로 변경해주는 작업 필요
GET hyper-item/_search
{
"query": {
"match_phrase": {
"itemNm": {
"query": "비피더스 명장 요구르트",
"analyzer": "index_analyzer",
"slop": 3
}
}
}
}
GET hyper-item/_search
{
"query": {
"match_phrase_prefix": {
"itemNm": {
"query": "비피더스 명장 요구르트",
"analyzer": "index_analyzer",
"slop": 3
}
}
}
}
GET hyper-item/_search
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "비피더스 명장 요구르트",
"fields": [
"itemNm^1.0"
],
"type": "best_fields",
"default_operator": "OR",
"minimum_should_match" : 2,
"max_determinized_states": 10000,
"enable_position_increments": true,
"fuzziness": "AUTO",
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"phrase_slop": 0,
"escape": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1
}
}
],
"filter": [
{
"term": {
"itemStoreInfo.storeId": "37"
}
}
]
}
}
}
GET hyper-item/_search
{
"query": {
"bool": {
"must": [
{
"match_bool_prefix": {
"itemNm": {
"query": "비피더스 명장 요구르트",
"analyzer": "search_analyzer"
}
}
}
],
"filter": [
{
"term": {
"itemStoreInfo.storeId": "37"
}
}
]
}
}
}
더보기
{
"from":0,
"size":20,
"timeout":"60s",
"query":{
"bool":{
"must":{
"bool":{
"should":[
{
"bool":{
"must":[
{
"function_score":{
"query":{
"multi_match":{
"query":"비피더스 명장 요구르트",
"fields":[
"brandNmEng^1.0",
"brandNmKor^1.0",
"category.categorySearchKeyword^1.0",
"category.dcateNm^1.0",
"isbn^1.0",
"itemNo^1.0",
"itemOptionNms^1.0",
"itemStoreInfo.eventInfo.eventKeyword^1.0",
"promoKeyword^1.0",
"searchItemNm^1.0",
"searchKeyword^1.0"
],
"type":"cross_fields",
"operator":"AND",
"slop":0,
"prefix_length":0,
"max_expansions":50,
"zero_terms_query":"NONE",
"auto_generate_synonyms_phrase_query":false,
"fuzzy_transpositions":true,
"boost":1.0
}
},
"functions":[
{
"filter":{
"match_all":{
"boost":1.0
}
},
"script_score":{
"script":{
"source":"similarity_boost_df",
"lang":"boost_script",
"params":{
"field":[
"searchItemNm^10.0"
],
"scorer":{
"WORD":1.0,
"UNIT":1.0,
"RELATEDNYM":0.6,
"HYPONYM":0.7,
"KOREAN":1.0,
"SYNONYM":0.8
},
"proximity_rank":{
"field":"itemNm",
"boost":0.1,
"position_gap":2
},
"tokens":[
{
"token":"비피더스 명장 요구르트",
"type":"KOREAN",
"startOffset":0.0,
"endOffset":3.0,
"position":0.0,
"positionLength":1.0,
"isGeneral":false,
"expansion":[
{
"token":"비피더스 명장 요구르트",
"type":"SYNONYM",
"startOffset":0.0,
"endOffset":3.0,
"position":1.0,
"positionLength":1.0,
"isGeneral":false,
"expansion":[
]
},
{
"token":"pulmuone",
"type":"SYNONYM",
"startOffset":0.0,
"endOffset":3.0,
"position":0.0,
"positionLength":1.0,
"isGeneral":false,
"expansion":[
]
}
]
}
]
}
}
}
}
],
"score_mode":"sum",
"boost_mode":"replace",
"max_boost":3.4028235E38,
"boost":1.0
}
}
]
}
},
{
"bool":{
"must":[
{
"query_string":{
"query":"비피더스 명장 요구르트",
"fields":[
"itemNm^1.0"
],
"type":"best_fields",
"default_operator":"OR",
"minimum_should_match":2,
"max_determinized_states":10000,
"enable_position_increments":true,
"fuzziness":"AUTO",
"fuzzy_prefix_length":0,
"fuzzy_max_expansions":50,
"phrase_slop":0,
"escape":false,
"auto_generate_synonyms_phrase_query":true,
"fuzzy_transpositions":true,
"boost":1
}
}
]
}
}
]
}
},
"filter":[
{
"range":{
"saleStartDt":{
"from":null,
"to":"now/m",
"include_lower":true,
"include_upper":true,
"boost":1.0
}
}
},
{
"range":{
"saleEndDt":{
"from":"now/m",
"to":null,
"include_lower":true,
"include_upper":true,
"boost":1.0
}
}
},
{
"multi_match":{
"query":"Y",
"fields":[
"docDispYn^1.0",
"rsvDocDispYn^1.0"
],
"type":"best_fields",
"operator":"OR",
"slop":0,
"prefix_length":0,
"max_expansions":50,
"zero_terms_query":"NONE",
"auto_generate_synonyms_phrase_query":true,
"fuzzy_transpositions":true,
"boost":1.0
}
},
{
"bool":{
"should":[
{
"terms":{
"itemStoreInfo.storeId":[
"37",
"20163"
],
"boost":1.0
}
},
{
"term":{
"shipMethod":{
"value":"TD_DLV",
"boost":1.0
}
}
},
{
"term":{
"storeType":{
"value":"DS",
"boost":1.0
}
}
}
],
"adjust_pure_negative":true,
"boost":1.0
}
}
],
"adjust_pure_negative":true,
"boost":1.0
}
},
"_source":{
"includes":[
"*"
],
"excludes":[
]
},
"sort":[
{
"soldOutSort":{
"order":"asc"
}
},
{
"_script":{
"script":{
"source":"if(doc['edlp.keyword'].size() > 0 && doc['edlp.keyword'].value == params['searchKeyword'] || ( doc['edlp.addKeyword'].size() > 0 && doc['edlp.addKeyword'].contains(params['searchKeyword']))) {return doc['edlp.ranking'].value; } else { return 100;}",
"lang":"painless",
"params":{
"searchKeyword":"비피더스 명장 요구르트"
}
},
"type":"number",
"order":"asc"
}
},
{
"adultSort":{
"order":"asc"
}
},
{
"_score":{
"order":"desc"
}
},
{
"itemStoreInfo.weight":{
"order":"desc"
}
},
{
"itemStoreInfo.buyerCnt":{
"order":"desc"
}
},
{
"itemNo":{
"order":"desc"
}
}
]
}
반응형
'ElasticStack > Elasticsearch' 카테고리의 다른 글
[es] Regexp Query (1) | 2023.08.16 |
---|---|
[es] collapse (0) | 2023.07.13 |
신조어 추천 (0) | 2023.06.05 |
[es] min_score (0) | 2023.05.16 |
[es] N-gram tokenizer (0) | 2023.04.22 |
Comments