[Elasticsearch] 제어 관련도(一) - 관련도 분수 계산 배후의 이론

10103 단어 SearchElasticsearch
이 장은 Elasticsearch 공식 안내서의 Controlling Relevance 장에서 번역되었습니다.

상관 관계 제어(Controlling Relevance)


구조화된 데이터(예를 들어 날짜, 수치, 문자 매거 값)만 처리하는 데이터베이스는 문서 (관계 데이터베이스에서 한 줄) 가 조회와 일치하는지 확인하기만 하면 된다.
비록 볼 유형의 YES|NO 일치도 전체 텍스트 검색의 필수 구성이지만, 그것들 자체가 부족하다.우리는 또한 모든 문서와 조회 간의 관련 정도를 알아야 한다.전문 검색 엔진은 일치하는 문서를 찾아야 할 뿐만 아니라, 관련도에 따라 그것들을 정렬해야 한다.
전문 검색 관련도 공식, 또는 유사도 알고리즘이라고 불리며 여러 요소를 종합하여 문서가 없는 관련도를 생성합니다_score.이 장에서 우리는 그 중의 일부 변화의 부분과 그것들을 어떻게 통제하는지 토론한다.
물론 관련도는 전문 조회와 관련이 있는 것이 아니다.그것은 구조화된 데이터를 고려할 수도 있다.우리는 일부 판매점(에어컨, 해경, 무료 와이파이)을 갖춘 리조트 호텔을 찾고 있을지도 모른다.그렇다면 어떤 리조트 호텔이 가진 매장이 많을수록 그것도 관련이 있다.또는 우리는 전문 검색 자체의 관련도를 제외하고 시간의 원근, 가격, 유행도 또는 거리 등 요소도 고려하기를 바란다.
이상의 이러한 구상은 모두 실현 가능한 것으로 ES의 강력한 분수 계산 기능 덕분이다.
우리는 우선 이론적인 측면에서 Lucene이 어떻게 관련도를 계산하는지 본 다음에 실제 예에서 출발하여 이 과정을 어떻게 통제하는지 토론할 것이다.

관련도 분수 계산 배후의 이론


Lucene(즉 ES)은 부울 모델(Boolean Model)을 사용하여 일치하는 문서를 찾고 Prarical Scoring Function이라고 불리는 공식을 사용하여 관련도를 계산한다.이 공식은 단어의 주파수/역렬 문서의 주파수와 벡터 공간 모델의 개념을 빌려 쓰는 동시에 더욱 현대적인 특성, 예를 들어Coordination Factor, 필드의 길이 귀약, 그리고 단어/조회 자구의 향상을 추가했다.
NOTE
겁먹지 마!이 개념들은 결코 그들의 이름처럼 복잡하지 않다.비록 이 절에서 알고리즘, 공식, 수학 모델을 언급했지만 그들의 역할은 인류의 이해를 편리하게 하는 것에 불과하다.알고리즘을 이해하는 것 자체가 결과에 미치는 영향을 이해하는 것보다 더 중요한 것은 아니다.

부울 모델(Boolean Model)


부울 모형은 조회의 AND, OR, NOT 조건을 간단하게 적용하여 모든 일치하는 문서를 찾습니다.다음 질의:
full AND text AND search AND (elasticsearch OR lucene)
모든full,text,search 단어, 그리고 단어elasticsearch나lucene 중 하나를 포함하는 문서만 포함됩니다.
이 과정은 간단하고 신속하다.그것은 조회와 일치하지 않는 문서를 제외하는 데 쓰인다.

단어 빈도/역렬 문서 빈도(TF/IDF)


일단 우리가 일치하는 문서의 목록을 가지고 있다면, 그것들에 대해 관련도 정렬을 해야 한다.모든 문서가 모든 단어를 포함하는 것은 아니며, 일부 단어도 다른 부분의 단어보다 더욱 중요하다.전체 문서의 관련도 점수는 문서에 나타나는 각 조회 단어의 무게에 따라 달라집니다.
한 단어의 권중은 세 가지 요소를 통해 결정된다. 이것은 무엇의 관련도에서 이미 소개되었다.이 공식에 대한 소개는 흥미를 위한 것이기 때문에 너는 그것들을 기억할 필요가 없다.
단어 빈도(Term Frequency)
현재 문서에 단어가 얼마나 자주 나타나나요?빈번할수록 그 권중은 높아진다.한 필드에 다섯 번 나온 단어는 한 번만 나온 문서보다 더 관련이 있을 것이다.단어 빈도는 다음 공식을 통해 계산됩니다.
tf(t in d) = √frequency
단어 t는 문서 d의 단어 빈도 tf로 이 단어가 문서에 나타나는 횟수의 제곱근입니다.
만약 한 필드에 단어가 나타나는 빈도를 상관하지 않는다면, 반대로 단어가 나타났는지 아닌지를 신경 쓰지 않는다면, 필드 맵에서 단어의 빈도를 비활성화할 수 있다.
PUT /my_index
{
  "mappings": {
    "doc": {
      "properties": {
        "text": {
          "type":          "string",
          "index_options": "docs" 
        }
      }
    }
  }
}

