弹性停止分析器和模糊搜索问题

Elastic stop analyzer and fuzzy search issue

我有索引和数据描述 here,而且我已经将分析器设置为 停止分析器。这很好用,因为当我尝试简单的搜索时 POST https:///serverURL/_search?pretty=true

{
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "Rebel the without"   }
 }
}

,服务器真的returns

            "title": "Rebel Without a Cause"

作为结果。

但是,当我尝试使用模糊搜索时

{
  "query": {
    "fuzzy": {
      "title": {
        "value": "Rebel the without"
      }
    }
  }
}

,结果为空。 这里到底发生了什么,模糊搜索是否以某种方式禁用了分析器?

Fuzzy query returns 个包含与搜索词相似的词的文档。

因为您没有为“标题”字段定义任何显式映射,它使用标准分析器,其中生成的标记将是:

{
  "tokens" : [
    {
      "token" : "rebel",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "without",
      "start_offset" : 6,
      "end_offset" : 13,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "a",
      "start_offset" : 14,
      "end_offset" : 15,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "cause",
      "start_offset" : 16,
      "end_offset" : 21,
      "type" : "<ALPHANUM>",
      "position" : 3
    }
  ]
}

模糊查询将为您提供与 wihoutcaserebe 等生成的令牌类似的搜索词的结果

GET /myidx/_search
{
  "query": {
    "fuzzy": {
      "title": {
        "value": "case"
      }
    }
  }
}

更新 1:

根据下面的评论,您可以使用match bool prefix query

{
  "query": {
    "match_bool_prefix": {
      "title": {
        "query": "Rebel the without"
      }
    }
  }
}

了解数据在 Elasticsearch 中的处理和存储方式对于了解此行为非常重要。因此,当您设置 stop 分析器时,您提供给系统的任何文本都会转换为标记列表,也就是 terms。此时 Elasticsearch 字段“不记得”您的原始文本(从技术上讲,它存储在 _source 字段中但未编入索引)并且只知道那些术语(每个术语加上它在原始文本中的位置,在您的case - rebel, without, cause) 然后将其存储在 倒排索引 中以供快速查找。

现在你 运行 fuzzy 查询 - 这是一个 term-level query 这意味着它适用于特定的 条款。相反,您必须使用 全文查询 ,例如 match:

POST /fuzz/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Reble without",
        "fuzziness": "AUTO"
      }
    }
  }
}