我是elasticsearch的新手。我玩了一下,有点恼火,在搜索一个搜索短语时,包含略有不同拼写的文档与包含确切单词的文档得分相同。
这是我的搜索查询(在PHP中):
$params = [
'index' => 'twitter',
'type' => 'tweet',
'body' => [
'query' => [
'match' => [
'message' => [
'query' => 'triing',
'type' => 'phrase',
'fuzziness' => '2'
]
]
]
]
];
这就是结果:
首先几乎适合:
[_index] => twitter
[_type] => tweet
[_id] => 2
[_score] => 0.15342642
[_source] => Array
(
[user] => kimchy
[postDate] => 2016-06-01T11:54:10.285Z
[message] => trying out Elasticsearch
)
第二个确切的拟合:
[_index] => twitter
[_type] => tweet
[_id] => 3
[_score] => 0.15342641
[_source] => Array
(
[user] => kimchy
[postDate] => 2016-06-01T17:56:46.957Z
[message] => triing out Elasticsearch
)
他们为什么得分相同? (实际上确实甚至略少!!!)
我怎么能在几乎完全相同的情况下支持?我如何支持几乎精确到略微不那么精确? (取决于“距离”)
答案 0 :(得分:1)
默认情况下,弹性搜索(2.x)中的模糊性重写为top_terms_blended_freqs_N。使用tf / idf计算得分,其中使用的idf与使用具有最大频率的项计算的相同。 总之,编辑距离不会在评分中起作用。 您可以使用dis_max和should构建查询来实现上述结果,从而实现您的需求
示例:
"query": {
"bool": {
"disable_coord": true,
"should": [
{
"dis_max": {
"queries": [
{
"match": {
"message": {
"query": "triing",
"fuzziness": 2,
"fuzzy_rewrite": "constant_score",
"type": "phrase",
"boost": 1
}
}
},
{
"match": {
"message": {
"query": "triing",
"fuzziness": 1,
"fuzzy_rewrite": "constant_score",
"type": "phrase",
"boost": 2
}
}
}
]
}
},
{
"match": {
"message": "tiring"
}
}
]
}
}