2.X/2. Search in Depth

2-6-04. Manipulating Relevance with Query Structure

drscg 2017. 9. 24. 19:28

The Elasticsearch query DSL is immensely flexible. You can move individual query clauses up and down the query hierarchy to make a clause more or less important. For instance, imagine the following query:

Elasticsearch의 query DSL은 매우 유연하다. 개별 query 절을, 절의 중요도에 따라, query 계층 구조의 위아래로 옮길 수 있다. 예를 들어, 아래 query를 가정해 보자.

quick OR brown OR red OR fox

We could write this as a bool query with all terms at the same level:

이것을, 모든 단어를 동일한 수준으로 하는, bool query를 사용해서, 아래와 같이 작성할 수 있다.

GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "term": { "text": "quick" }},
        { "term": { "text": "brown" }},
        { "term": { "text": "red"   }},
        { "term": { "text": "fox"   }}
      ]
    }
  }
}

But this query might score a document that contains quickred, and brown the same as another document that contains quickred, and foxRed and brown are synonyms and we probably only need one of them to match. Perhaps we really want to express the query as follows:

그러나, 이 query는, quickredbrown 을 포함하는 document와, quickredfox 을 포함하는 다른 document의 score가 같을 것이다. red 와 brown 은 동의어이고, 둘 중 하나라도 일치하는 document를 원한다면, 다음과 같이 query를 표현할 수 있다.

quick OR (brown OR red) OR fox

According to standard Boolean logic, this is exactly the same as the original query, but as we have already seen in Combining Queries, a bool query does not concern itself only with whether a document matches, but also with how well it matches.

표준 boolean logic에 따르면, 이것은 원래의 query와 정확히 일치한다. 그러나, query의 조합에서 이미 보았듯이, bool query는 document가 일치하느냐 여부뿐만 아니라, 얼마나 잘 일치하는가 에도 관여한다.

A better way to write this query is as follows:

이 query를 작성하는 더 나은 방법은 아래와 같다.

GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "term": { "text": "quick" }},
        { "term": { "text": "fox"   }},
        {
          "bool": {
            "should": [
              { "term": { "text": "brown" }},
              { "term": { "text": "red"   }}
            ]
          }
        }
      ]
    }
  }
}

Now, red and brown compete with each other at their own level, and quickfox, and red OR brownare the top-level competitive terms.

이제, red 와 brown 은 그들 자신의 수준에서 서로 비교를 하고, quickfox 그리고 red OR brown 은 최상위의 비교 단어들이다.

We have already discussed how the matchmulti_matchtermbool, and dis_max queries can be used to manipulate scoring. In the rest of this chapter, we present three other scoring-related queries: the boosting query, the constant_score query, and the function_score query.

matchmulti_matchtermbool 그리고 dis_max query가 score를 조정하는데 사용될 수 있는 방법에 대해 이미 이야기했다. 이 장의 나머지 부분에서, score 계산과 관련된 3개의 다른 query(boostingconstant_scorefunction_score query)를 검토해 보자.

'2.X > 2. Search in Depth' 카테고리의 다른 글

2-6-02. Lucene’s Practical Scoring Function  (0) 2017.09.24
2-6-03. Query-Time Boosting  (0) 2017.09.24
2-6-05. Not Quite Not  (0) 2017.09.24
2-6-06. Ignoring TF/IDF  (0) 2017.09.24
2-6-07. function_score Query  (0) 2017.09.24