精确模糊搜索

时间:2015-11-29 19:08:50

标签: elasticsearch

我的设置:

我有一些名为“Apple”,“Apple delicous”的文件,......

这是我的疑问:

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

   }
}

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

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

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

2 个答案:

答案 0 :(得分:0)

这里有两个问题。

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

这将为&#34; apple&#34;提供更高的分数。而不是&#34; apple delicous&#34;

2)为了更好地理解fuzziness,您应该阅读thisthis条款。

来自文档

  

模糊参数可以设置为AUTO,从而产生   遵循最大编辑距离:

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

因此,fuzzy query没有为 app 返回 apple 的原因是fuzzinessedit distance之间的fuzziness为2单词,因为&#34; app&#34;只有三个字母的单词,{ "query": { "fuzzy": { "name": { "value": "app", "fuzziness": 2 } } } } 值为1.您可以通过以下查询获得所需的结果

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

我真的不建议使用此查询,因为它将返回奇怪的结果,上面的查询将返回 cap,arm,pip 以及许多其他单词,因为它们在编辑距离2内。

这样可以更好地查询

new Date

它将返回苹果。

我希望这会有所帮助。

答案 1 :(得分:0)

我认为,这将为您提供帮助。

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