我想在elasticsearch中执行搜索时忽略tf-idf搜索中的字段规范。您可以通过设置索引映射来实现忽略字段规范来完成此操作。然而,这似乎是通过更改索引完成的,我只想修改搜索(我需要其他类型的搜索的规范)。有什么最好的方法可以实现这一点吗?我正在使用elasticsearch.js作为我的elasticsearch接口。
您无法按照每个搜索的基础来禁用规范,但是您可以使用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
上进行搜索。您必须重新索引数据,以便新字段对所有文档都可用,仅将其添加到映射中不会改变现有文档的任何内容。
这是我最终采用的方法。我没有使用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
client.indices.create({
index: "db",
body: {
settings: {
number_of_shards: 1,
similarity : "norm_bm25"
}
}
}