[Elasticsearch] 전체 텍스트 검색(二) - 다중 단어 검색 및 검색 병합

18194 단어 ElasticsearchSearch

다국어 쿼리(Multi-word Queries)


만약 우리가 한 번에 한 단어만 검색할 수 있다면, 전체 텍스트 검색은 상당히 유연하지 않을 것이다.다행히도 match 조회를 통해 다사 조회를 실현하는 것도 마찬가지로 간단하다.
GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "title": "BROWN DOG!"
        }
    }
}

위의 쿼리는 다음 네 개의 문서를 모두 반환합니다.
{
  "hits": [
     {
        "_id":      "4",
        "_score":   0.73185337, 
        "_source": {
           "title": "Brown fox brown dog"
        }
     },
     {
        "_id":      "2",
        "_score":   0.47486103, 
        "_source": {
           "title": "The quick brown fox jumps over the lazy dog"
        }
     },
     {
        "_id":      "3",
        "_score":   0.47486103, 
        "_source": {
           "title": "The quick brown fox jumps over the quick dog"
        }
     },
     {
        "_id":      "1",
        "_score":   0.11914785, 
        "_source": {
           "title": "The quick brown fox"
        }
     }
  ]
}

문서 4의 상관도는 "brown" 두 번과 "dog" 한 번을 포함하기 때문에 가장 높다.문서 2와 문서 3은 "brown""dog" 한 번을 포함하고 있으며, title 필드는 같은 길이를 가지고 있기 때문에 점수가 같습니다.문서 1에는 "brown" 만 포함되어 있습니다.match 조회는 두 개의 단어-["brown","dog"]-내부에서 두 개term 조회를 실행하고 그 결과를 합쳐서 전체적인 결과를 얻어야 하기 때문이다.따라서 두 개의 term 조회를 하나의 bool 조회를 통해 조직할 것입니다. 우리는 합병 조회 1절에서 상세하게 소개할 것입니다.
위의 예에서 받아들여야 할 경험은 문서의 title 필드에 최소한 하나의 지정된 단어만 포함하면 이 조회와 일치할 수 있다는 것이다.일치하는 단어가 많을수록 문서의 관련도가 높다는 것을 의미한다.

정밀도 향상(Improving Precision)


모든 검색어를 일치시켜도 일치하면 최종 결과에서 무관해 보이는 일치하는 경우가 많다.그것은 산탄총 식의 전략(Shotgun Approach)이다.우리는 아마도 모든 검색 단어를 포함하는 문서만 표시하고 싶을 것이다.다시 말하면 brown OR dog보다 우리가 더 원하는 결과는 brown AND dog 이다.match 쿼리는 기본값인 operator 매개변수를 수락합니다.모든 단어가 일치해야 한다는 것을 요구하기 위해 "or" 로 바꿀 수 있습니다.
GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "title": {      
                "query":    "BROWN DOG!",
                "operator": "and"
            }
        }
    }
}
"and" 조회의 구조는 match 파라미터를 수용하기 위해 약간 바뀌어야 한다.
이 검색 결과는 문서 1을 제외합니다. 검색 단어만 포함되어 있기 때문입니다.

정밀도 제어(Controlling Precision)


all와any 중에서 선택하면 흑백이 아닌 느낌이 든다.만약 사용자가 5개의 검색어를 지정했는데 문서에 4개만 포함되어 있다면?operator"operator" 로 설정하면 제외됩니다.
때때로 이것이 바로 당신이 원하는 것이지만, 대부분의 전문 검색의 사용 장면에 대해 관련도가 높은 문서를 결과에 포함하고 관련도가 낮은 것을 제외하기를 원할 것이다.다시 말하면 우리는 양자 사이에 개재된 방안이 필요하다."and" 검색 지원 match 매개 변수는 몇 개의 단어가 일치해야 이 문서를 관련 문서로 사용할 수 있는지 지정할 수 있습니다.비록 하나의 단어의 절대 수량을 지정할 수 있지만, 일반적으로 백분율을 지정하는 것은 더욱 의미가 있다. 왜냐하면 사용자가 몇 개의 단어를 입력하는지 제어할 수 없기 때문이다.
GET /my_index/my_type/_search
{
  "query": {
    "match": {
      "title": {
        "query":                "quick brown dog",
        "minimum_should_match": "75%"
      }
    }
  }
}

