elasticsearch :使用 ngram 分析器时避免重复评分
elasticsearch : Avoid repetitive scoring when using ngram analyzer
假设我在文档包含 "hello" 和 "hello hello" 时搜索 "hello" 我希望 "hello" 获得更高的分数。
我正在使用 ngram 索引和搜索分析器。 (因为在其他情况下我真的需要这个)所以 "hello hello" 匹配了两次,因此显示为最佳结果。有什么办法可以避免这种情况吗?我已经尝试过字词查询、匹配短语查询、多重匹配查询,它们都得分 "hello hello" 更高。
我通过为文档添加一个重复的未分析(关键字)列来解决这个问题,并使用 bool 子句来增强术语查询。
var res = client.Search<MyClass>(s => s
.Query(q => q
.Bool(
b1 => b1.Should(
s1 =>s1
.Term(m=>m
.Field(f => f._DUPLICATE_COLUMN)
.Value("hello")
.Boost(1)
),
s1=>s1.Match(m => m
.Field(f => f.MY_COLUMN)
.Query("hello")
.Analyzer("myNgramSearchAnalyzer")
)
)
.MinimumShouldMatch(1)
)
)
);
假设我在文档包含 "hello" 和 "hello hello" 时搜索 "hello" 我希望 "hello" 获得更高的分数。
我正在使用 ngram 索引和搜索分析器。 (因为在其他情况下我真的需要这个)所以 "hello hello" 匹配了两次,因此显示为最佳结果。有什么办法可以避免这种情况吗?我已经尝试过字词查询、匹配短语查询、多重匹配查询,它们都得分 "hello hello" 更高。
我通过为文档添加一个重复的未分析(关键字)列来解决这个问题,并使用 bool 子句来增强术语查询。
var res = client.Search<MyClass>(s => s
.Query(q => q
.Bool(
b1 => b1.Should(
s1 =>s1
.Term(m=>m
.Field(f => f._DUPLICATE_COLUMN)
.Value("hello")
.Boost(1)
),
s1=>s1.Match(m => m
.Field(f => f.MY_COLUMN)
.Query("hello")
.Analyzer("myNgramSearchAnalyzer")
)
)
.MinimumShouldMatch(1)
)
)
);