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

时间:2015-01-10 01:40:50

标签: elasticsearch

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

例如,如果某个字段的字词为"I am a little teapot short and stout",我希望在" i am a LITTLE TeaPot short and stout! "上匹配,而不仅仅是"teapot short and stout"。我已尝试使用术语过滤器,但这需要实际完全匹配。

1 个答案:

答案 0 :(得分:1)

如果你的“不一定完全”的定义是指大写/小写字母组合和标点符号(如你的例子中的!),这将是一个解决方案,不是太简单和明显的难度:< / p>

映射

{
  "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过滤器删除混合的大写/小写字符
  3. trim过滤器用于删除尾随和前导空格
  4. 使用pattern_replace过滤器来摆脱标点符号。这是这样的,因为keyword标记生成器不会对文本中的字符执行任何操作。 standard分析器会执行此操作,但standard也将拆分文本,而您需要它。
  5. 这是您用于上述映射的查询

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