백분율로 지정하면 minimum_should_match 나머지 작업이 완료됩니다. 위에 3개의 단어가 있는 예에서 minimum_should_match 는 아래로 75%, 즉 3개의 단어 중 2개로 반올림됩니다.입력한 것이 무엇이든지 간에 적어도 두 개의 단어가 일치해야만 이 문서는 최종 결과의 일원으로 간주될 수 있다.66.6% 매개 변수는 매우 유연하여 사용자가 입력한 단어의 수량에 따라 서로 다른 규칙을 적용할 수 있다.구체적으로 minimum_should_match 파라미터의 관련 문서를 참고할 수 있다.minimum_should_match 조회가 어떻게 다사 조회를 처리하는지 더 잘 이해하기 위해서, 우리는 match 조회가 어떻게 여러 개의 조회를 통합하는지 보아야 한다.

질의 결합(Combining Queries)


필터 통합에서 우리는 bool 필터를 사용하여 여러 필터를 통합하여 bool, and, or 논리를 실현하는 것을 토론했다.not 조회도 비슷한 일을 했지만 현저한 차이가 있다.
필터가 2원 결정을 내렸습니다. 이 문서는 결과 목록에 포함되어야 합니까?조회는 더욱 미묘하다.그것들은 문서를 포함할지 여부를 결정해야 할 뿐만 아니라, 이 문서가 얼마나 관련되어 있는지도 결정해야 한다.
필터와 유사하게 bool 조회는 bool, mustmust_not 파라미터를 통해 여러 개의 조회를 받습니다.예:
GET /my_index/my_type/_search
{
  "query": {
    "bool": {
      "must":     { "match": { "title": "quick" }},
      "must_not": { "match": { "title": "lazy"  }},
      "should": [
                  { "match": { "title": "brown" }},
                  { "match": { "title": "dog"   }}
      ]
    }
  }
}
should 필드에 단어title가 있고 단어quick가 없는 문서는 결과로 반환됩니다.지금까지의 작업 방식은 lazy 필터와 매우 비슷하다.
차이는 두 개의 bool 문장에서 비롯된다. 문서에 단어 shouldbrown 를 포함해야 한다는 요구를 받지 않지만, 만약 그것이 포함된다면 그것의 관련도는 더욱 높아져야 한다.
{
  "hits": [
     {
        "_id":      "3",
        "_score":   0.70134366, 
        "_source": {
           "title": "The quick brown fox jumps over the quick dog"
        }
     },
     {
        "_id":      "1",
        "_score":   0.3312608,
        "_source": {
           "title": "The quick brown fox"
        }
     }
  ]
}

문서 3의 점수는 dogbrown 을 포함하기 때문에 더 높습니다.

점수 계산(Score Calculation)

dog 조회는 일치하는 bool 문장과 must 문장의 should 를 더한 다음에 _score 문장과 must 문장의 총수를 나누어 관련도 점수should를 얻는다._score 문장은 점수에 영향을 주지 않는다.그것들의 유일한 목적은 필요하지 않은 문서를 제외하는 것이다.

정밀도 제어(Controlling Precision)


모든 must_not 문장은 일치해야 하고, 모든 must 문장은 일치할 수 없지만, must_not 문장은 몇 개 일치해야 합니까?기본적으로 should 문장은 하나도 일치하지 않습니다. 단지 하나의 특례만 있습니다. 만약 조회에 should 문장이 없다면, 최소한 must 문장은 일치해야 합니다.
우리가 should 조회의 정밀도를 제어할 수 있듯이 match 파라미터를 통해 minimum_should_match 문장이 일치해야 하는 수량을 제어할 수 있다. 이 파라미터는 절대 수치나 백분율일 수 있다.
GET /my_index/my_type/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "brown" }},
        { "match": { "title": "fox"   }},
        { "match": { "title": "dog"   }}
      ],
      "minimum_should_match": 2 
    }
  }
}

위의 질의는 다음 문서만 포함합니다.should 필드: title 또는 "brown" AND "fox" 또는 "brown" AND "dog"만약 문서에 세 개의 단어가 모두 포함되어 있다면, 그것은 더욱 관련이 있다고 여겨질 것이다.

좋은 웹페이지 즐겨찾기