https://docs.opensearch.org/latest/search-plugins/keyword-search/
기본적으로 OpenSearch는 Okapi BM25 알고리즘을 사용하여 문서 점수를 계산합니다. BM25는 쿼리에 나타나는 단어들에 대해 어휘적 검색을 수행하는 키워드 기반 알고리즘입니다.
문서의 관련성을 결정할 때, BM25는 단어 빈도/역문서 빈도(TF/IDF)를 고려합니다:
다음 예제 쿼리는 shakespeare 인덱스에서 "long live king" 단어들을 검색합니다:
GET shakespeare/_search
{
"query": {
"match": {
"text_entry": "long live king"
}
}
}
응답에는 일치하는 문서들이 포함되며, 각각 _score 필드에 관련성 점수가 포함됩니다:
{
"took": 113,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2352,
"relation": "eq"
},
"max_score": 18.781435,
"hits": [
{
"_index": "shakespeare",
"_id": "32437",
"_score": 18.781435,
"_source": {
"type": "line",
"line_id": 32438,
"play_name": "Hamlet",
"speech_number": 3,
"line_number": "1.1.3",
"speaker": "BERNARDO",
"text_entry": "Long live the king!"
}
},
// ... 추가 결과들
]
}
}
지원되는 유사도 알고리즘은 다음과 같습니다:
| 알고리즘 | 설명 |
|---|---|
| BM25 | 기본 OpenSearch Okapi BM25 유사도 알고리즘 |
| LegacyBM25 (Deprecated) | 이전 LegacyBM25Similarity 구현. 하위 호환성을 위해 유지 |
| boolean | 용어에 부스트 값과 동일한 점수를 할당. 문서 점수가 용어 일치의 이진 값을 기반으로 하기를 원할 때 boolean 유사도 사용 |
OpenSearch 3.0에서 기본 유사도 알고리즘이 LegacyBM25Similarity에서 Lucene의 네이티브 BM25Similarity로 변경되었습니다.
주요 변경사항:
이전 점수 계산 방식을 유지하려면 필드나 인덱스에서 LegacyBM25를 명시적으로 구성하세요.
필드 레벨에서 매핑을 구성할 때 similarity 매개변수에서 유사도 알고리즘을 지정할 수 있습니다:
PUT /testindex
{
"mappings": {
"properties": {
"bm25_field": {
"type": "text"
},
"boolean_field": {
"type": "text",
"similarity": "boolean"
}
}
}
}
인덱스 레벨에서 BM25 유사도 매개변수를 다음과 같이 구성할 수 있습니다:
PUT /testindex
{
"settings": {
"index": {
"similarity": {
"custom_similarity": {
"type": "BM25",
"k1": 1.2,
"b": 0.75,
"discount_overlaps": "true"
}
}
}
}
}
| 매개변수 | 데이터 타입 | 설명 |
|---|---|---|
| k1 | Float | 비선형 용어 빈도 정규화(포화) 속성을 결정. 기본값: 1.2 |
| b | Float | 문서 길이가 TF 값을 정규화하는 정도를 결정. 기본값: 0.75 |
| discount_overlaps | Boolean | 노름 계산 시 겹치는 토큰(위치 증분이 0인 토큰)을 무시할지 결정. 기본값: true |
이전 유사도 동작을 유지하려면 유사도 타입으로 LegacyBM25를 지정하세요:
PUT /testindex
{
"settings": {
"index": {
"similarity": {
"default": {
"type": "LegacyBM25",
"k1": 1.2,
"b": 0.75
}
}
}
}
}