동의어

동의어 (Synonyms)

검색에서 "great"를 검색해도 "fantastic"을 찾는 문서가 나오게 만들고 싶다면, 두 단어가 같은 뜻이라고 Meilisearch에 알려주면 돼요. Meilisearch의 동의어 기능은 의미가 같은 쿼리 용어 집합을 검색 중에 동등하게 취급하도록 만들어, 검색 결과의 관련성을 크게 높여줍니다. 이 글에서는 동의어를 설정하는 방법과 양방향·단방향 연관, 그리고 주의해야 할 한계까지 정리해 드릴게요.

출처: Meilisearch 공식 문서 — Synonyms

본문

데이터셋에서 여러 단어가 동일한 의미를 가진다면, 동의어 목록을 만들면 검색 결과가 더 관련성 높아져요. 동의어로 설정된 단어들이 항상 같은 결과를 반환하는 건 아니에요. 기본 설정에서 movies 데이터셋은 great에 대해 547개, fantastic에 대해 66개 결과를 반환한다고 해볼게요. 이 둘을 동의어로 설정해 보죠:

client.index('movies').update_synonyms({
  'great': ['fantastic'],
  'fantastic': ['great']
})
curl \
  -X PUT 'MEILISEARCH_URL/indexes/movies/settings/synonyms' \
  -H 'Authorization: Bearer API_KEY' \
  -H 'Content-Type: application/json' \
  --data-binary '{
    "great": ["fantastic"], "fantastic": ["great"]
  }'

great에 대한 검색은 이제 오타 한 개(예: create)만 허용하면서, great의 모든 변형(예: greatest)과 fantastic까지 함께 고려합니다.

정규화 (Normalization)

인덱싱 과정에서 모든 동의어는 인덱스 설정, 즉 stop words, separator/non-separator 토큰을 사용해 처리돼요. 동의어가 separator 토큰(예: &)으로 취급되지 않도록 주의하세요. 그렇게 되면 검색 중에 무시됩니다.

단방향 연관 (One-way association)

한 단어만 다른 단어와 동의어가 되고, 그 반대는 되지 않길 원할 때 사용해요.

phone => iphone

phone을 검색하면 문서에 phone이 들어 있는 것처럼 iphone을 포함하는 문서를 반환해요. 하지만 iphone을 검색하면, phone이 들어 있는 문서는 오타 규칙 때문에 결과에서 더 아래로 랭킹됩니다.

{
  "phone": [
    "iphone"
  ]
}

관련성 (Relevancy)

정확한 검색 쿼리는 항상 동의어보다 우선합니다. exactness 랭킹 규칙이 검색 결과를 랭킹할 때 동의어보다 정확한 단어를 우선시하기 때문이에요.

만약 spirit의 동의어로 ghost를 설정했다면, spirit으로 검색했을 때 문서 0보다 문서 1이 먼저 반환됩니다. 정확한 단어 spirit을 포함한 문서가 우선하기 때문이죠.

상호 연관 (Mutual association)

하나 이상의 동의어를 서로 연관시키면 양방향으로 같은 단어로 취급돼요.

shoe <=> boot <=> slipper <=> sneakers

이 단어 중 하나로 검색하면 모든 동의어가 같은 단어로 취급되어 검색 결과에 나타납니다.

다중 단어 동의어

Meilisearch는 다중 단어 동의어를 구문(phrases)으로 취급해요. 다만 랭킹 규칙에 따라 SF를 포함한 결과보다 관련성이 낮게 평가될 수 있어요. 반대로 쿼리가 San Francisco라면 San Francisco를 포함한 문서가 SF를 포함한 문서보다 높게 랭킹될 수도 있습니다.

동의어 용어 길이 제한

Meilisearch는 1~3개 단어로 된 검색 용어에 대해서만 동의어를 가져와요. 4개 이상 단어의 용어는 동의어 매치를 반환하지 않습니다.

예를 들어 "lotr"의 동의어로 "lord of the rings"를 설정했다면, "lotr"을 검색하면 "lord of the rings"를 포함한 문서가 반환됩니다. 하지만 "lord of the rings"으로 검색하면 검색 용어가 3개 단어를 넘기 때문에 "lotr"을 포함한 문서는 반환되지 않아요.

용어당 최대 동의어 수

단일 용어는 최대 50개의 동의어를 가질 수 있어요. Meilisearch는 이 한도를 넘는 동의어를 조용히 무시합니다. 예를 들어 book에 51개의 동의어를 설정하면, Meilisearch는 용어 자체와 처음 50개의 동의어를 포함한 결과만 반환해요.

어떤 동의어가 한 단어를 넘는 경우, 해당 용어의 모든 동의어에 걸친 단어의 합은 100개를 초과할 수 없어요. Meilisearch는 이 한도를 넘는 동의어를 조용히 무시합니다. 예를 들어 애플리케이션에서 computer에 40개의 동의어를 설정했다면, 이 동의어들은 합쳐서 100개 미만의 단어를 포함해야 해요.

더 알아보기