【问题标题】:fuzzy search in elasticsearch different than fuzziness match booleanelasticsearch中的模糊搜索与模糊匹配布尔值不同
【发布时间】:2014-08-13 17:06:12
【问题描述】:

我试图弄清楚为什么以下查询会产生截然不同的结果。有人告诉我,根据本文档Found-fuzzy,模糊查询几乎不是一个好主意,所以我尝试使用带有模糊参数的匹配查询。它们产生截然不同的结果。我不确定这样做的最佳方法是什么。

我的示例是包含“蝙蝠侠”的电影标题。但是,用户键入“蝙蝠侠”(带有空格)。模糊查询应该找到蝙蝠侠是有道理的。它还应该找到像蜘蛛侠这样的其他变体,但我想现在没关系。 (不是真的,但是...)

所以模糊搜索实际上返回的结果比下面的匹配结果更相关。有什么想法吗?

--模糊:

{
  "query":{
    "bool":{
      "should": [
        {
        "fuzzy": {
           "title": {
             "value": "bat man",
             "boost": 4
           }
         }
        }      
      ], "minimum_number_should_match": 1
    }
  }
}

--匹配:

{
  "query":{
    "bool":{
      "should": [
        {
        "match": {
           "title": {
             "query": "bat man",
             "boost": 4
           }
         }
        }      
      ], "minimum_number_should_match": 1
    }
  }
}

编辑

我正在添加返回的示例。

首先,使用匹配查询不会返回任何内容,即使添加了很高的模糊度值(模糊度:5)

但我确实使用模糊查询获得了几个与“蝙蝠侠”相关的标题,例如“蝙蝠侠”或“蝙蝠侠归来”。

当我使用模糊搜索对“蝙蝠侠”进行多次模糊搜索时,这变得更加奇怪......如果我搜索我的“主演”字段,除了标题字段(主演包含演员列表),我获取 'jason bateman' 以及标题 'batman'。

{
    "_index": "store24",
    "_type": "searchdata",
    "_id": "081227987909",
    "_score": 4.600759,
    "fields": {
       "title": [
          "Batman"
       ]
    }
 },
 {
    "_index": "store24",
    "_type": "searchdata",
    "_id": "883929053353",
    "_score": 4.1418676,
    "fields": {
       "title": [
          "Batman Forever"
       ]
    }
 },
 {
    "_index": "store24",
    "_type": "searchdata",
    "_id": "883929331789",
    "_score": 3.5298011,
    "fields": {
       "title": [
          "Batman Returns"
       ]
    }
 }

目前为止最好的(仍然不是很好)

到目前为止,我发现最有效的方法是将两个查询结合起来。这似乎是多余的,但我还不能像另一个一样工作。所以,这似乎更好:

"should": [
{
  "fuzzy": {
    "title": {
      "boost": 6.0,
      "min_similarity": 1.0,
      "value": "batman"
    }
  }
},
{
  "match": {
    "title": {
      "query": "batman",
      "boost": 6.0
      ,"fuzziness": 1
    }
  }
}               
]

【问题讨论】:

    标签: solr lucene elasticsearch


    【解决方案1】:

    Elastic Search 分析文档并将其转换为术语,即实际搜索的内容(而不是文档本身)。两种查询类型之间的主要区别在于匹配查询在发送查询之前不分析查询文本。所以考虑下面的例子:

    在模糊搜索中搜索“蝙蝠侠”将首先标记该术语,然后进行搜索。所以它真正寻找的是“btmn”,它可能不会出现相同的匹配。一个很好的例子是 Jason Bateman 如何出现,因为姓氏被标记为 btmn 或类似的形式。

    有关搜索时分析文本字段的更多详细信息可以阅读http://exploringelasticsearch.com/searching_data.html#sec-searching-analysis

    在分析字段上执行搜索时,查询本身是 分析,将其与分析的文档相匹配 添加到数据库中。将单词减少到这些短标记规范化 文本允许快速有效的查找。无论您是在搜索 对于任何形式的“旱冰”,我们只是在内部寻找 “旱冰鞋”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2017-11-14
      • 2011-11-01
      • 2019-01-22
      • 1970-01-01
      • 2011-03-16
      相关资源
      最近更新 更多