elasticsearch tf-idf并忽略搜索中的字段长度范数

时间:2016-07-12 20:36:31

标签: elasticsearch

我想在elasticsearch中执行搜索,忽略tf-idf搜索中的字段规范。您可以通过ignoring the field norms by setting the index mappings完成此操作。然而,似乎这是通过更改索引来实现的,我只想修改搜索(我需要其他类型搜索的规范)。完成此任务的最佳方法是什么?我使用elasticsearch.js作为弹性搜索的接口。

2 个答案:

答案 0 :(得分:5)

您不能基于每个搜索禁用规范,但您可以使用Multi Fields API添加禁用规范的其他字段。

PUT /my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "my_field": {
          "type": "string",
          "fields": {
            "no_norms": { 
              "type":  "string",
              "norms": {
                "enabled": false
              }
            }
          }
        }
      }
    }
  }
}

现在,如果您需要规范,可以在my_field上进行搜索,如果不需要,则可以在my_field.no_norms上进行搜索。您必须重新索引数据,以便新字段可用于所有文档,只需将其添加到映射中就不会更改任何退出文档的内容。

答案 1 :(得分:2)

所以这就是我最终使用的方法。而不是使用tf-idf(当前弹性搜索默认值)我使用了BM25,这应该更好。此外,它有一个参数" b"这代表了场长规范的重要性。对于" b = 0"字段长度范数被忽略,而默认值为0.75。可以找到BM25的讨论here。在我的elasticsearch.yml里面我有

index :
  similarity:
    default:
      type: BM25
      b: 0.0
      k1: 1.2
    norm_bm25:
      type: BM25
      b: 0.75
      k1: 1.2

对于那些使用elasticsearch javascript api的人,可以在索引创建期间定义自定义相似性

client.indices.create({
  index: "db",
  body: { 
        settings: { 
          number_of_shards: 1,
          similarity : "norm_bm25"
        } 
  }
}