2013-07-08 2 views
9

내가 찾고있는 것은 ElasticSearch (Lucene)의 기본 채점 메커니즘이 실제로 어떻게 작동하는지에 대한 명확하고 명확한 설명입니다. Lucene 점수를 사용합니까, 아니면 자체 점수를 사용합니까?ElasticSearch 기본 채점 메커니즘

예를 들어, "이름"필드와 같이 문서를 검색하려고합니다. .NET NEST 클라이언트를 사용하여 쿼리를 작성합니다. 의는 이러한 유형의 쿼리를 생각해 보자 : 검색에서 수행 약 110 만 문서가

{ 
"from": 0, 
"size": 300, 
"explain": true, 
"query": { 
    "match": { 
    "Name": { 
     "query": "ExampleName" 
     } 
    } 
    } 
} 

: 같은 JSON 쿼리로 번역되어

IQueryResponse<SomeEntity> queryResult = client.Search<SomeEntity>(s => 
    s.From(0) 
    .Size(300) 
    .Explain() 
    .Query(q => q.Match(a => a.OnField(q.Resolve(f => f.Name)).QueryString("ExampleName"))) 
); 

.

첫 번째 필드는 단지 이드
650 "ExampleName" 7,313398 

651 "ExampleName" 7,313398 

652 "ExampleName" 7,313398 

653 "ExampleName" 7,239194 

654 "ExampleName" 7,239194 

860 "ExampleName of Something" 4,5708737 

, 두 번째는 ElasticSearch가 검색있어 수행하는 이름 필드이며, 셋째 : 내가 대가로 얻을 것은 (즉, 단지 내 자신에 포맷 된 결과의 일부이다)이다 점수입니다.

보시다시피, ES 색인에는 많은 중복이 있습니다. 발견 된 문서 중 일부는 다른 점수를 가지고 있기 때문에 정확히 동일한 ID (다른 ID 만 사용)에도 불구하고 전체 데이터 세트의 다른 부분을 검색하여 다른 부분을 검색했기 때문에 점수가 전반적으로 어느 정도인지를 확인할 수있었습니다 검색 엔진에 의해 실제로 고려되는 문서에만 해당되는 것은 아닙니다.

질문은 정확히 어떻게 점수가 계산됩니까? 내 말은, 당신이 말해 줄 수/나에게 보여줘/정확한 수식을 가리켜 서 ES에서 찾은 각 문서의 점수를 계산할 수 있습니까? 그리고 결국이 채점 방식이 어떻게 바뀔 수 있습니까?

답변

11

기본 채점은 Lucene 코어의 DefaultSimilarity 알고리즘 인 largely documented here입니다. your own Similarity을 구성하거나 custom_score query과 같은 것을 사용하여 점수를 사용자 정의 할 수 있습니다.

표시된 첫 번째 5 개 결과의 홀수 점수 변동은 쿼리 결과의 유효성과 순서와 관련해서는별로 신경 쓰지 않는 것처럼 보이지만 그 원인을 이해하려면, explain api은 정확히 무엇이 진행되고 있는지 보여줄 수 있습니다.

+0

좋아, 그게 내가 알고 싶은 걸 다루고있어. ES가 순수하게 Lucene의 유사성을 사용한다는 정보는 매우 유용합니다. 감사! –

+0

Lucene의 채점 알고리즘에 대한 자세한 내용은 http://www.lucenetutorial.com/advanced-topics/scoring.html을 참조하십시오. – ThoQ

2

점수 변동은 특정 샤드의 데이터를 기반으로합니다 (의심되는 것처럼). 기본적으로 ES는 검색 유형을 사용하고을 가져 와서 각 샤드에 쿼리를 보내고 로컬 TDIF를 사용하여 점수가있는 모든 일치하는 문서를 찾습니다 (이것은 주어진 샤드의 데이터에 따라 달라집니다 - 여기에 문제가 있습니다) .

'dfs 쿼리를 사용한 다음 가져 오기'검색 유형 - 용어 및 문서 빈도에 대해 묻는 각 샤드를 사전 요청한 다음 각 샤드 등에 쿼리를 전송할 수 있습니다.

당신은 URL에 설정할 수 있습니다

$ curl -XGET '/index/type/search?pretty=true&search_type=dfs_query_then_fetch' -d '{ 
    "from": 0, 
    "size": 300, 
    "explain": true, 
    "query": { 
    "match": { 
     "Name": { 
     "query": "ExampleName" 
     } 
    } 
    } 
}'