如何在Elasticsearch中支持精确搜索匹配

时间:2016-06-02 13:44:26

标签: elasticsearch

我是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
    )
  1. 他们为什么得分相同? (实际上确实甚至略少!!!)

  2. 我怎么能在几乎完全相同的情况下支持?我如何支持几乎精确到略微不那么精确? (取决于“距离”)

1 个答案:

答案 0 :(得分:1)

默认情况下,弹性搜索(2.x)中的模糊性重写为top_terms_blended_freqs_N。使用tf / idf计算得分,其中使用的idf与使用具有最大频率的项计算的相同。 总之,编辑距离不会在评分中起作用。 您可以使用dis_maxshould构建查询来实现上述结果,从而实现您的需求

示例:

 "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"
                }
            }
         ]
      }
   }