关键词搜索

默认情况下,UDB-SX 使用 Okapi BM25 算法计算文档得分。BM25 是一种基于关键词的算法,对查询中出现的词语执行词汇搜索。

在确定文档相关性时,BM25 考虑词频/逆文档频率 (TF/IDF)

  • 词频 规定搜索词出现次数越多的文档相关性越高。

  • 逆文档频率 对语料库所有文档中常见词语(例如,“the”这样的冠词)赋予较低的权重。

示例

以下示例查询在 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!"
        }
      },
      {
        "_index": "shakespeare",
        "_id": "83798",
        "_score": 16.523308,
        "_source": {
          "type": "line",
          "line_id": 83799,
          "play_name": "Richard III",
          "speech_number": 42,
          "line_number": "3.7.242",
          "speaker": "BUCKINGHAM",
          "text_entry": "Long live Richard, Englands royal king!"
        }
      },
      {
        "_index": "shakespeare",
        "_id": "82994",
        "_score": 15.588365,
        "_source": {
          "type": "line",
          "line_id": 82995,
          "play_name": "Richard III",
          "speech_number": 24,
          "line_number": "3.1.80",
          "speaker": "GLOUCESTER",
          "text_entry": "live long."
        }
      },
      {
        "_index": "shakespeare",
        "_id": "7199",
        "_score": 15.586321,
        "_source": {
          "type": "line",
          "line_id": 7200,
          "play_name": "Henry VI Part 2",
          "speech_number": 12,
          "line_number": "2.2.64",
          "speaker": "BOTH",
          "text_entry": "Long live our sovereign Richard, Englands king!"
        }
      }
      ...
    ]
  }
}

相似性算法

下表列出了支持的相似性算法。

算法 描述
BM25 默认的 UDB-SX Okapi BM25 相似性算法。
boolean 为词条分配等于其提升值的得分。当您希望文档得分基于词条是否匹配的二元值时,使用 boolean 相似性。

指定相似性算法

您可以在字段级别配置映射时,在 similarity 参数中指定相似性算法。

例如,以下查询为 boolean_field 指定 boolean 相似性。bm25_field 被分配默认的 BM25 相似性:

PUT /testindex
{
  "mappings": {
    "properties": {
      "bm25_field": { 
        "type": "text"
      },
      "boolean_field": {
        "type": "text",
        "similarity": "boolean" 
      }
    }
  }
}

配置 BM25 相似性参数

您可以在索引级别配置 BM25 相似性参数,如下所示:

PUT /testindex
{
  "settings": {
    "index": {
      "similarity": {
        "custom_similarity": {
          "type": "BM25",
          "k1": 1.2,
          "b": 0.75,
          "discount_overlaps": "true"
        }
      }
    }
  }
}

BM25 相似性支持以下参数。

参数 数据类型 描述
k1 浮点数 确定非线性词频归一化(饱和)特性。默认值为 1.2
b 浮点数 确定文档长度对 TF 值的归一化程度。默认值为 0.75
discount_overlaps 布尔值 确定在计算范数时是否忽略重叠词条(位置增量为零的词条)。默认为 true(计算范数时不计算重叠词条)。