index_옵션을docs로 설정하면 단어의 빈도와 단어의 위치 정보를 비활성화합니다.이 설정을 사용한 필드는 단어가 나타나는 횟수를 기록하거나 단어나 인접도 조회에 사용할 수 없습니다.정확한 not_analyzed 문자열 필드는 기본적으로 이 설정을 사용합니다.
역렬 문서 빈도(Inverse Document Frequency)
단어가 모든 문서에 자주 나타납니까?빈번하게 나타날수록 권중은 낮아진다.and나 the 같은 흔히 볼 수 있는 단어는 관련도에 대한 기여가 거의 없다. 왜냐하면 절대 다수의 문서에 나타나기 때문이다.elastic나 힙포타머스 같은 보기 드문 단어는 우리가 가장 흥미를 느끼는 문서를 찾는 데 도움을 줄 수 있기 때문이다.문서 빈도를 역배열하는 계산 방법은 다음과 같습니다.
idf(t) = 1 + log ( numDocs/(docFreq + 1))
단어 t의 역렬 문서 빈도 (idf) 는 색인에 있는 문서 수량을 이 단어를 포함하는 문서 수량으로 나누어 그 대수를 얻습니다.
필드 길이 요약(Field-length Norm)
필드의 길이는 얼마나 됩니까?필드가 짧을수록 그 권한은 높아진다.만약 하나의 단어가 비교적 짧은 필드, 예를 들어 title 필드에 나타난다면, 이 필드의 내용은 더 긴body 필드보다 이 단어에 관한 것일 가능성이 높다.필드 길이는 다음과 같이 계산됩니다.
norm(d) = 1/√numTerms
비록 필드의 길이는 전체 텍스트 검색에 있어서 중요하지만, 많은 다른 필드는 필요하지 않다.문서에 이 필드가 포함되어 있든 없든 인덱스에 있는 모든 문서의 문자열 필드는 대략 1바이트의 공간을 소모해야 한다.정확한 값의 not_analyzed 문자열 필드, 요약 기능은 기본적으로 비활성화되지만, analyzed 형식의 필드를 필드를 통해 비활성화할 수도 있습니다.
PUT /my_index
{
  "mappings": {
    "doc": {
      "properties": {
        "text": {
          "type": "string",
          "norms": { "enabled": false } 
        }
      }
    }
  }
}

이상의 예에서 이 필드는 필드의 길이를 요약하지 않습니다.이것은 필드의 길이가 더 이상 관련도 계산에 고려되지 않는다는 것을 의미한다.
로그 기록의 이런 용례에 대해 귀약은 그다지 쓸모가 없다.당신이 신경 쓰는 것은 특정한 오류 코드나 브라우저 표지 코드가 특정한 필드에 나타났는지 여부입니다.필드의 길이는 결과에 영향을 주지 않습니다.귀약 기능을 사용하지 않아도 상당한 메모리 공간을 절약할 수 있다.
결합
이상의 세 가지 요소인 단어 주파수, 역렬 문서 주파수와 필드 길이 규범은 모두 색인 기간에 계산되고 저장된다.그것들은 문서에 대한 단일 단어의 무게를 계산하는 데 사용된다.
TIP
우리가 앞에서 토론한 문서는 사실상 토론 문서의 필드이다.각 필드에는 자체 역렬 인덱스가 있으므로 TF/IDF의 경우 필드 값과 문서 값이 동일합니다.
explain을true(Understanding the Score 참조)로 설정하고 간단한 term 조회를 실행할 때 점수 계산에 참여하는 요소가 앞에서 논의한 것들이라는 것을 알게 될 것입니다.
PUT /my_index/doc/1
{ "text" : "quick brown fox" }

GET /my_index/doc/_search?explain
{
  "query": {
    "term": {
      "text": "fox"
    }
  }
}

