пользовательский анализатор, который разбивает токены на специальные символы и строчные / прописные буквы

Я пытаюсь написать собственный анализатор, который разбивает токен на специальные символы и преобразует его в верхний регистр перед индексированием, и я смогу получить результат, если буду искать также и в нижнем регистре.

например, если я даю data @ source - он должен заменить @ пробелом - любой специальный символ он должен заменить пробелом и дать мне результат, такой как источник данных.

Вот как я пытался реализовать.

PUT sound
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_char_filter"
          ],
          "filter": [
            "uppercase"
            ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",
          "pattern": "(\\d+)-(?=\\d)",
          "replacement": "$1 "
        }
      }
    }
  }
}


POST sound/_analyze
{
  "analyzer": "my_analyzer",
  "text": "data-source&abc"
}

Он хорошо разделяет жетоны, например -

{
   "tokens": [
      {
         "token": "DATA",
         "start_offset": 0,
         "end_offset": 4,
         "type": "<ALPHANUM>",
         "position": 0
      },
      {
         "token": "SOURCE",
         "start_offset": 5,
         "end_offset": 11,
         "type": "<ALPHANUM>",
         "position": 1
      },
      {
         "token": "ABC",
         "start_offset": 12,
         "end_offset": 15,
         "type": "<ALPHANUM>",
         "position": 2
      }
   ]
} 

Но если я ищу здесь строчные или даже прописные буквы, это не работает .. например:

GET sound/_search?text="data"

GET sound/_search?text="data"

GET /sound/_search
{
  "query": {
    "match": {
      "text": "data"
    }
  }
}

Если я буду искать по приведенным выше запросам, это не даст результата.


person Soundarya Thiagarajan    schedule 22.09.2016    source источник
comment
См. Этот ответ: stackoverflow.com/a/39662994/4604579   -  person Val    schedule 23.09.2016


Ответы (1)


Вам просто нужно использовать немного другой синтаксис для поиска:

GET sound/_search?q=data

GET sound/_search?q=data

POST sound/_search
{
  "query": {
    "match": {
      "NAME_OF_YOUR_FIELD": "data"
    }
  }
}

NAME_OF_YOUR_FIELD должно быть именем поля, в котором вы храните свои данные. Подробнее на сопоставить запрос здесь

person Ceilingfish    schedule 22.09.2016
comment
Привет, Ceilingfish - у меня все еще не работает! Я пробовал с теми вариантами, которые вы дали. - person Soundarya Thiagarajan; 23.09.2016
comment
/Downloads/elasticsearch-2.4.0/bin$ curl -XGET localhost: 9200 / sound / _search ? q = 'text' {заняло: 8, timed_out: false, _shards: {всего: 5, успешно: 5, не удалось: 0}, хиты: {всего: 0, max_score: null, хиты: [] }} Я не могу получить результаты с помощью GET. - person Soundarya Thiagarajan; 23.09.2016
comment
curl -XGET 'localhost: 9200 / sound / _search? pretty' - даже это не похоже работающий. - person Soundarya Thiagarajan; 23.09.2016