如何在Elasticsearch上省略空格

时间:2019-06-06 00:24:46

标签: elasticsearch tokenize

Elasticsearch noob在这里试图了解一些东西

我有这个查询

{
  "size": 10,
  "_source": "pokemon.name",
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "multi_match": {
            "_name": "name-match",
            "type": "phrase",
            "fields": ["pokemon.name"],
            "operator": "or",
            "query": "pika"
          }
        },
        {
          "multi_match": {
            "_name": "weight-match",
            "type": "most_fields",
            // I use multi_match because I'm not sure how can I change it to match
            "fields": ["pokemon.weight"],
            "query": "10kg"
          }
        }
      ]
    }
  }
}

问题是pokemon.weight在值和单位10 Kg之间有一个空格。因此,我需要忽略空格以与10kg

匹配

我试图更改令牌生成器,可悲的是它可以决定在哪里拆分但不能删除字符。无论如何,我不知道如何使用它,文档也不是很有帮助,它解释了理论,但没有解释如何使用。

谢谢!任何学习资源将不胜感激。

1 个答案:

答案 0 :(得分:3)

您需要使用char filter定义自定义分析器。在这里您将用space字符替换empty字符,以便在您的情况10g中生成的令牌变为10g。我在本地尝试过,对我来说很好。

奖金链接,用于了解analysis在ES中的工作方式以及使用char filters的自定义分析器的示例。

以下是我的自定义分析器,用于获取必需的令牌:-

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": [
            "\\u0020=>"
          ]
        }
      }
    }
  }
}

现在使用相同的分析器,它在令牌下方生成,我使用analyze api确认了该令牌。

端点:-http:// {{your_hostname}}:9500 / {{your_index_name}} / _analyzer

body:-

{
    "analyzer" : "my_analyzer",
    "text" : "10 g"
}

结果:-

{
    "tokens": [
        {
            "token": "10g",
            "start_offset": 0,
            "end_offset": 4,
            "type": "<ALPHANUM>",
            "position": 0
        }
    ]
}