Elasticsearch 평점 정렬
3722 단어 Elasticsearchfunctionscore
Elasticsearch 평점 정렬
배경
최근에 쿠폰 사용 가능한 상품 목록에 정렬을 해야 하는 수요가 하나 있는데, 액면가류에 대한 쿠폰은 할인권을 포함하지 않는다.
수요는 이렇다. 만약에 액면가권 한 장에 50위안이 있다고 가정하면 사용 가능한 상품 목록 A100, B40, C10을 사용할 수 있다. 사용자가 현재 사용 가능한 상품 목록을 조회할 때 우선적으로 카드권을 직접 공제할 수 있고 사용자가 추가로 지불할 필요가 없는 상품을 앞에 놓는다.
C 10B 40A 100
사실 정렬에는 다음과 같은 측면이 많다.
1. 사용자 이익 최대화 원칙에 따라 정렬 목록은 B, C, A2이어야 한다.사용자 구매 습관에 따라 A, B, C3일 수 있습니다.운영 전략, 타사 이익 등에 따라 C, B, A가 될 수 있음
여기에 상품 리스트에 대한 스마트 정렬을 확장하지 않고 완전한 개성화된 상품 추천이 필요하다면 많은 것들이 관련되고 그 다음에 경험을 가지고 공유하고 있다.
우리는 이 간단한 케이스에 대해 처음에 가장 직접적인 생각은 배열 서열을 추가하고 색인을 만들 때 정렬 값을 계산해서 직접 쓰는 것이다.나중에 다음 인덱스(index) 구조는 이런 피리칼 적의 배열이 아니기 때문에 단시간 내에 바로 접속하기 어려우므로 인덱스 구조를 새로 만들어야 한다고 분석했다.
나중에 토론을 통해 평점에 영향을 주는 방법으로 해결하면 시간을 절약하고 신속하게 접속할 수 있다.
스크립트를 통한 채점 변경
ESquery DSL은 여러 종류의 조회를 지원합니다. 결과의 정렬은 특별한 성명이 없으면sortfield는 es점수(score)에 따라 정렬됩니다. score 점수가 높을수록 정렬이 앞에 있습니다.
ES score 계산은 비교적 복잡하다. TF(어휘 주파수)/IDF(역방향 문서 주파수), 보기 드문 단어, 일치하는 문서 길이, 권중 boost 벡터 공간 모델 등과 관련된다. 그러나 ES는 몇 가지 봉인된 평점 플러그인을 제공하여 사용할 수 있다.
function_score 조회는 우리가 업무 장면에 따라 문서 평가 방법을 바꾸도록 한다. 업무 장면에 따라 우리는 score 생성의 논리를 완전히 제어해야 하기 때문에 우리는 script_를 선택한다score 방식.
script_score가 상기 범위를 초과할 경우 사용자 정의 스크립트로 평점 계산을 완전히 제어하여 필요한 논리를 실현할 수 있습니다.(참조:https://www.elastic.co/guide/cn/elasticsearch/guide/current/function-score-query.html)
스크립트의 기본값은groovy입니다. 물론 필요에 따라 다른 스크립트 언어를 사용할 수도 있습니다. 우리가 보기에 실현될 것입니다.script.inline: on
script.enfine.groovy.inline.aggs: on
script.indexed: on
script.file: on
우선 에스.yml 설정에서 스크립트 지원 옵션을 엽니다.{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"match": {
"productName": " "
}
}
]
}
},
"score_mode": "first",
"script_score": {
"lang": "groovy",
"params": {
"couponPrice": 100
},
"script": "def deduct = couponPrice - doc['unitCost'].value.toFloat(); if (deduct > 0) {return 10000 + deduct;}else if(deduct==0 || (deduct<1 && deduct>0)){return 20000;}else{return doc['unitCost'].value.toFloat()-couponPrice;}"
},
"boost_mode": "replace"
}
},
"from": 0,
"size": 100
}
조회 조건은 무엇이든 가능합니다. 관건은 __script_score 객체, script는 ES__스크립트 엔진이 실행하는 스크립트 코드입니다.
비교적 중요한 옵션 boost_mode ,boost_모드는 전체 문서를 제어하는 채점 방식입니다. 기본적으로 계산된 채점을 대체합니다.
이 안의 정렬에는 음수를 어떻게 앞에 정렬하고, 정수를 뒤에 정렬하며, 그리고 공제 후에는 0의 처리를 하는 작은 기교가 있다.def deduct = couponPrice - doc['unitCost'].value.toFloat();
if (deduct > 0) {
return 10000 + deduct;
}else if(deduct==0 || (deduct<1 && deduct>0)){
return 20000;
}else{
return doc['unitCost'].value.toFloat()-couponPrice;
}
쿠폰 프라이스 변수를 통해 쿠폰 액면가 금액을 표시합니다. 만약에 현재 상품의 공제 완료가 마이너스라면 앞에 정렬해야 한다는 것을 설명합니다. 그러면 공제 완료와 정수를 분리하는 방법입니다. 여기서 조금 큰 값에 공제 후의 마이너스를 추가하면 마이너스를 정수로 바꾸면 자연스럽게 앞에 정렬됩니다.
공제 후 0과 같거나 1보다 작은 값이 0보다 큰 값도 우선적으로 앞에 배치할 수 있다. 물론 여기는 융통성이 없다. 가장 좋은 방법은 현재의 액면가, 상품 가격의 동태에 따라 계산하는 것이다.
마지막으로 사용자가 추가 지불을 필요로 하는 금액을 맨 뒤에 공제하고 추가 지불이 필요한 금액의 수치를 정렬하는 것이다.
ES 평점을 통해 우리는 많은 일을 할 수 있다. 이 케이스는 단지 간단한 장면일 뿐이다. : ( )
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Embulk를 사용하여 ElasticCloud로 보내기
Embulk에서 ElasticCloud에 보낼 수 있을까라고 생각비망록도 겸해 기술을 남깁니다
Embulk 설치
ElasticCloud (14 일 체험판)
brew라면 아래 명령
입력 파일 만들기
파일 내용
seed...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
ESquery DSL은 여러 종류의 조회를 지원합니다. 결과의 정렬은 특별한 성명이 없으면sortfield는 es점수(score)에 따라 정렬됩니다. score 점수가 높을수록 정렬이 앞에 있습니다.
ES score 계산은 비교적 복잡하다. TF(어휘 주파수)/IDF(역방향 문서 주파수), 보기 드문 단어, 일치하는 문서 길이, 권중 boost 벡터 공간 모델 등과 관련된다. 그러나 ES는 몇 가지 봉인된 평점 플러그인을 제공하여 사용할 수 있다.
function_score 조회는 우리가 업무 장면에 따라 문서 평가 방법을 바꾸도록 한다. 업무 장면에 따라 우리는 score 생성의 논리를 완전히 제어해야 하기 때문에 우리는 script_를 선택한다score 방식.
script_score가 상기 범위를 초과할 경우 사용자 정의 스크립트로 평점 계산을 완전히 제어하여 필요한 논리를 실현할 수 있습니다.(참조:https://www.elastic.co/guide/cn/elasticsearch/guide/current/function-score-query.html)
스크립트의 기본값은groovy입니다. 물론 필요에 따라 다른 스크립트 언어를 사용할 수도 있습니다. 우리가 보기에 실현될 것입니다.
script.inline: on
script.enfine.groovy.inline.aggs: on
script.indexed: on
script.file: on
우선 에스.yml 설정에서 스크립트 지원 옵션을 엽니다.
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"match": {
"productName": " "
}
}
]
}
},
"score_mode": "first",
"script_score": {
"lang": "groovy",
"params": {
"couponPrice": 100
},
"script": "def deduct = couponPrice - doc['unitCost'].value.toFloat(); if (deduct > 0) {return 10000 + deduct;}else if(deduct==0 || (deduct<1 && deduct>0)){return 20000;}else{return doc['unitCost'].value.toFloat()-couponPrice;}"
},
"boost_mode": "replace"
}
},
"from": 0,
"size": 100
}
조회 조건은 무엇이든 가능합니다. 관건은 __script_score 객체, script는 ES__스크립트 엔진이 실행하는 스크립트 코드입니다.
비교적 중요한 옵션 boost_mode ,boost_모드는 전체 문서를 제어하는 채점 방식입니다. 기본적으로 계산된 채점을 대체합니다.
이 안의 정렬에는 음수를 어떻게 앞에 정렬하고, 정수를 뒤에 정렬하며, 그리고 공제 후에는 0의 처리를 하는 작은 기교가 있다.
def deduct = couponPrice - doc['unitCost'].value.toFloat();
if (deduct > 0) {
return 10000 + deduct;
}else if(deduct==0 || (deduct<1 && deduct>0)){
return 20000;
}else{
return doc['unitCost'].value.toFloat()-couponPrice;
}
쿠폰 프라이스 변수를 통해 쿠폰 액면가 금액을 표시합니다. 만약에 현재 상품의 공제 완료가 마이너스라면 앞에 정렬해야 한다는 것을 설명합니다. 그러면 공제 완료와 정수를 분리하는 방법입니다. 여기서 조금 큰 값에 공제 후의 마이너스를 추가하면 마이너스를 정수로 바꾸면 자연스럽게 앞에 정렬됩니다.
공제 후 0과 같거나 1보다 작은 값이 0보다 큰 값도 우선적으로 앞에 배치할 수 있다. 물론 여기는 융통성이 없다. 가장 좋은 방법은 현재의 액면가, 상품 가격의 동태에 따라 계산하는 것이다.
마지막으로 사용자가 추가 지불을 필요로 하는 금액을 맨 뒤에 공제하고 추가 지불이 필요한 금액의 수치를 정렬하는 것이다.
ES 평점을 통해 우리는 많은 일을 할 수 있다. 이 케이스는 단지 간단한 장면일 뿐이다.
: ( )
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Embulk를 사용하여 ElasticCloud로 보내기Embulk에서 ElasticCloud에 보낼 수 있을까라고 생각비망록도 겸해 기술을 남깁니다 Embulk 설치 ElasticCloud (14 일 체험판) brew라면 아래 명령 입력 파일 만들기 파일 내용 seed...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.