在搜索中忽略字段长度规范的elasticsearch tf-idf

4
我想在elasticsearch中执行搜索时忽略tf-idf搜索中的字段规范。您可以通过设置索引映射来实现忽略字段规范来完成此操作。然而,这似乎是通过更改索引完成的,我只想修改搜索(我需要其他类型的搜索的规范)。有什么最好的方法可以实现这一点吗?我正在使用elasticsearch.js作为我的elasticsearch接口。
2个回答

6

您无法按照每个搜索的基础来禁用规范,但是您可以使用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上进行搜索。您必须重新索引数据,以便新字段对所有文档都可用,仅将其添加到映射中不会改变现有文档的任何内容。


3

这是我最终采用的方法。我没有使用tf-idf(当前elasticsearch默认值),而是使用据说更好的BM25。它有一个参数"b",代表字段长度规范的重要性。当"b=0"时,字段长度规范被忽略,而默认值为0.75。可以在这里找到关于BM25的讨论。在我的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"
        } 
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接