【问题标题】:Elasticsearch fuzzy query - max edits doesn't work as expectedElasticsearch 模糊查询 - 最大编辑次数无法按预期工作
【发布时间】:2015-10-19 08:50:50
【问题描述】:

我最近在我们的搜索查询字符串中添加了“模糊运算符”和模糊查询设置以覆盖用户错误输入(例如 “zamestnanost”“zamestnani”

POST /my_index/_search
{
   "query": {
      "query_string": {
         "query": "+(content:zamestnanost~)",
         "fuzzy_prefix_length": 3,
         "fuzzy_min_sim": 0.5, 
         "fuzzy_max_expansions": 50
      }
   }
}

据我了解模糊查询设置,fuzzy_min_sim = 0.5 应允许 length(query)*0.5 编辑原始查询(在本例中为 6 编辑)。

但是,它甚至不匹配“更接近”的词(标记),例如

  • "zamestnani"
  • "zamestnany"

我有一种奇怪的感觉,它仍然只匹配索引中最大的单词。来自原始查询字符串的 2 次编辑(这是模​​糊查询中的默认编辑计数)。

我还对我的查询进行了解释,我认为结果支持这个假设。 _explanation 看起来像这样:

"_explanation": {
   "value": 0.057083897,
   "description": "sum of:",
   "details": [
      {
         "value": 0.023866946,
         "description": "weight(content:zamestnano^0.8 in 0) [PerFieldSimilarity], result of:",
         "details": [
            {
               "value": 0.023866946,
               "description": "score(doc=0,freq=4.0), product of:",
               "details": [
                  {
                     "value": 0.66062796,
                     "description": "queryWeight, product of:",
                     "details": [
                        {
                           "value": 0.8,
                           "description": "boost"
                        },
                        {
                           "value": 4.624341,
                           "description": "idf(docFreq=1, maxDocs=75)"
                        },
                        {
                           "value": 0.17857353,
                           "description": "queryNorm"
                        }
                     ]
                  },
                  {
                     "value": 0.036127664,
                     "description": "fieldWeight in 0, product of:",
                     "details": [
                        {
                           "value": 2,
                           "description": "tf(freq=4.0), with freq of:",
                           "details": [
                              {
                                 "value": 4,
                                 "description": "termFreq=4.0"
                              }
                           ]
                        },
                        {
                           "value": 4.624341,
                           "description": "idf(docFreq=1, maxDocs=75)"
                        },
                        {
                           "value": 0.00390625,
                           "description": "fieldNorm(doc=0)"
                        }
                     ]
                  }
               ]
            }
         ]
      },
      {
         "value": 0.03321695,
         "description": "weight(content:zamestnanos^0.9090909 in 0) [PerFieldSimilarity], result of:",
         "details": [
            {
               "value": 0.03321695,
               "description": "score(doc=0,freq=6.0), product of:",
               "details": [
                  {
                     "value": 0.7507135,
                     "description": "queryWeight, product of:",
                     "details": [
                        {
                           "value": 0.9090909,
                           "description": "boost"
                        },
                        {
                           "value": 4.624341,
                           "description": "idf(docFreq=1, maxDocs=75)"
                        },
                        {
                           "value": 0.17857353,
                           "description": "queryNorm"
                        }
                     ]
                  },
                  {
                     "value": 0.044247173,
                     "description": "fieldWeight in 0, product of:",
                     "details": [
                        {
                           "value": 2.4494898,
                           "description": "tf(freq=6.0), with freq of:",
                           "details": [
                              {
                                 "value": 6,
                                 "description": "termFreq=6.0"
                              }
                           ]
                        },
                        {
                           "value": 4.624341,
                           "description": "idf(docFreq=1, maxDocs=75)"
                        },
                        {
                           "value": 0.00390625,
                           "description": "fieldNorm(doc=0)"
                        }
                     ]
                  }
               ]
            }
         ]
      }
   ]
}

只有查询 "zamestnano""zemestnanos" 是使用模糊查询编辑创建的。

我理解模糊查询设置对吗?你能指出我的错误吗?

非常感谢您的每一个想法!

【问题讨论】:

    标签: elasticsearch fuzzy-search


    【解决方案1】:

    来自the documentation

    0.0..1.0

    [1.7.0] 在 1.7.0 中已弃用。 Elasticsearch 2.0 将删除对相似性的支持。使用公式转换为编辑距离:长度(术语)*(1.0 - 模糊度),例如,模糊度为 0.6,术语长度为 10 将导致编辑距离为 4。注意:在所有 API 中,除了Fuzzy Like This Query,最大允许编辑距离为 2

    仔细检查这一点的最简单方法是使用validate API:

    GET _validate/query?explain&index=my_index
    {
      "query": {
        "query_string": {
          "query": "+(content:zamestnanost~)",
          "fuzzy_prefix_length": 3,
          "fuzzy_min_sim": 0.5,
          "fuzzy_max_expansions": 50
        }
      }
    }
    

    这给出了这个结果:

       "explanations": [
          {
             "index": "test",
             "valid": true,
             "explanation": "+content:zamestnanost~2"
          }
       ]
    

    显示 ES 将在查询中使用的实际编辑距离:zamestnanost~2

    【讨论】:

    • 您好安德烈,感谢您的回复。这解释了我的模糊搜索的行为。有没有其他方法可以执行模糊搜索,与我的搜索词的距离大于 2 次编辑?
    • 根据文档,只有Fuzzy like this query允许超过2个。
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2016-11-01
    • 2012-03-21
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多