用于'&'和'和'

时间:2015-12-02 13:35:02

标签: elasticsearch lucene

我想在ElasticSearch上构建搜索,但我对此感到困惑:

查询:

  • H和M
  • H&安培; M
  • H&中号

需要查找具有此变量值的文档:

  • H&安培; M

如何处理?

1 个答案:

答案 0 :(得分:0)

您应该使用Pattern Replace Char Filter并将其附加到您的分析仪上。

例如,这将是最小化的再现:

POST /hm
{
  "index": {
    "analysis": {
      "char_filter": {
        "my_pattern": {
          "type": "pattern_replace",
          "pattern": "(\\s+)?&(\\s+)?|(\\s+)?and(\\s+)?",
          "replacement": "and"
        }
      },
      "analyzer": {
        "custom_with_char_filter": {
          "tokenizer": "standard",
          "char_filter": [
            "my_pattern"
          ]
        }
      }
    }
  }
}

它会将&and替换为and周围的可选多个空格。现在,您可以通过运行以下语句来检查此分析器的工作原理:

GET /hm/_analyze?analyzer=custom_with_char_filter&text=h%26m
GET /hm/_analyze?analyzer=custom_with_char_filter&text=h %26 m
GET /hm/_analyze?analyzer=custom_with_char_filter&text=handm

所有这些都带来了同样的信号:

{
  "tokens": [
    {
      "token": "handm",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

这意味着无论何时您正在搜索其中任何一项:

  • HandM
  • H和M
  • H&安培; M
  • H&amp;中号

它会带来相同的结果。