当搜索词不仅出现一次而是多次出现在文档中时,搜索得分也会增加。虽然大多数时候都可能会这样,但这不是我的情况。
查询:
"query": {
"bool": {
"should": {
"nested": {
"path": "editions",
"query": {
"match": {
"title_author": {
"query": "look me up",
"operator": "and",
"boost": 2
}
}
}
}
},
"must": {
"nested": {
"path": "editions",
"query": {
"match": {
"title_author": {
"query": "look me up",
"operator": "and",
"fuzziness": 0.5,
"boost": 1
}
}
}
}
}
}
}
doc_1
{
"editions": [
{
"editionid": 1,
"title_author": "look me up look me up",
},
{
"editionid": 2,
"title_author": "something else",
}
]
}
和doc_2
{
"editions": [
{
"editionid": 3,
"title_author": "look me up",
},
{
"editionid": 4,
"title_author": "something else",
}
]
}
现在,由于搜索字词包含两次,因此doc_1的得分会更高。我不想要那个。如何关闭此行为?我想要相同的分数 - 无论在匹配文档中找到一次或两次搜索词。
答案 0 :(得分:4)
除了@keety和@Sid1199所讨论的内容之外,还有另一种方法:“text”类型的字段的特殊属性称为index_options。默认情况下,它设置为“位置”,但您可以将其明确设置为“docs”,因此术语频率不会放在索引中,Elasticsearch在搜索时也不会知道重复。
"title_author": {
"type": "text",
"index_options": "docs"
}
答案 1 :(得分:3)
弹性搜索中有一个属性称为"相似性"。有很多类型的相似之处,但这里有用的是" boolean"。如果将相似度设置为" boolean"在您的映射中,它将阻止您的查询多次提升。
"title_author":{"type":"text","similarity":"boolean"}
如果您对此映射运行查询,则无论该单词出现的时间长短,它都只会提升一次。您可以详细了解相似之处here
仅适用于ES版本5.4及以上版本