我有一个使用以下弹性搜索自动填充查询的应用,允许用户根据产品名称及其替代名称搜索产品。
"query": {
"dis_max": {
"queries": [
{
"match": {
"name.autocomplete": {
"query": "p",
"analyzer": "autocomplete_search",
"boost": 3
}
}
},
{
"nested": {
"path": "alternate_names",
"score_mode": "max",
"query": {
"match": {
"alternate_names.name.autocomplete": {
"query": "p",
"analyzer": "autocomplete_search"
}
}
}
}
}
]
}
}
所有产品都有一个名称,但只有约10%的产品具有备用名称(存储为产品下的嵌套字段)。尽管我在名字上比较了替代名称上的匹配,我注意到有时在输入一个字母之后,它会在名字上的匹配上返回替代名称上的匹配。
在使用explain API进行一些挖掘之后,我发现这种情况正在发生,因为备用名称的文档频率计算使用了匹配文档的数量/文档总数(按预期方式)。但是,在这种情况下结果是不正确的,因为很多产品都有一个空的备用名称。因此,如果10%的产品包含以“p”开头的单词,并且10%的替代名称都有以“p”开头的单词,则查询认为备用名称上的匹配更具相关性,因为只有1%所有产品都有一个以'p'开头的替代名称。
我想知道是否有人遇到过这个问题,并且知道如何解决这个问题?理想情况下,我不想计算备用名称匹配的文档频率计算中的总文档计数的空替代名称的文档。或者,我可以在两个字段中使用相同的tf / idf计算,以便在特定单词的唯一性方面将替代名称视为其他名称。但是,我无法弄清楚如何做这些或这些事情。