ElasticSearch 中的半精确(完全)匹配

Semi-exact (complete) match in ElasticSearch

有没有办法在 ElasticSearch 中要求完全(虽然不一定完全)匹配?

例如,如果一个字段有术语 "I am a little teapot short and stout",我想匹配 " i am a LITTLE TeaPot short and stout! " 而不仅仅是 "teapot short and stout"。我试过术语过滤器,但这需要实际完全匹配。

如果您的 "not necessarily exact" 定义指的是 uppercase/lowercase 字母组合和标点符号(如您示例中的 !),这将是一个解决方案,不是太简单和明显的艰难:

映射:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_keyword_lowercase": {
          "tokenizer": "keyword",
          "filter": [
            "lowercase",
            "trim",
            "my_pattern_replace"
          ]
        }
      },
      "filter": {
        "my_pattern_replace": {
          "type": "pattern_replace",
          "pattern": "!",
          "replacement":""
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "text": {
          "type": "string",
          "analyzer": "my_keyword_lowercase"
        }
      }
    }
  }
}

这里的思路如下:

  1. 使用 keyword 分词器使文本保持原样而不被拆分为分词
  2. 使用 lowercase 过滤器去除混合 uppercase/lowercase 个字符
  3. trim 用于去除尾随和前导空格的过滤器
  4. 使用 pattern_replace 过滤器去除标点符号。这是因为 keyword 分词器不会对文本中的字符做任何事情。 standard 分析器会执行此操作,但 standard 也会按原样拆分文本

这是您将用于上述映射的查询

{
  "query": {
    "match": {
      "text": " i am a LITTLE TeaPot short and stout! "
    }
  }
}