Elasticsearch 사용자 정의 평점(사용자 정의 평점)

4653 단어 ElasticSearch
Elasticsearch의 유사도 알고리즘은 검색어 주파수/역방향 문서 주파수, TF/IDF로 정의됩니다.

하나.관련 개념:

  • 검색어 빈도: tf
  • 단어 t가 문서 d에 있는 주파수 (tf) 는 이 단어가 문서에 나타나는 횟수의 제곱근입니다.
    tf(t in d) = √frequency
    검색어가 이 필드에 나타나는 빈도는?출현 빈도가 높을수록 관련성도 높다.필드에 다섯 번 나타나는 것이 한 번만 나타나는 것보다 관련성이 높다.
  • 역방향 문서 빈도: idf
  • 단어 t의 역방향 문서 주파수 (idf) 는 색인에서 문서 수량을 이 단어를 포함하는 모든 문서 수로 나눈 다음 그 대수를 구하는 것입니다.
    idf(t) = 1 + log ( numDocs/(docFreq + 1))
    모든 검색어가 색인에 나타나는 빈도는?빈도가 높을수록 관련성이 낮다.검색어가 대부분의 문서에 나타나는 것보다 소수의 문서에 나타나는 권한이 낮습니다.

    2. 계산 공식은 다음과 같다.

    score(q,d)  =  queryNorm(q)  · coord(q,d)  · ∑ (tf(t,d) · idf(t)² · t.getBoost() · norm(t,d))  
    

    추가 매개변수 정의:
  • 필드 길이 준칙:norm
  • 필드 길이 귀일치 (norm) 는 필드의 어수 제곱근의 역수입니다.
    norm(d) = 1/√numTerms
    필드의 길이는 얼마입니까?길이가 길수록 관련성이 낮아진다.검색어가 짧은 제목에 나타나는 것은 같은 단어보다 긴 콘텐츠 필드에 나타나는 권한이 더 크다.
  • 조회 귀일인자
  • 조회 귀일인자(queryNorm는 조회를 귀일화시키려고 시도한다. 이렇게 하면 두 개의 서로 다른 조회 결과를 비교할 수 있다.
    이 인자는 조회 과정의 맨 앞에서 계산한 것으로 구체적인 계산은 구체적인 조회에 의존한다
    queryNorm = 1 / √sumOfSquaredWeights 
    
    sumOfSquaredWeights 는 쿼리의 각 단어에 대한 IDF의 제곱입니다.
    이상은 한 단어를 검색할 때의 관련도를 계산한 것이다. 여러 단어를 조회할 때 여러 개의 관련도를 얻으면 벡터 공간 모델에 따라 전체적인 유사도를 계산해야 한다.
    벡터 공간 모델:vector
    벡터 공간 모델(vector space 모델)은 비교적 여러 단어로 조회하는 방식을 제공한다. 단일 평점은 문서와 조회의 일치 정도를 대표한다
    벡터 공간 모델에서 벡터 공간 모델의 모든 숫자는 한 단어의 권중을 대표하고 주파수/역방향 문서 주파수(termfrequency/inversedocumentfrequency) 계산 방식과 유사하다.

    3. 제어 관련도


    일반적으로 관련도를 제어하는 수요는 두 가지로 나뉜다.
  • TF/IDF를 무시하면 채점이 필요하지 않으며 constant_score는 constant_score 쿼리에 쿼리나 필터를 포함할 수 있으며, 일치하는 문서에 대한 평점 1 을 지정하고 TF/IDF 정보를 무시할 수 있습니다.
  • 맞춤형 평점function_score 조회는 평점 과정을 제어하는 궁극의 무기로 주 조회와 일치하는 문서마다 함수를 적용하여 원시 조회 평점_score을 바꾸거나 완전히 교체하는 목적을 달성할 수 있다.본고는 주로 사용script_score 함수를 소개한다.

  • 스크립트를 사용하여 평가 script_ 계산하기score 사용자 정의 스크립트는 채점 계산을 완전히 제어할 수 있습니다.
    {
        "function_score": {
            "functions": {
                "script_score": {
                    "script": "doc['price'].value + doc['margin'].value"
                }
            }
        }
    }
    

    4、Painless


    es 스크립트 엔진은 간단하고 안전하며 통증 없이 사용됩니다. Painless는 화이트 리스트를 사용하여 함수와 필드의 접근을 제한하고 es의 장면을 최적화하며 es 데이터만 조작하여 더욱 경량급입니다.
    Painless에서 변수는 기본 데이터 유형, 참조 유형, 문자열, void, (반환되지 않음), 배열 및 동적 유형으로 선언될 수 있습니다.지원되는 기본 유형은 다음과 같습니다.
    byte, short, char, int, long, float, double, boolean.설명 변수는 java와 유사합니다.
    int i = 0; double a; boolean g = true;
    

    그룹 형식은 1차원과 다차원을 지원하며, 초기값은null입니다.인용 형식과 마찬가지로 new 키워드를 사용하고 모든 차원에 괄호를 설정합니다
    int[] x = new int[2];  
    x[0] = 3;  
    x[1] = 4;  
    
    int[] b = new int[] {1,2,3,4,5};  
    

    painless는 동적 형식을 지원합니다.elasticsearch는 자동으로 형식을 추정합니다
    def a = 1;  
    def b = "foo";  
    def[][] h = new def[2][2];  
    

    조건문 및 연산자


    Painless는 우선순위와 결합성을 제외하고 다른 고급 언어와 거의 호환되는 온전한 조작부호 목록을 포함한다.
    if (doc['foo'].value = 5) {  
        doc['foo'].value *= 10;
    } 
    else {  
        doc['foo'].value += 10;
    }
    

    Painless 지원if else 또는 지원되지 않음else if

    순환

    def total = 0;  
    for (def i = 0; i < doc['scores'].length; i++) {  
        total += doc['scores'][i];
    }
    return total;  
    

    5. 통제 관련도 실천


    이 실례에서 script_score, 평점 설정: switch
    {
        "query": {
            "function_score": {
                "query": {
                    "match": {
                        "name": "1"
                    }
                },
                "functions": [
                    {
                        "script_score": {
                            "script": {
                                "params": {
                                    "download_ratio": 2.5,
                                    "replication_ratio": 1.2
                                },
                                "lang": "painless",
                                "inline": "doc['download_cnt'].value * params.download_ratio + doc['replication_cnt'].value * params.replication_ratio"
                            }
                        }
                    }
                ]
            }
        }
    }
    

    _검색 작업의 모든 반환값은 doc['download_cnt'].value * 2.5 +doc['replication_cnt'].value * 1.2 형식의 변수doc를 통해 얻을 수 있습니다.다른 모든 스크립트 언어와 마찬가지로 [] 로 map 의 값을 가져옵니다.여기서 강조해야 할 것은doc에서만_검색

    좋은 웹페이지 즐겨찾기