앞의 요청에 대한 설명은 다음과 같습니다.
weight(text:fox in 0) [PerFieldSimilarity]: 0.15342641 result of: fieldWeight in 0 0.15342641 product of: tf(freq=1.0), with freq of 1: 1.0 idf(docFreq=1, maxDocs=1): 0.30685282 fieldNorm(doc=0): 0.5
첫 번째 줄: Lucene 내부 문서 ID가 0인 문서의 경우 텍스트 필드에서 단어 fox의 최종 구분 값입니다.다섯 번째 줄-일곱 번째 줄: 단어 주파수, 문서 역렬 주파수와 필드 길이를 요약한 결과.
물론 조회는 통상적으로 한 개의 단어만 있는 것이 아니기 때문에 우리는 여러 개의 단어의 권한을 다시 연결시키는 방법이 필요하다.이를 위해 벡터 공간 모델(Vector Space Model)을 구할 수 있습니다.

벡터 공간 모형


벡터 공간 모델은 다중 단어 조회의 비교 방법을 제공했다.그것의 출력은 문서와 조회 사이의 일치 정도를 나타내는 값이다.이 값을 계산하기 위해서 문서와 조회는 모두 벡터로 표시됩니다.
하나의 벡터는 실제로 수치를 포함하는 1차원 그룹이다. 예를 들어 다음과 같다.
[1,2,5,22,3,8]
벡터 공간 모델에서 벡터의 모든 수치는 TF/IDF가 계산한 단어의 무게입니다.
TIP
TF/IDF는 벡터 공간 모델에서 기본적으로 단어의 무게를 계산하는 데 사용되지만, 유일하게 사용할 수 있는 방법은 아니다.ES에서는 Okapi-BM25와 같은 다른 계산 모델도 사용할 수 있습니다.TF/IDF는 간결성, 효율성, 검색 결과의 높은 품질로 인해 시간의 시련을 겪어 기본적인 방법으로 여겨진다.
만약에 우리가'happy hippopotamus'를 조회했다고 가정해 보세요.해피와 같은 흔히 볼 수 있는 단어의 권중은 비교적 낮지만, 힙포타머스와 같은 보기 드문 단어는 비교적 높은 권중을 가지고 있다.해피의 권중은 2이고 힙합의 권중은 5라고 가정하자.우리는 좌표를 사용하여 이 간단한 2차원 벡터 - [2,5] - 좌표(0,0)에서 좌표(2,5)까지의 직선을 다음과 같이 표현할 수 있다.
이제 세 개의 문서가 있다고 가정해 보겠습니다.
  • I am happy in summer.
  • After Christmas I’m a hippopotamus.
  • The happy hippopotamus helped Harry.

  • 우리는 모든 문서에 유사한 벡터를 만들 수 있습니다. 이 벡터는 모든 조회 단어의 권한으로 구성되어 있습니다. 즉, 문서에 나타나는 단어인happy와 hippopotamus를 좌표에 그려서 다음 그림과 같습니다.
  • 문서 1: (happy, ___________) -[2,0]
  • 문서 2: (___, hippopotamus) - [0,5]
  • 문서 3: (happy, hippopotamus) - [2,5]

  • 벡터의 아주 좋은 성질은 그것들이 비교될 수 있다는 것이다.조회 벡터와 문서 벡터 사이의 각도를 측정함으로써 우리는 모든 문서에 관련도 값을 계산할 수 있다.문서 1과 조회 사이의 각도가 비교적 크기 때문에 그것의 관련도는 비교적 낮다.문서 2와 조회는 더욱 가깝기 때문에 관련도가 높고 문서 3과 조회 사이에는 완벽한 일치가 있다.
    TIP
    실제로 2차원 벡터 (두 개의 단어를 사용한 조회) 만이 좌표에 간단하게 표시될 수 있다.다행히도 선형 대수-수학의 한 가지로 벡터를 처리할 수 있고 다차원 벡터 간의 각도를 비교하는 도구를 제공할 수 있다. 이것은 우리가 상술한 원리를 이용하여 많은 단어를 포함하는 조회를 처리할 수 있다는 것을 의미한다.
    너는 여현의 유사성을 사용하여 두 벡터를 비교하는 것에 대한 더 많은 정보를 얻을 수 있다.http://en.wikipedia.org/wiki/Cosine_similarity
    우리는 이미 분수 계산의 이론적 기초를 토론하였으니, 이제 Lucene가 어떻게 분수 계산을 진행하는지 봅시다.

    좋은 웹페이지 즐겨찾기