2.X/3. Dealing with Human Language

3-6-5. Multiword Synonyms and Phrase Queries

drscg 2017. 9. 24. 12:38

So far, synonyms appear to be quite straightforward. Unfortunately, this is where things start to go wrong. For phrase queries to function correctly, Elasticsearch needs to know the position that each term occupies in the original text. Multiword synonyms can play havoc with term positions, especially when the injected synonyms are of differing lengths.

지금까지는, 동의어가 매우 간단한 것으로 보인다. 유감스럽게도, 이것이 문제의 시작이다. phrase query가 정확하게 동작하기 위해서, Elasticsearch는 원래의 문장에서 각 단어가 차지하는 위치를 알아야 한다. 여러 단어(multi-word)에 대한 동의어는, 특히 추가된 동의어의 길이가 다른 경우, 단어의 위치로 인해, 큰 혼란을 가져올 수 있다.

To demonstrate, we’ll create a synonym token filter that uses this rule:

설명을 위해서, 아래 규칙을 사용하는 synonym token filter를 생성해 보자.

"usa,united states,u s a,united states of america"
PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms": [
            "usa,united states,u s a,united states of america"
          ]
        }
      },
      "analyzer": {
        "my_synonyms": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_synonym_filter"
          ]
        }
      }
    }
  }
}

GET /my_index/_analyze?analyzer=my_synonyms&text=
The United States is wealthy

The tokens emitted by the analyze request look like this:

analyze request로 출력된 token은 아래와 같다.

Pos 1:  (the)
Pos 2:  (usa,united,u,united)
Pos 3:  (states,s,states)
Pos 4:  (is,a,of)
Pos 5:  (wealthy,america)

If we were to index a document analyzed with synonyms as above, and then run a phrase query without synonyms, we’d have some surprising results. These phrases would not match:

위 예제의 동의어로 분석된 document를 색인 하고, 동의어 없이 phrase query를 실행해 보면, 약간 놀라운 결과를 볼 수 있다. 아래 구문은 일치하지 않을 것이다.

  • The usa is wealthy
  • The united states of america is wealthy
  • The U.S.A. is wealthy

However, these phrases would:

하지만, 아래 구문은

  • United states is wealthy
  • Usa states of wealthy
  • The U.S. of wealthy
  • U.S. is america

If we were to use synonyms at query time instead, we would see even more-bizarre matches. Look at the output of this validate-query request:

대신에, 검색 시에 동의어를 사용한다면, 더 특이한 결과를 볼 수 있을 것이다. validate-query request의 출력을 살펴보자.

GET /my_index/_validate/query?explain
{
  "query": {
    "match_phrase": {
      "text": {
        "query": "usa is wealthy",
        "analyzer": "my_synonyms"
      }
    }
  }
}

The explanation is as follows:

위 예제의 explanation은 아래와 같다.

"(usa united u united) (is states s states) (wealthy a of) america"

This would match documents containg u is of america but wouldn’t match any document that didn’t contain the term america.

u is of america 를 포함하는 document는 일치할 것이나, 단어 america 를 포함하지 않는 모든 document는 일치하지 않을 것이다.

Tip

Multiword synonyms affect highlighting in a similar way. A query for USA could end up returning a highlighted snippet such as: "The United States is wealthy".

여러 단어에 대한 동의어는 비슷한 방식으로 강조(highlight)에 영향을 미친다. USA 에 대한 query는 "The United States is wealthy" 같은 강조된 데이터를 반환한다.

Use Simple Contraction for Phrase Queriesedit

The way to avoid this mess is to use simple contraction to inject a single term that represents all synonyms, and to use the same synonym token filter at query time:

이 같은 혼란을 피하는 방법은, 모든 동의어를 대표하는 하나의 단어를 추가하는 단순한 축소(Simple contraction) 를 사용하고, 검색 시에 동일한 synonym token filter를 사용하는 것이다.

PUT /my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms": [
            "united states,u s a,united states of america=>usa"
          ]
        }
      },
      "analyzer": {
        "my_synonyms": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_synonym_filter"
          ]
        }
      }
    }
  }
}

GET /my_index/_analyze?analyzer=my_synonyms
The United States is wealthy

The result of the preceding analyze request looks much more sane:

analyze request에 대한 결과는 훨씬 더 정상적이다.

Pos 1:  (the)
Pos 2:  (usa)
Pos 3:  (is)
Pos 5:  (wealthy)

And repeating the validate-query request that we made previously yields a simple, sane explanation:

위에서 만든 것으로, validate-query request를 다시 해보면, 간단하고 정상적인 explanation을 얻을 수 있다.

"usa is wealthy"

The downside of this approach is that, by reducing united states of america down to the single term usa, you can’t use the same field to find just the word united or states. You would need to use a separate field with a different analysis chain for that purpose.

이 방법의 단점은 united states of america 를 하나의 단어 usa 로 축소하여, 단순히 united 나 states라는 단어를 찾기 위해, 동일한 field를 사용할 수 없다는 점이다. 그러기 위해서는 다른 analysis chain을 사용하는 별도의 field를 사용해야 한다.

Synonyms and the query_string Queryedit

We have tried to avoid discussing the query_string query because we don’t recommend using it. In "More-Complicated Queries", we said that, because the query_string query supports a terse mini search-syntax, it could frequently lead to surprising results or even syntax errors.

query_string query의 사용을 추천하지 않기 때문에, 그것에 대해 이야기하는 것을 피하려고 했다. "More-Complicated Queries"에서 언급했듯이, query_string query는 간결한 미니 검색 문법(search-syntax) 을 지원하기 때문에, 가끔 놀라운 결과 또는 문법 오류가 발생할 수 있다.

One of the gotchas of this query involves multiword synonyms. To support its search-syntax, it has to parse the query string to recognize special operators like ANDOR+-field:, and so forth. (See the full query_string syntax for more information.)

이 query의 문제점 중 하나는 여러 단어에 대한 동의어를 포함한다는 것이다. 그것의 검색 문법을 지원하기 위해, ANDOR+-field: 등의 특수한 operator를 인식하도록, query string을 분석해야 한다. (query_string syntax 참조)

As part of this parsing process, it breaks up the query string on whitespace, and passes each word that it finds to the relevant analyzer separately. This means that your synonym analyzer will never receive a multiword synonym. Instead of seeing United States as a single string, the analyzer will receive United and States separately.

이러한 분석 프로세스의 일부로, query string을 공백문자를 기준으로 나눈다. 그리고, 발견한 각 단어를 개별적으로 관련된 analyzer에 전달한다. 즉, synonym analyzer는 절대로 여러 단어에 대한 동의어를 받지 않을 것이다. United States 를 하나의 문자열로 보지 않고, analyzer는 United 와 States 를 개별적으로 받을 것이다.

Fortunately, the trustworthy match query supports no such syntax, and multiword synonyms will be passed to the analyzer in their entirety.

다행히도, 신뢰할 수 있는 match query는 그런 문법을 지원하지 않고, analyzer에 여러 단어에 대한 동의어 전체를 전달한다.


'2.X > 3. Dealing with Human Language' 카테고리의 다른 글

3-6-3. Expand or contract  (0) 2017.09.24
3-6-4. Synonyms and The Analysis Chain  (0) 2017.09.24
3-6-6. Symbol Synonyms  (0) 2017.09.24
3-7. Typoes and Mispelings  (0) 2017.09.24
3-7-1. Fuzziness  (0) 2017.09.24