Как искать, пропуская пропуски наasticsearch - PullRequest
2 голосов
/ 06 июня 2019

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 Ответ

3 голосов
/ 06 июня 2019

Вам необходимо определить пользовательский анализатор с char filter.где вы замените символ space символом empty, чтобы токены, сгенерированные в вашем случае 10 и g, стали 10g.Я попробовал это локально и работал нормально для меня.

Бонусные ссылки для понимания того, как анализ работает в ES, и пример пользовательского анализатора с фильтрами символов .

Ниже приведен мой пользовательский анализатор для получения требуемых токенов: -

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

Теперь, используя тот же анализатор, он сгенерировал ниже токена, который я подтвердил с помощью analysis api.

Конечная точка: - http://{{your_hostname}}:9500/{{your_index_name}}/_analyzer

тело: -

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

Результат: -

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