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