【问题标题】:Exact and fuzzy search精确和模糊搜索
【发布时间】:2020-08-20 22:24:26
【问题描述】:

我的设置:

我有一些文件名为“Apple”、“Apple delicous”……

这是我的查询:

GET p_index/_search
{
   "query": {
       "bool": {
       "should": [
          {"match": {
             "name": "apple"
          }},
          { "fuzzy": {
            "name": "apple"
          }}
       ]
       }

   }
}

我想要实现,首先显示完全匹配,然后显示模糊匹配:

  1. 苹果
  2. 苹果好吃

其次,我想知道如果我在搜索中只输入应用程序,我没有得到任何结果:

GET p_index/_search
{
   "query": {
       "bool": {
       "should": [
          {"match": {
             "name": "app"
          }},
          { "fuzzy": {
            "name": "app"
          }}
       ]
       }

   }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    这里有两个问题。

    1)要给完全匹配更高的分数,您可以尝试像这样将"index" : "not_analyzed" 添加到您的name 字段中。

    name: {
        type: 'string',
        "fields": {
            "raw": {
                "type": "string",
                "index" : "not_analyzed" <--- here
            }
        }
    }
    

    之后您的查询将如下所示

    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "name": "apple"
              }
            },
            {
              "match": {
                "name.raw": "apple"
              },
              "boost": 5
            }
          ]
        }
      }
    }
    

    这将使带有“apple”的文档得分高于“apple delicous”

    2)为了更好地理解fuzziness,您应该阅读thisthis的文章。

    来自文档

    fuzziness 参数可以设置为 AUTO,这会导致 以下最大编辑距离:

    • 0 表示一个或两个字符的字符串
    • 1 表示三个、四个或五个字符的字符串
    • 2 表示超过五个字符的字符串

    所以,您的 fuzzy query 没有为 app 返回 apple 的原因是因为 fuzzinessedit distance 在这些词之间是 2 并且因为“app”只是三个字母的单词,fuzziness 的值为 1。您可以通过以下查询获得所需的结果

    {
      "query": {
        "fuzzy": {
          "name": {
            "value": "app",
            "fuzziness": 2
          }
        }
      }
    }
    

    我真的不推荐使用这个查询,因为它会返回奇怪的结果,上面的查询将返回 cap、arm、pip 和很多其他词,因为它们在编辑距离 2 内。

    这样查询会更好

    {
      "query": {
        "fuzzy": {
          "name": {
            "value": "appl"
          }
        }
      }
    }
    

    它会返回苹果。

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我想,这会对你有所帮助。

      {"query":{"bool":{"must":[{"function_score":{"query":{"multi_match":{"query":"airetl","fields":["brand_lower"],"boost":1,"fuzziness":Auto,"prefix_length":1}}}}}]}}
      

      【讨论】:

      • 能否请您缩进您的 JSON 查询以使其可读
      猜你喜欢
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 2012-04-30
      • 2019-01-11
      • 2018-05-04
      • 2016-03-15
      • 2020-03-15
      相关资源
      最近更新 更多